2016-11-11 2 views
4

Мир безопасности был ошеломлен новой технологией инъекции кода под названием «атомная бомбардировка» (см. Injection Attack Description и Information Security Stack Exchange Question). Проще говоря, злоумышленник может использовать таблицы атомов для хранения исполняемого кода.Итак, для чего предназначены таблицы Windows Atom?

Опасность состоит в том, что глобальная таблица атомов присутствует во всех версиях Windows и является преднамеренной функцией, а не ошибкой. Неясно, как смягчить угрозу посредством изменений в Windows.

Для чего используются таблицы атомов Windows? Если Microsoft просто сказала «вот и все, больше нет таблиц атомов», каково было бы воздействие?

+5

Они простые 'Словарь '. Один из многих трюков, которые Microsoft использовал для обувной игры операционной системы GUI и ее приложений в 640 КБ ОЗУ. Проведение 16-битного int намного дешевле, чем использование строкового литерала. Не имеет значения, что это фактически строка, любой кадр байтов будет делать. Это все еще просто данные. Использование этого метода не просто требует уже контроля над процессом, вам все равно придется превращать эти данные в код. Ошибка, которую Раймонд Чен любит [высмеивать] (https://blogs.msdn.microsoft.com/oldnewthing/20060508-22/?p=31283). –

+1

@HansPassant Это ответ, пожалуйста, напишите как таковой! – Marcel

+0

Хм, нет, я прохожу. Мне тоже было бы слишком весело. OP может самостоятельно выполнить Q + A. Или вы можете просто отметить комментарий как устаревший. –

ответ

5

TL; Я лично не думаю, что Microsoft внесет какие-либо изменения в таблицу глобальных атомов, поскольку это лишь незначительная проблема безопасности.


Атомная таблица позволяет связать строку с 16-разрядным номером. Вы даете Windows свою строку, и она возвращает вам номер. Затем вы можете восстановить строку снова, зная присвоенный номер.

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

Существует множество «глобальных» таблиц атомов, которые совместно используются всеми процессами в одном window station. 1 из них документирован и называется глобальной таблицей атомов. MSDN также достаточно хорош для tell us, что RegisterClipboardFormat и RegisterClass также используют свои собственные таблицы атомов внутри своей текущей реализации. Другие функции, такие как SetProp, также используют атомы, но нас интересует только таблица атомов, используемая эксплойтом, и атомы добавляются в эту таблицу с помощью функции GlobalAddAtom.

Основная цель этой таблицы атомов - действовать как простое место хранения, чтобы разные процессы могли связываться друг с другом в протоколе DDE. Когда процесс хочет отправить сообщение в окно в другом процессе, вы не можете отправить более 8 байтов (по 2 параметра, по 4 байта), и для этого недостаточно места для передачи пути файловой системы или URL-адреса.

Чтобы обойти это ограничение, приложение хранит строку/путь/URL в общедоступной глобальной таблице атомов, вызывая GlobalAddAtom. GlobalAddAtom возвращает номер, который приложение может отправить другому процессу. Когда другой процесс получает сообщение DDE, он просто передает номер функции GlobalGetAtomName для извлечения строки.

Как это относится к проблеме безопасности? Оказывается, что этот сверхъестественный (IMHO) эксплойт uses глобальная таблица атомов, чтобы сделать именно то, что была предназначена для таблицы; переносить строку из одного процесса в другой.

Чтобы внедрить код в другой процесс вы обычно называете OpenProcess, чтобы получить дескриптор нужного процесса, VirtalAllocEx выделить некоторую память в этом процессе, WriteProcessMemory заполнить эту вновь выделенную память с кодом и, наконец, CreateRemoteThread, чтобы начать выполнение этого код.

Эксплуатация в основном вызывает GlobalGetAtomName сложным способом (NtQueueApcThread), чтобы избежать использования WriteProcessMemory. Более впечатляюще, как он создает цепочку ROP и выполняет ее с помощью NtQueueApcThread, но это не связано с таблицей атомов, таблица атомов была просто необычным/умным способом передачи памяти.

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

Может ли Microsoft удалить таблицы атомов? Нет, на самом деле, другие таблицы слишком важны.

Могут ли они удалить глобальную таблицу атомов? Нет, не совсем, это документированный API и существует уже более 20 лет, и Microsoft не любит нарушать совместимость.

Они могли бы, однако, немного нейтрализовать глобальный стол атома. Они могут сделать его менее глобальным, разделив его на несколько отсеков на основе integrity level вызывающего процесса. Это не повлияет на этот эксплойт, поскольку он не может получить доступ к процессам с более высоким уровнем целостности в первую очередь.

Если мы притворимся, что Microsoft изменила таблицу глобальных атомов, чтобы она действовала как таблица для каждого процесса, что произойдет?

Microsoft начала отходить от DDE в Windows XP, но в Vista/7 ей стало намного серьезнее. На этой машине Windows 8.1 Internet Explorer по-прежнему использует DDE для команды «Открыть в том же окне», но это не является стандартным глаголом для файла .html. Найдите в реестре ddeexec, чтобы найти все приложения, которые используют DDE для обработки своих файловых ассоциаций. С яркой стороны файловая ассоциация DDE используется только тогда, когда экземпляр приложения уже открыт. В худшем случае; закройте приложение перед двойным щелчком на новом файле.

DDE также может использоваться для других целей, но трудно сказать, какие приложения и/или функции могут сломаться и как они сломаются.

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

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

Смежные вопросы