Читаем Linux API. Исчерпывающее руководство полностью

Привилегированная программа должна тщательно проверять любые данные, поступающие не из доверенных источников, прежде чем предпринимать на их основе какие-либо действия. Проверка может включать в себя подтверждение того, что все числа попадают в заданный диапазон и что строки имеют приемлемую длину и состоят из разрешенных символов. Данные, требующие проверки, могут поступать в виде файлов, создаваемых пользователями, аргументов командной строки, интерактивного ввода, CGI-ввода, почтовых сообщений, переменных среды, каналов межпроцессного взаимодействия (очереди типа FIFO, разделяемая память и т. д.), доступных недоверенным пользователям, или сетевых пакетов.


Избегайте необоснованных предположений о среде выполнения процесса

Программы, устанавливающие пользовательский идентификатор, не должны делать необоснованные предположения относительно исходной среды, в которой они выполняются. Например, стандартные потоки ввода, вывода или ошибок могут быть закрыты (это могла сделать программа, которая запустила ваше приложение). В этом случае при открытии файла можно случайно задействовать дескриптор с номером 1 (к примеру) и записывать данные в обычный файл вместо стандартного вывода.

Существует множество моментов, которые нужно учитывать. Например, процесс может исчерпать различные ограничения на ресурсы, такие как количество процессов, доступных для создания, процессорное время или размер файла. В результате этого могут завершиться неудачно разные системные вызовы, и вы можете получить разные сигналы. Злоумышленники, пытаясь взломать вашу программу, могут нарочно попытаться устроить такой сценарий.


38.9. Остерегайтесь переполнений буфера


Остерегайтесь ситуаций, когда входящее значение или скопированная строка превышают размер выделенного буфера. Никогда не используйте вызов gets() и будьте осторожны при работе с функциями scanf(), sprintf(), strcpy() и strcat() (например, применяйте инструкцию if, которая предотвращает переполнение буфера).

Переполнение буфера делает программу уязвимой к повреждению стека (англ. stack crashing) — это когда злоумышленник использует переполнение, чтобы разместить в блоке стека тщательно закодированные байты, принуждающие привилегированную программу выполнить произвольный код (эта методика описана на нескольких интернет-ресурсах; см. также [Erickson, 2008] и [Anley, 2007]). Переполнение буфера, вероятно, является наиболее распространенным источником проблем безопасности в компьютерных системах, судя по частоте их упоминаний в публикациях CERT (www.cert.org) и Bugtraq (www.securityfocus.com). Эта проблема является особенно опасной для сетевых серверов, так как она делает их уязвимыми к удаленным атакам из любой точки сети.

Чтобы усложнить задачу повреждения стека (в частности, чтобы сделать эту процедуру более затратной по времени, когда она проводится с удаленными сетевыми серверами), ядро Linux, начиная с версии 2.6.12, поддерживает рандомизацию адресного пространства (Address Space Layout Randomization, или ASLR). Эта технология случайным образом меняет местоположение стека в верхнем сегменте виртуальной памяти размером 8 Мбайт. Также случайные адреса могут выбираться для отображения в памяти, если ограничение RLIMIT_STACK не бесконечно, а файл /proc/sys/vm/legacy_va_layout (поддерживается только в Linux) содержит значение 0.

Более современные реализации архитектуры x86-32 предоставляют аппаратную поддержку маркировки таблиц памяти метками NX (no execute), которые предотвращают их выполнение. Эта технология не дает выполнять код программы в стеке, что делает повреждение стека еще более затруднительным.

Многие функции, упомянутые выше (например, snprintf(), strncpy() и strncat()), имеют безопасные альтернативы, позволяющие вызывающему процессу указать максимальное количество символов, которые должны быть скопированы. Они учитывают это ограничение и позволяют избежать переполнения заданного буфера. В целом эти альтернативы являются предпочтительными, но и их следует использовать осторожно. В частности, нужно учитывать следующие моменты.

• При достижении максимума большинство этих функций усекает исходную строку, помещенную в заданный буфер. Поскольку такое усечение может расходиться с семантикой программы, вызывающий процесс должен проверять, произошло ли оно (например, используя значение, возвращенное вызовом snprintf()), и при необходимости предпринимать соответствующие меры.

• Функция strncpy() может отрицательно сказаться на производительности. Например, если в вызове strncpy(s1, s2, n) длина строки, на которую указывает s2, меньше n байт, тогда недостающее место заполняется нулевыми символами, чтобы соблюсти указанную длину при записи.

• Если значения максимального размера, переданного функции strncpy(), не хватает для добавления в конце строки нулевого символа, итоговая строка не будет содержать в конце нулевой символ.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных