Безопасность — это процесс. Часть 2

Безопасность — это процесс. Часть 2

Продолжение. Начало в КГ № 45

Что такое переполнение буфера
Технология использования переполнения буфера (buffer overflow) стара как мир. Первое наиболее известное применение ее было в вирусе-черве Морриса в далеком 1988 году. Причем сам принцип не зависит от конкретной операционной системы. Как показала практика, везде можно найти уязвимый участок кода.
Сама по себе проблема хорошо известна программистам. Попытаемся рассмотреть ее более подробно с точки зрения специалистов самой Microsoft.
Для того чтобы произошло переполнение буфера, необходимо наличие многих факторов включая следующие:
• использование языка программирования, не обеспечивающего безопасность типов (non-type-safe), такого, как C/C++;
• доступ к буферу или копирование буфера небезопасным способом;
• размещение компилятором буфера в памяти рядом с критическими структурами данных.

Рассмотрим каждое положение более детально.
Переполнение буфера — прежде всего проблема C/C++, потому что в этих языках программирования не выполняется никаких проверок границ массива и проверок типов переменных. В результате такого подхода увеличивается скорость работы программы. Переполнение буфера существует и в других языках, но такие случаи редки. И если такая ошибка существует, то это обычно не ошибка разработчика, а скорее ошибка времени выполнения (run-time error).
Далее. Если программа берет данные от пользователя (или нападающего) и копирует их в свой буфер без проверки размера, то вы можете переполнить буфер.
Наконец, и это наиболее важный момент, буферы часто помещаются компилятором рядом с "интересными" структурами данных. Например, в случае вызова функции, которая имеет буфер в стеке, адрес возврата функции помещается в память после буфера. И если нападающий сможет переполнить буфер, он может записать поверх правильного адреса возврата свои данные, и возврат из функции произойдет по адресу, определенному нападающим. Другие интересные структуры данных включают v-таблицы C++, адреса обработчиков исключительных ситуаций (exception handler addresses), указатели на функции и т.д.
Дальше без рассмотрения конкретного учебного примера нам не обойтись.
Посмотрите, что неправильно в этом коде:
void CopyData(char *szData) {
char cDest[32];
strcpy(cDest,szData);
// использование cDest
...
}

Удивительно, но не может быть ничего неправильного в этом коде. Все зависит от того, как происходит вызов функции CopyData().
Например, следующий код безопасен:
char *szNames[] = {"Michael", "Cheryl","Blake"};
CopyData(szName[1]);

Этот код безопасен, потому что имена жестко закодированы, и точно известно, что длина любой строки не превышает 32 символа. Следовательно, запрос к strcpy всегда безопасен. Однако, если единственный аргумент для функции CopyData() поступает из ненадежного источника, такого, как сокет или файл, то strcpy будет копировать данные до тех пор, пока не встретит нулевой символ, и, если эти данные будут больше, чем 32 символа, то буфер cDest будет переполнен, и вся память выше буфера будет затерта, перезаписана. К сожалению, в этом случае затертые данные — это адрес возврата из функции CopyData(). А это означает, что, когда функция CopyData() закончит работу, программа продолжит выполнение из места, указанного нападающим. Это плохо.

Для предотвращения переполнения буфера специалисты из Microsoft рекомендуют:
• переносить приложения и инструментальные средства с родного Win32 C++ кода на управляемый код. Естественно, вы должны быть реалистами и не пытаться за один вечер переместить все ваши разработки с C++ на C# или другой язык.
• при написании кода на C/C++ вы должны обращать особое внимание на управление пользовательскими данными:
— требуйте, чтобы код передавал длину буфера;
— проверяйте передаваемые данные на допустимость значений;
— защищайтесь. Скажем, в вышеприведенном примере вместо strcpy используйте более безопасную функцию strncpy.
Итак, переполнение буфера успешно выполнено. Теперь задача хакера — внедрить в систему свой код, желательно, но не обязательно, переданный в той же строке. Эта задача не проста, но выполнима.
Если внедрить свой код не удалось, то найденная уязвимость отлично подойдет для организации DoS-атаки (отказ в обслуживании). Поскольку возврат из функции совершается на произвольный адрес, то программа или даже операционная система может аварийно завершиться, что и требовалось. Остается только подобрать длину буфера.

Новые уязвимости и защита
Итак, теперь мы владеем основами для того, чтобы лучше разобраться в сути стоящих проблем.

MS03-026: переполнение буфера RPC
Как уже упоминалось, в основе протокола RPC лежит другой протокол — OSF (Open Software Foundation) RPC. Используемый в Windows протокол RPC представляет собой расширенную версию последнего.
Одно из таких расширений, которое отвечает за обмен сообщениями по TCP/IP, является уязвимым местом. Обработка некорректно составленных сообщений может привести к сбою в работе системы. Это уязвимое место связано с интерфейсом DCOM, который ведет прослушивание портов RPC. Этот интерфейс обрабатывает запросы на активацию объектов DCOM, отправляемых клиентскими компьютерами на сервер, например, запросы путей в стандартном формате записи имен (UNC). Злоумышленник, которому удастся воспользоваться этим уязвимым местом, получит возможность запускать на компьютере пользователя собственный код от имени учетной записи "Локальный компьютер". Он сможет выполнять в системе любые действия, в том числе устанавливать программы, просматривать данные, изменять и удалять их, а также создавать новые учетные записи с полными правами.

Чтобы воспользоваться уязвимостью, злоумышленник должен направить на порты 135, 139, 445 или любой другой специально настроенный RPC-порт удаленного компьютера специальный запрос. Внутри локальной сети эти порты обычно открыты.
Защита: установить соответствующий патч. Прочтите об этом ниже в разделе про MS03-039.
Обратите внимание: система, исправленная патчем, выпущенным для уязвимости MS03-026, все еще остается незащищенной для уязвимости, объявленной в MS03-039 (об этом см. далее).

В качестве временного решения Microsoft в разных статьях предлагает:
• заблокировать UDP-порты: 135, 137, 138 и 445.
• заблокировать TCP-порты:
69 (TFTP), 135, 139, 445;
593 — используется RPC over HTTP End Point Mapper, эта служба нужна для работы RPC over HTTP;
4444 — используется удаленной командной оболочкой.
• отключить COM-службы Интернета (CIS) и RPC over HTTP, которые ведут прослушивание портов 80 и 443.
• кроме того, необходимо закрыть все остальные RPC-порты удаленного компьютера, которые, возможно, были специально настроены.

Для блокировки портов в Windows XP, Windows 2003 нужно использовать встроенные брандмауэры (файрволы). В операционных системах Windows 2000 и Windows NT отсутствует брандмауэр подключения к Интернету, поэтому предлагается воспользоваться фильтрами TCP/IP.
Для защиты обмена данными по сети между компьютерами под управлением Windows 2000 можно использовать протокол IPSec (Internet Protocol Security).

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

Для отключения DCOM запустите Dcomcnfg.exe, выберите закладку Свойства по умолчанию, снимите галочку с Разрешить использование DCOM на этом компьютере, нажмите кнопку Применить и OK. Dcomcnfg.exe облегчает установку значений по умолчанию в системном реестре, которые применяются ко всем приложениям на компьютере.

Также можно просто выполнить REG-файл следующего содержания:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole]
"EnableDCOM"="N"

либо выполнить команду (в одну строку):
reg add \\<hostname> \HKLM\ Software\Microsoft\OLE /v Ena-bleDCOM /t REG_SZ /d N /f

После этого необходимо перезагрузить компьютер.

Примечание: отключение DCOM на компьютере не имеет никакого воздействия на локальные COM-объекты. Даже если вы отключили DCOM, а пользователь имеет физический доступ к компьютеру, то он может запустить сервер при условии, если это явно не запрещено.
Список приложений (неполный), которые требуют DCOM или имеют проблемы при отключенном DCOM:
• Microsoft Access Workflow Designer.
• FrontPage с Visual Source Safe на IIS.
• BizTalk Server schedule client.
• Win95 требует Client for Microsoft Networks или DCOM, чтобы работать с MS SNA Server.
• Microsoft Exchange Conferencing Server.
• Dell entire Open Manage suite.
• Veritas Backup Exec, Network based backup.
• Citrix NFuse Elite.
• Sophos (Antivirus) Enterprise Manager.
• SMS 2.0.

Впервые бюллетень MS03-026 и соответствующее исправление в системе безопасности были выпущены корпорацией Microsoft 16 июля 2003 г. И, как всегда, проигнорированы многими системными администраторами. А уже 11 августа 2003 г. Microsoft начала исследование компьютерного червя, о котором сообщили службы поддержки продуктов Microsoft, а группа Microsoft Security Team выпустила соответствующее оповещение. Этот червь представляет собой компьютерный вирус, который обычно распространяется по сетям без участия пользователя и создает свои точные копии, иногда с небольшими изменениями. Он выполняет сканирование порта TCP 135 произвольного диапазона IP-адресов в поисках уязвимой системы.
Этот червь и его разновидности известны под именами W32.Blaster.Worm и W32.Lovsan.Worm. Отправленный в систему пользователя код загружает и запускает файл MSBLAST.EXE с удаленного компьютера по протоколу TFTP. После запуска червь создает в реестре следующий раздел:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run "windows auto up-date" = msblast.exe I just want to say LOVE YOU SAN!! bill
Уязвимым оказалось все семейство операционных систем на базе NT: Windows 2000, XP, 2003.
Признаки заражения этим вирусом следующие:
• наличие необычных файлов TFTP.
• появляются сообщения об ошибках: "Служба удаленного вызова процедур (RPC) неожиданно прервана. Система завершает работу. Сохраните результаты выполняемых задач и выполните выход из системы. Любые несохраненные изменения в данных будут потеряны. Это завершение работы инициировано пользователем NT AUTHORITY\SYSTEM".
• компьютер отключается или перезагружается через небольшие промежутки времени.
• в папке Windows\System32 имеется один из файлов с именем Msblast.exe, Nstask32.exe, Penis32.exe, Teekids.exe, Winlogin.exe, Win32sockdrv.dll или Yuetyutr.dll.

Некоторые способы защиты мы уже рассмотрели выше.

MS03-039: переполнение буфера в службе RPCSS может привести к запуску кода
10 сентября 2003 г. корпорация Microsoft опубликовала бюллетень MS03-39, посвященный обнаружению сразу трех серьезных уязвимостей в системе безопасности операционной системы Microsoft Windows, классифицируемых по шкале угроз компании как "критические" (Critical).
В который раз уязвимым опять оказалось все семейство операционных систем на ба-
зе NT.
Опубликованный в рамках данного бюллетеня патч устраняет уязвимость, описанную в распространенном ранее бюллетене MS03-026, а также три новых дефекта в системе безопасности Microsoft Windows. Два из них могут привести к запуску произвольного кода на пораженном компьютере, а один — к организации DoS-атаки. Первопричина уязвимостей кроется, как всегда, в ошибочной обработке неправильных пакетов.
RPCSS.EXE — это так называемый resolver/end-point mapper process, который выполняется прежде любых удаленных DCOM-запросов. RPCSS представляет собой Windows NT сервис, запускающийся при старте системы.

Для ликвидации угрозы необходимо скачать и установить соответствующие патчи.
Эти патчи заменяют собой исправления для MS03-26 и MS01-048.
Кроме того, остаются в силе все рекомендации по временной защите, приведенные в бюллетене MS03-26.
Чтобы убедиться, что в системе установлен необходимый патч:
• в Windows 2000 проверьте наличие ключа реестра
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Updates\Windows 2000\SP5\KB824146
• в Windows XP с установленным SP1 проверьте наличие ключа реестра
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Updates\Windows XP\SP2\KB824146
• в Windows 2003 Server проверьте наличие ключа реестра
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Updates\Window Server 2003\SP1\KB824146
Также можно воспользоваться специальными утилитами, о которых читайте далее.

Продолжение следует
Юрий Трофимов, mr.Root@tut.by



Компьютерная газета. Статья была опубликована в номере 46 за 2003 год в рубрике soft :: win

©1997-2024 Компьютерная газета