Десятка самых-самых Докучаев Дмитрий 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-код. |