Анализ одной уязвимости в Flash

Томас Пташек (Thomas Ptacek) анализирует нечеловеческий эксплоит Марка Доуда (Mark Dowd), использующий уязвимость в Flash.

Эксплоит использует целочисленное переполнение, возникающее из-за того, что Flash runtime использует знаковое число, прочитанное из SWF файла, как беззнаковый размер выделяемого блока памяти. В итоге Flash пытается выделить несколько гигабайт памяти, получает в ответ NULL, но не проверяет его, а пишет 32-х разрядное число по смещению от полученного нулевого указателя. Марк вычислил, что если смещение X превышает 0x80000000 и при этом X+4 делится без остатка на 12, то результирующий адрес получается валидным. Записываемое 32-х битное значение получается из исходного 16-ти разрядного числа вычитанием значения еще одной переменной. Иными словами, ни указатель, ни записываемое значение не контролируются хакером полностью.

Тем не менее…

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

Тем не менее…

Для повышения производительности Flash runtime использует два немного отличающихся набора проверок. Первый используется при загрузке кода, а второй во время выполнения программы. Запись 32-х разрядного числа по смещению от нулевого указателя может изменить таблицу длин байт-кодов, что делает некоторые байт-коды длиннее, вводя в заблуждение загрузчик кода. В тоже время интерпретатор выполняет все инструкции, в том числе и те, что спрятаны хакером внутри ставшими вдруг длинными (с точки зрения загрузчика) байт-кодов! Если бы только не одна сложность. Код, добавленный хакером, не должен менять поведение оригинального кода, иначе это будет не троянский конь, а слон в посудной лавке.

Тем не менее…

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

Кроме того, этот эксплоит работает под IE и Firefox, не смотря на разные версии Flash, которые использую эти браузеры. И наконец, он работает и на Vista, так как Flash не использует ASLR.

PS: Охренеть, простите за мой французский.

comments powered by Disqus