7 марта 2018 года владельцы шлемов виртуальной реальности Oculus Rift попали в крайне неприятную ситуацию. В один день их гаджеты внезапно перестали работать, выдав ошибку "Can’t Reach Oculus Runtime Service".



Как выяснилось, проблема возникла из-за истечения срок действия сертификата подписи кода для динамической библиотеки OculusAppFramework.dll, которая входит в состав Oculus Runtime Service. Она просто не загружалась. В файле указан срок истечения сертификата:

Valid to: ?Wednesday, ?March ?7, ?2018 01:00:00 PM

В данном случае сотрудники Oculus проявили полную некомпетентность. Дело даже не в том, что они забыли продлить сертификат, а в том, что файл был подписан некорректно. Они пренебрегли контрольной подписью от сервера штампов времени (timestamping server). Если бы они поставили эту подпись, то файлы были бы подписаны навсегда, потому что подпись от сервера штампов времени подтверждает валидность сертификата в момент подписи файла, так что в дальнейшем дату на сертификате можно не проверять. Но поскольку в Oculus пренебрегли этой подписью, то библиотека перестала загружаться в тот момент, когда истёк сертификат, то есть 07.03.2018 в 01:00:00 PM.

Подпись драйверов стала обязательной с версии Windows 10 build 1607. Драйверы без подписи просто не загружаются, за некоторыми исключениями (например, при отключенной опции Secure Boot или если файл подписан кросс-сертификатом, выданным до 29 июля 2015 года).

Как показало расследование, подпись от сервера штампов времени исчезла после апгрейда Oculus с версии 1.22 на 1.23, который состоялся чуть больше месяца назад. Причина произошедшего пока не ясна. Высказываются версии, что подпись могла не поставиться при автоматической сборке, если в этот момент времени сервер штампов времени был в дауне.

Компания в течение суток выпустила патч, заменяющий файл OculusAppFramework.dll в системе. Для запуска патча в операционной системе Windows нужно отключить антивирус (в Windows Defender достаточно перейти по ссылке More info и нажать кнопку Run Anyway). После установки патча Oculus Runtime Service обновляется с сервера — и шлем работает снова.

Патч появился утром 8 марта. То есть из-за этого, без преуменьшения, разгильдяйства сотрудников компании все шлемы Oculus Rift в мире вышли из строя почти на сутки. Таковы последствия одного неправильного сертификата подписи кода.

Сооснователь компании Нейт Митчелл принёс публичные извинения и пообещал раздать всем пострадавшим кредиты в Oculus Store на сумму 15 долларов.


Поначалу кредиты раздавали только тем, кто специально обратится за ними. Дело в том, что шлемы VR по-прежнему загружались в режиме Oculus Home, где можно совершать некоторые действия. Так что пострадавшими формально стали не все пользователи. Но позже появилось сообщение, что в течение семи суток кредиты должны начислить всем, кто установил обновление.

Какие выводы можно сделать из этой истории?

Пострадали тысячи пользователей. Из-за собственной оплошности и сама компания понесла ущерб, если она действительно начислила по $15 кредита значительной части пользователей Oculus Rift. Компании повезло, что она не получила судебные иски от крупных клиентов — ведь системы VR от Oculus используются и в корпоративном секторе: например, для проведения презентаций, промоакций и т. д. Один из клиентов сказал, что 6 марта их компания проводила большую презентацию для крупного бренда. Если бы проблема с сертификатом случилась на день раньше, то мероприятие пришлось бы отменить.

Другой пострадавший говорит, что их стартап уже несколько месяцев разрабатывал программное обеспечение для обучения хирургов в среде VR. На прошлой неделе они готовились провести презентацию на большой медицинской конференции, но шлемы Oculus Rift вышли из строя утром в день конференции. К счастью, один программист компании быстро разобрался в проблеме — и выяснил, что можно запустить программу, если откатить системные часы Windows на пару дней назад.

Единственный истёкший сертификат мог вылиться в более серьёзные финансовые убытки для Oculus, чем по 15 долларов кредита для всех пострадавших пользователей. Можно представить, что шлемы VR и другие устройства Интернета вещей распространятся повсеместно. Например, будут использовать в реальных хирургических операциях — и тут внезапно все одновременно выйдут из строя в один момент из-за подобной программной ошибки.

Невнимательность со сроком действия сертификата подписи кода — целиком вина Oculus, и никого иного. Если забыть прикрепить подпись от сервера штампов времени, то подписанные файлы фактически превращаются в «бомбу замедленного действия», которая взорвётся как только истечёт срок действия сертификата. Например, GlobalSign выдаёт сертификаты подписи кода сроком на 1, 2 и 3 года

Кто-то может спросить, зачем вообще устанавливать эту «бомбу замедленного действия» в своё программное обеспечение, то есть зачем подписывать код. Но иного выхода нет: таково требование Microsoft для определённых категорий файлов. Если исполняемый код под Windows подписан, то практически в любой момент можно «запретить» его выполнение на всех компьютерах. Это компромисс между свободой и безопасностью. В данном случае выбор сделан в пользу безопасности. Так что вина за подобные инциденты в каком-то смысле лежит и на корпорации Microsoft, которая создала «единую точку отказа» для защиты от инъекций кода.

Можно предположить, что в будущем такие инциденты будут происходить всё чаще, поскольку проверка подписи кода становится более тщательной из-за угроз безопасности, а ещё потому что разработчики операционных систем хотят получить процент прибыли от продажи программ через фирменные каталоги программ — и подталкивают всех разработчиков подписывать код. Для Microsoft это потенциальный источник дополнительного дохода в размере миллиардов долларов, какого она была лишена раньше.

Oculus не распространяется через Windows Store и не платит Microsoft 30% отчислений (по крайней мере, пока). Но для системных драйверов она обязана внедрить подпись кода для защиты от инъекции и гарантии сохранности оригинальных файлов. Хотя в конце концов Microsoft наверняка рассчитывает привлечь и Oculus, и всех остальных разработчиков в свой Windows Store.

Так или иначе, но у разработчиков практически не остаётся выхода. Приходится использовать сертификаты. Но в то же время нужно быть осмотрительным, чтобы избежать таких инцидентов, как у Oculus.

Комментарии (16)


  1. antonn
    14.03.2018 14:28

    Для запуска патча в операционной системе Windows нужно отключить антивирус (в Windows Defender достаточно перейти по ссылке More info и нажать кнопку Run Anyway).

    Какие смелые требования к установке патча…


    1. mayorovp
      14.03.2018 14:39

      В оригинале написано «Если антивирусное программное обеспечение не позволяет открыть файл, временно отключите его и продолжите. Не забудьте снова включить его, когда исправите ошибку.»

      Это не лишено оснований: скачанный из интернета файл, который первое что делает — заменяет библиотеку у системной службы, и правда может вызвать срабатывание каких-нибудь эвристик антивируса.


      1. antonn
        14.03.2018 15:58

        В мире множество дистрибутивов которые устанавливают, обновляют и удаляют драйвера устройств, и им вовсе не обязательно отключение антивируса. Замена службы должна довольствоваться лишь повышением прав (от «администратора»), но никак не отключением антивируса.


        1. DaemonGloom
          15.03.2018 05:59

          Вообще, там была речь про часть, которая называется Windows SmartScreen. Это не сам антивирус, просто его часть, которая исполняемые файлы из интернета без подписи помечает как небезопасные и спрашивает «А точно ли вы хотите запустить его?». Сам антивирус при этом не отключается.


          1. mayorovp
            15.03.2018 09:27

            Да нет, SmartScreen к антивирусам отношения не имеет. И про его обход говорилось в первом пункте, а в третьем речь шла именно про антивирусы.


          1. antonn
            15.03.2018 09:29
            -1

            Я привел цитату, в нем явно описано что требуется отключить, текст не я придумал:

            Для запуска патча в операционной системе Windows нужно отключить антивирус


            И как программист могу сказать, что нет никаких оснований оправдывать кодеров, которые не в состоянии сделать дистрибутив в рамках штатных средств ОС, так чтобы антивирус блокировал файл на запуск (эвристикой или меткой в файловом потоке), но при этом сам антивирус можно было бы отрубить. Чтобы запустить исполняемый файл скачанный из сети. Ага. И совершенно не важно что он будет делать (хоть службу заменять, хоть драйвер), для этого достаточно админских прав и их повышения в UAC. Если прогер не в состоянии это реализовать, то встает вопрос о всей поделке в целом.


            1. mayorovp
              15.03.2018 09:48

              Антивирусы со своими эвристиками способны ругаться даже на «Hello, world!».


              1. antonn
                15.03.2018 10:05
                -1

                Да, такое возможно, если в программу с «Hello world» напичкать пачками вызовы api требующих повышения привилегий, работой с сетью, и сверху запаковать UPX'ом (иногда даже достаточно только последнего). И тогда можно побузеть что антивирусы совсем распоясались, а можно подумать, что может все таки надо программу нормально написать, без извращений, которые не нужны в «Hello world». Процент ошибочной оценки антивирусом всегда есть, но он крайне мал, чтобы рекомендовать в статьях его отключение.


  1. ildarz
    14.03.2018 14:52

    зачем подписывать код

    таково требование Microsoft

    Серьезно, поэтому? Вот вожжа им под хвост попала, и потребовали?


    Если исполняемый код под Windows подписан, то практически в любой момент можно «запретить» его выполнение на всех компьютерах.

    Кто и как это может запретить?


    Так что вина за подобные инциденты в каком-то смысле лежит и на корпорации Microsoft, которая создала «единую точку отказа» для защиты от инъекций кода.

    Точку отказа ЧЕГО? И в каком месте она "единая"?


    разработчики операционных систем хотят получить процент прибыли от продажи программ через фирменные каталоги программ — и подталкивают всех разработчиков подписывать код.

    А как вообще связано желание получить процент прибыли с подписью? Логическую цепочку можете привести?


    Нет, спасибо, что в конце всё-таки написали — "обязана внедрить подпись кода для защиты от инъекции и гарантии сохранности оригинальных файлов", но и тут непременно надо было отметить, что MS хочет затащить всех в свой магазин, хотя по-прежнему неясно, какое отношение это желание имеет к цифровой подписи в целом и описываемой проблеме в частности.


    Это статья для публикации в "Комсомольской правде" или на техническом ресурсе?


    1. 14th
      14.03.2018 15:57
      +1

      > Точку отказа ЧЕГО? И в каком месте она «единая»?
      Поставьте на комп Crypto Pro версии примерно 3.6 и наблюдайте как в Windows перестаёт работать механизм проверки цифровых подписей у службы Windows update.


      1. ildarz
        14.03.2018 16:31

        А еще можно удалить загрузчик, и винда вообще грузиться не будет. Вопрос был не об этом.


      1. ildarz
        14.03.2018 18:30

        Для лучшего понимания для плюсующих это немного расшифрую, хотя вроде бы всё очевидно.
        Во-первых, если в винде перестают работать отдельные службы, а в целом система грузится и работает, это означает, что "единую точку отказа", где бы она ни была, вы явно не сломали, потому что цифровые подписи винда проверяет не только "у службы Windows Update".
        Во-вторых, и без всяких КриптоПро более чем понятно, что можно самыми разными способыми препятствовать работе как отдельных компонентов ОС, так и системы в целом. Пример настоящей "единой точки отказа" я даже привел. Равно как и ошибки собственно в самой винде могут привести к тому же самому. Но какое это имеет отношение к утверждению статьи о том, что MS, проверяя при загрузке драйверов их цифровые подписи, создает некую "единую точку отказа", в чем и "виновата"? :D В связи с чем "хотелось бы всё-таки услышать начальника транспортного цеха" (с) — что же это за появившаяся единая точка, много ли отказов она вызывает, и что именно отказывает и в каких ситуациях.


        1. 14th
          15.03.2018 09:17

          Протухнет аналогичным образом драйвер дискового контроллера — ОС не загрузится. А вот протух он сам или ему помогли — вот это интересный вопрос.


          1. ildarz
            15.03.2018 11:29

            А вот протух он сам или ему помогли — вот это интересный вопрос.

            А вы можете без намеков, прямым текстом, подробно раскрыть тему, почему этот вопрос такой интересный? Кто и с какой целью должен "помочь" этому драйверу протухнуть? Нет ли случайно у этого "кого-то" никак не связанных с цифровой подписью путей помочь в протухании? Сколько было подобных инцидентов за всё время, что в индустрии используются цифровые подписи? И, что еще интереснее, не открывает ли ОТСУТСТВИЕ цифровой подписи еще больше путей для вмешательства?


            1. 14th
              16.03.2018 10:18

              Вот Вам пример, того что наличие/отсутствие ЦП мало на что влияет:
              habrahabr.ru/company/globalsign/blog/350472.

              Более того, из заметки напрашивается вывод, что присутствие ЦП порождает новые проблемы и не решает старых.

              Опять же свидетельством имеющихся проблем, служит разброд и шатание: во всех браузерах (у каждого своя) в наличии системы валидации, независимые от ОС.


              1. ildarz
                16.03.2018 12:19

                Вы уже второй раз ссылаетесь на некие факты, не имеющие отношения к обсуждаемому вопросу. Забавно, что в этот раз — на статью в этом же блоге, в техническом плане по осмысленности не сильно превосходящую нынешнюю. Причем, если вы читали еще и дискуссию, то должны были заметить, что я комментировал и ее тоже.


                Краткий смысл проведенного в той статье эксперимента — "если написать новый троян и зашифровать его, то антивирусы его не обнаружат, а наличие любой ЦП снижает вероятность ложноположительных срабатываний маргинальных антивирусов". :) Почему это совершенно нормально, а также почему цифровая подпись или отсутствие таковой не имеет отношения к тому, является ли код вредоносным, объяснено в комментариях (и крайне печально, что крупная компания, чей бизнес лежит в сфере ИБ, не может объяснить это самостоятельно в статьях своего корпоративного блога, а вместо этого пишет какую-то лажу). Какое отношение всё это имеет к проверке цифровой подписи драйверов — непонятно.


                из заметки напрашивается вывод, что присутствие ЦП порождает новые проблемы

                У кого это вывод "напрашивается" и почему? Я уже третий раз прошу подробно рассказать про эти проблемы, без ссылок на нерелевантную информацию.


                Чтобы вам было легче объяснять, я еще раз напомню, зачем эта цифровая подпись нужна. Задача номер один — гарантировать, что файл не изменялся с момента подписания. Можете попробовать отдельно объяснить, какие дополнительные проблемы вызывает наличие такой гарантии. :D


                Задача номер два — определить лицо, подписавшее этот файл. Вот тут могут возникнуть нюансы.


                Нюанс номер раз — попытка выдать себя за другое лицо. Например, есть компания "AAA ltd.", поставляющая некий софт. Мы генерим вполне валидный сертификат с именем "ААА Itd." и обманом заставляем пользователей поверить, что файл исходит от первой компании. Очевидно, что эта проблема актуальна только при ручной валидации человеком, а это не тот случай, который мы обсуждаем.


                Нюанс номер два — скомпрометированные ключи или недобросовестный УЦ. Скажем, кто-то сопрет сертификат Броадкома и будет подписывать им модифицированные драйвера. В таком случае вредоносный код может действительно быть подписан априори доверенным сертификатом. Но тут перед нами встает вопрос — а ухудшает ли это ситуацию по сравнению со случаем, когда цифровой подписи нет вообще? И совершенно очевидный ответ — нет, не ухудшает. Потому что если бы подписи не было, у вас не было бы способа проверить валидность этого файла, и все равно пришлось бы доверять.


                Теперь посмотрим, что происходит, когда внезапно обнаруживается, что кто-то распространяет фальшивые драйвера условного Броадкома. Если у нас нет цифровой подписи, предпринять что-либо на уровне ОС практически невозможно. Если же драйвера подписаны скомпрометированным ключом, то проблема решается элементарно (и весь тот цирк с проверкой сертификатов в браузерах к этому не имеет никакого отношения, потому что поведение браузеров разработчик ОС контролировать не может и не должен, а вот проверка системных файлов — совершенно другой вопрос).