Т При проектировании программы всегда оценивайте ее с точки зрения безопасно-
сти. К сожалению, зачастую программы создаются наспех, чтобы успеть к уста-
новленному сроку. В таких ситуациях безопасность — это последнее, о чем дума-
ют разработчики. При этом поставщики программного обеспечения даже не бес-
покоятся о том, чтобы своевременно устранять изъяны по мере их обнаружения.
Более подробная информация по этому вопросу приведена в разделе Secure UNIX
Program
по
адресу
http:
//www.whitefang.com/sup/index.html.
Ш
Рассмотрите возможность использования безопасного компилятора, такого, на-
пример, как StackGuard из набора средств
Immunix
(http://immunix.org/),
разрабатываемого в рамках проекта, поддерживаемого компанией
WireX
Com-
munications, Inc. В этом компиляторе используется подход, заключающийся в
"вакцинации" программ во время компиляции, что позволяет свести к мини-
муму риск возникновения переполнения буфера. Кроме того, к механизмам
защиты
относится
динамическая библиотека libsafe
(http:
//www.avaylabs.-
com/project/libsafe/index.html),
предназначенная для перехвата вызовов
уязвимых функций на уровне операционной системы. Более подробную ин-
формацию о функциональных возможностях libsafe, а также о механизме пере-
полнения буфера можно получить по адресу
http://the.wiretapped.net/
security/host-security/libsafe/paper.htmltfsec:exploit.
Помните о
том, что подобные механизмы нельзя рассматривать как "серебряную пулю",
так что при их использовании все же не стоит забывать о необходимости обес-
печения безопасности.
• Нужно проверять все аргументы, получаемые от пользователя или какой-либо
программы. Такая проверка, конечно, может замедлить работу некоторых при-
ложений, но это не очень высокая цена за безопасность. При проведении про-
верки особое внимание необходимо уделять принадлежности используемых
значений корректным диапазонам, особенно для переменных окружения.
• Используйте безопасные процедуры, такие как
fget(),
strncpyO
и
strncat
()
и проверяйте коды возврата системных вызовов.
• Уменьшите количество кода, запускаемого с привилегиями root. Этого можно
достичь за счет минимизации использования программ, которым требуются
права SUID суперпользователя. Если даже злоумышленнику удастся успешно
применить к такой программе атаку с переполнением буфера, то ему все равно
придется повышать полученные привилегии до уровня root.
А И наконец, применяйте все модули обновления, предоставляемые поставщиком
программного обеспечения.
Тестирование и аудит каждой программы
Очень важно выполнять тестирование и аудит каждой программы. Часто случается,
что программисты даже не задумываются о том, может ли в их программе возникнуть
ошибка переполнения буфера. Однако всегда найдется кто-нибудь, кто не только
задумается над этим, но и приложит все усилия для того, чтобы найти такие ошибки и
воспользоваться ими в своих целях. Одним из лучших примеров тестирования и аудита
кода UNIX является проект OpenBSD
(http://www.openbsd.org),
которым руководит
Тео де
Раадт
(Theo de Raadt). Программисты, работающие над проектом OpenBSD,
постоянно проверяют и перепроверяют исходный код друг друга и уже исправили сотни
ошибок, которые могут привести к переполнению буфера, не говоря уже о более
серьезных проблемах, имеющих отношение к безопасности. Именно из-за столь
грамотного подхода к тщательному аудиту, применяемого разработчиками OpenBSD, эта
операционная система заслужила репутацию одной из самых надежных из свободно
распространяемых версий UNIX.
Глава 8.
Хакинг
UNIX 339