Введение

Методология разработки программного обеспечения

Защитное программирование – это подход к проектированию, направленный на разработку программ, способных обнаруживать потенциальные уязвимости и реагировать на них предопределенным образом. Оно обеспечивает непрерывную работу программного обеспечения в непредсказуемых ситуациях. Методы защитного программирования часто применяются в тех случаях, когда требуется высокая доступность, надежность или безопасность. Защитное программирование – это способ повышения качества программного обеспечения и исходного кода по следующим направлениям: общее качество – уменьшение количества ошибок и проблем в программном обеспечении; понятность исходного кода – исходный код должен быть читаемым и понятным для успешного прохождения аудита кода; предсказуемость поведения программного обеспечения – даже при неожиданных входных данных или действиях пользователя. Однако излишнее защитное программирование может защищать от ошибок, которые никогда не возникнут, что приводит к увеличению времени выполнения и затрат на сопровождение.

Наступательное программирование

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

Умное повторное использование исходного кода

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

Канонизация

Злоумышленники, вероятно, будут изобретать новые способы представления некорректных данных. Например, если программа пытается запретить доступ к файлу "/etc/passwd", злоумышленник может передать другой вариант имени этого файла, например "/etc/./passwd". Библиотеки канонизации могут быть использованы для предотвращения ошибок, возникающих из-за ненормализованного ввода.

Низкая терпимость к "потенциальным" насекомым

Предположим, что конструкции кода, кажущиеся проблемными (подобные известным уязвимостям и т.п.), являются ошибками и потенциальными уязвимостями в системе безопасности. Основное правило: "Я не знаю всех типов атак, поэтому должен защищаться от известных и проявлять инициативу!".

Другие советы по защите кода

Одной из наиболее распространенных проблем является бесконтрольное использование структур фиксированного размера или предварительно выделенной памяти для данных переменного размера, таких как входные данные программы (проблема переполнения буфера). Это особенно часто встречается при работе со строками в C. Функции C, такие как `gets`, никогда не следует использовать, поскольку максимальный размер входного буфера не передается в качестве аргумента. Функции C, такие как `scanf`, можно использовать безопасно, но это требует от программиста внимательного выбора безопасных строк формата и их очистки перед использованием. Шифруйте и аутентифицируйте все важные данные, передаваемые по сетям. Не пытайтесь разрабатывать собственные схемы шифрования, используйте проверенные решения. Проверка сообщений с помощью CRC или аналогичных технологий также поможет обеспечить безопасность данных, передаваемых по сети.