Не проходит и двух недель как в важном приложении, которое является частью
большинства дистрибутивов Linux, находят дыру в безопасности, позволяющую,
например, локальному пользователю стать root. Несмотря на отличное
качество большинства из этих приложений, обеспечить безопасность программы дело
сложное: она не должна позволять плохому парню незаконно пользоваться системными
ресурсами. Доступность исходного кода приложения - вещь хорошая, высоко
ценящаяся программистами, однако малейшие дефекты программы становятся видны
всем. Более того, обнаружение подобных дефектов происходит случайным образом и
люди, нашедшие их, не всегда имеют добрые намерения.
Для сисадмина каждодневная работа состоит в чтении списков, посвященных
проблемам безопасности, и немедленном обновлении пакетов, упомянутых в этих
списках. Программисту может быть полезным проверка подобных проблем
безопасности, так как избежание дыр в безопасности в начале - лучший способ
исправления их. Мы попытаемся определить некоторые "классические" опасные
поведения программ и дадим советы, как уменьшить риск. Мы не будем говорить о
проблемах сетевой безовасности, так как они часто возникают из-за ошибок в
конфигурации (небезопасные скрипты cgi-bin, ...) или из-за ошибок в системе,
позволяющих проводить атаки DOS-типа(Denial Of Service - отказ в
обслуживании), мешая машине принимать запросы от своих клиентов. Эти
проблемы - забота сисадминов и разработчиков ядра. Однако и программист
приложения должен защитить код, как только программа получает доступ к внешним
данным пользователя. Некоторые версии pine, acroread,
netscape, access,... имеют превышенный доступ к
информации или производят утечку информации при некоторых условиях. По существу,
безопасность программирования - забота каждого.
Данный цикл статей показывает методы, которые могут быть использованы для
повреждения Unix системы. Мы могли бы только упомянуть о них или сказать пару
слов, однако мы предпочитаем полное разъяснение, чтобы дать людям осознать риск.
Таким образом, при отладке программы или при разработке своей, вы сможете обойти
или исправить эти ошибки. При рассмотрении каждой дыры, мы будем придерживаться
одного подхода. Будем начинать с уточнения способа ее работы. Затем, мы покажем
как избежать ее. Для каждого примера мы будем использовать дыры в безопасности
до сих пор присутствующие в широко распространенном програмном обеспечении.
В данной - первой - статье рассказывается об основах, нужных для изучения дыр
в безопасности: знакомство с привилегиями и битами Set-UID и
Set-GID. Далее мы анализируем дыры основанные на функции
system(), так как они просты для понимания.
Мы будем часто использовать маленькие программы на Си, чтобы показать то, о
чем мы говорим. Однако подходы, описаные в данных статьях, применимы и к другим
языкам программирования: perl, java, скрипты shell... Некоторые дыры в
безопасности зависят от языка, однако это не всегда так, что мы и увидим при
рассмотрении system().