Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Десятка самых-самых

Докучаев Дмитрий aka Forb

Спецвыпуск Xakep, номер #045, стр. 045-040-2


– ядро собрано с поддержкой подключения внешних модулей;

– в кернеле доступно использование функции ptrace();

– загрузчик модулей доступен и на него стоит ссылка в /proc/sys/kernel/modprobe.

Допустим, что все три условия выполняются (в 99% случаев это так и есть). Зная, что кернел сам изменяет EUID, можно присоединить собственный процесс к уже существующему. При этом в стек загрузится shell-код, искусный бэкдор или другие вредные вещи.

Спустя год, когда о баге уже забыли, как о страшном сне, появилась еще одна напасть. Как всегда, программисты неэффективно пофиксили брешь. В итоге, если наплодить несколько процессов, к одному из них можно присоединить «левый» процесс. С вытекающими последствиями и командным shell’ом.

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

3. ASN.1 heap overflow

Данный баг появился не так давно. Бдительно проанализировав работу защищенной библиотеки MSASN1.DLL, входящей в секурный комплект ASN (Abstract Syntax Notation One), компания eEyes обнаружила шокирующую брешь. Ошибка в процессе ASN.1 декодирования позволяла хакеру перезаписать участок памяти и выполнить некоторый код. Если всмотреться в особенности работы библиотеки, то можно понять принцип бага: в протоколе существует некоторая функция, выделяющая блок памяти под данные. Ей передается необходимая длина этого блока. При этом юзер не может задать длину от фонаря: есть функции, проверяющие достоверность данных. eEyes нашла способ подставить такое значение параметра, при котором указатель на память «проедет» допустимое 32-битное адресное поле и занимает нулевую позицию (интервал длины от 0xFFFFFFFD до 0xFFFFFFFF). В противном случае мы получим простое целочисленное переполнение, результатом которого будет аварийное завершение атакуемой службы (именно по такому принципу работали DoS’еры для ASN.1). Если же все-таки поступить хитрым образом и сместить поинтер до нуля, можно вставить определенный код на определенную позицию памяти (которую атакующий, естественно, будет знать). В итоге, shell-код успешно выполнится, а служба будет функционировать в обычном режиме. Если тебя интерсуют подробности, топай на http://www.securitylab.ru/42702.html.

Уязвимость в ASN.1 признана securitylab'ом самым хитовым багом в Windows из-за того, что протокол используется не только в самих форточках, но и в приложениях Mozilla, Internet Explorer и в софте для IP-телефонии. Кстати, все новые эксплоиты для службы lsass.dll (а также процесс размножения червя Saccer) основаны на бреши в ASN.1.

4. do_brk() kernel overflow

Опять Linux и опять кернел. В конце ноября прошлого года обнаружилась брешь в ядре, через которую был произведен взлом нескольких крупных Debian-серверов. Как оказалось, параметры ядерной функции do_brk() не проверялись на размер. Это влекло за собой переполнение буфера. Технически это выглядит следующим образом: do_brk() работал напрямую с памятью, однако размер памяти, который может использовать обычный пользователь, контролировался, мягко говоря, не очень хорошо. В итоге, миновав участок пользовательского пространства, злоумышленник мог перезаписать зону памяти стороннего привилегированного процесса до кучи, выполнив собственный shell-код.

Назад на стр. 045-040-1  Содержание  Вперед на стр. 045-040-3