Безопасное программирование
Безопасное программирование — методика разработки программного обеспечения, направленная на предотвращение случайного внедрения уязвимостей и обеспечение устойчивости к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной появления уязвимостей программного обеспечения.
Современные подходы к безопасному программированию включают применение риск-ориентированного подхода (в частности, в соответствии с приказом ФСТЭК № 117), который предполагает выстраивание защиты на основе актуальной модели угроз и оценки рисков, а не фиксированных наборов мер[1]. Важной частью методологии DevSecOps стало внедрение процессов непрерывного управления безопасностью приложений (ASPM) на протяжении всего их жизненного цикла.
С массовым распространением ИИ-ассистированной разработки (так называемого «вайб-кодинга») и автономных агентов методики безопасного программирования были адаптированы для защиты от новых векторов атак[2]. В рамках обеспечения безопасности цепочек поставок (Supply Chain Security) требуется защита не только традиционных зависимостей и конвейеров сборки, но и самих ИИ-моделей, серверов MCP и наборов данных[3].
Описание
Безопасное программное обеспечение — программное обеспечение, разработанное с использованием комплекса мер, направленных на недопущение появления и ликвидацию уязвимостей программы в соответствии с требованиями стандарта ГОСТ Р 56939-2024[4].
Задача безопасного программирования — защита данных пользователя от кражи и повреждения, а также сохранение контроля над системой. Небезопасная программа является потенциальной целью для злоумышленников, которые могут использовать уязвимости для просмотра, изменения или удаления информации, влияния на работу программ и сервисов, внедрения вредоносного кода в систему[5].
В соответствии с приказом ФСТЭК России № 117 (вступает в силу 1 марта 2026 года) расширена ответственность разработчиков и подрядчиков за безопасность создаваемого программного обеспечения[6][7].
Терминология
В англоязычной литературе встречаются два термина, которые могут быть переведены как «безопасное программирование»:
Оборонительное программирование — принцип разработки ПО, при котором разработчики стремятся учесть все возможные ошибки и сбои, максимально изолировать их и, по возможности, восстановить работоспособность программы при возникновении неполадок. Это делает программное обеспечение более стабильным и менее уязвимым. Пример аппаратной реализации этого принципа — сторожевой таймер, а также вычисление контрольных сумм для выявления ошибок при передаче данных[8].
Безопасное программирование — методика написания программ, устойчивых к атакам со стороны вредоносных программ и злоумышленников. Безопасное программирование позволяет защитить данные пользователя от кражи или порчи. Кроме того, небезопасная программа может предоставить злоумышленнику доступ к управлению сервером или компьютером пользователя, а последствия могут быть различны: от отказа в обслуживании одному пользователю до компрометации секретной информации, потери обслуживания или повреждения систем тысяч пользователей[5].
Важность
Вопросы обеспечения безопасности и работоспособности системы рассматриваются на этапах её проектирования[9]. Требования к безопасности продуктов и систем ИТ определяются из анализа существующих и прогнозируемых угроз, принятой политики безопасности, а также исходя из условий применения[10]. Внедрение решений по обеспечению безопасности после завершения разработки системы — дорогостоящий и сложный процесс. Поэтому рекомендуется учитывать требования к безопасности на всех этапах жизненного цикла системы[9]. На этапе проектирования для выявления потенциальных целей злоумышленников применяются современные методологии моделирования угроз, такие как STRIDE (категоризация угроз по шести типам) и PASTA (риск-ориентированная методология анализа угроз и атак)[11][12].
Информационная система подразделяется на физический и логический уровни. Понимание того, что именно требуется защищать, позволяет выбрать и применить подходящие защитные меры. Границы между уровнями определяются политикой безопасности, регламентирующей определённые объёмы информации и технологий. Иногда на одной машине могут находиться и общедоступные, и конфиденциальные данные, что влечёт наложение нескольких политик безопасности. Разработчики должны учитывать эти границы и отражать их в проектной документации и политиках безопасности[9]. Они обязаны уметь обеспечивать безопасность при проектировании, разработке, управлении, настройке, интеграции и тестировании[13].
Анализ и обеспечение безопасности — ресурсоёмкая задача, увеличивающая стоимость программного продукта. Если раньше ставили целью абсолютное устранение рисков, то сейчас ключевым становится анализ затрат и выгод от внедрения систем защиты. Иногда экономические последствия внедрения «жёстких» средств защиты могут не оправдать издержки. Следует учитывать не только прямые финансовые, но и, например, репутационные потери. Прямые расходы — это приобретение и внедрение технологии; косвенные — снижение производительности, дополнительное обучение персонала[14]. По данным 2026 года, стоимость исправления уязвимостей экспоненциально возрастает на поздних этапах разработки: если принять затраты на устранение дефекта на этапе проектирования за базовую единицу (1x), то на этапе разработки они увеличиваются примерно в 10 раз (10x), а на этапе эксплуатации — в 100 раз (100x)[15][16].
Принципы
Существует множество технологий разработки безопасного ПО, но есть универсальные принципы, учитываемые при любом подходе[17]:
- работоспособность и полезность;
- безопасность — защита от внешних угроз, атак и сохранение работоспособности после них;
- надёжность — устойчивое к ошибкам поведение при некорректных данных;
- конфиденциальность — безопасная работа с чувствительной информацией;
- целостность и корректность бизнеса — организация сопровождения, прозрачность и законность пользовательских действий.
Корпорация Microsoft для обеспечения этих требований продвигает «Инициативу по обеспечению безопасного будущего» (Secure Future Initiative, SFI), пришедшую на смену концепции «Вычисления, заслуживающие доверия». Новая инициатива опирается на три ключевых принципа: безопасность в дизайне (Secure by Design), безопасность по умолчанию (Secure by Default) и безопасность операций (Secure Operations)[18].
Обобщённо данные принципы отражают большинство подходов по обеспечению безопасности ПО[19].
В условиях массового применения инструментов искусственного интеллекта реализация принципа «безопасность в дизайне» (Secure by Design) базируется на подходе «нулевого доверия», при котором любой сгенерированный ИИ код по умолчанию рассматривается как ненадёжный внешний ввод, требующий тщательной проверки[20].[21] Для предотвращения «архитектурного дрейфа» и накопления уязвимостей бизнес-логики архитектурный анализ теперь требует обязательного человеческого надзора за общей структурой системы, а также применения семантического и кросс-файлового анализа[22].[21] Верификация логики кода включает анализ намерений и поведения для выявления скрытых дефектов, строгую персональную ответственность разработчиков за предложенные ИИ изменения (с обязательным код-ревью), внедрение автоматизированных барьеров безопасности в конвейеры CI/CD и жёсткий контроль зависимостей для защиты от внедрения злоумышленниками выдуманных пакетов (slopsquatting)[20].[23][22]
Классификация и виды уязвимостей
Классификаторы
Стандартизованные описания уязвимостей существенно упрощают работу специалистов по информационной безопасности. Существуют различные классификаторы[24]:
- CVE — словарь конкретных уязвимостей отдельных продуктов;
- CWE — база данных видов уязвимостей, с описаниями способов их предотвращения, обнаружения и исправления;
- SecurityFocus BID;
- OSVDB — открытая база, созданная тремя некоммерческими организациями. Прекратила работу 5 апреля 2016 года, блог продолжает функционировать;
- Secunia — лента уязвимостей компании Secunia (Дания) в области компьютерной и сетевой безопасности;
- IBM ISS X-Force.
Современные анализаторы кода и инструменты аудита используют подобные базы для проверки программ, что повышает доверие к продукту и облегчает подготовку отчётов для стандартов[24].
Метрики
Любая программа потенциально может стать целью атаки. Обнаружив уязвимость, злоумышленники используют её для кражи данных, порчи информации, управления системами[5]. Для оценки риска используется система CVSS — набор шкал, позволяющих назначать баллы угрозам и ранжировать приоритеты устранения[25][26][24]:
- базовая — свойства уязвимости, не зависящие от среды исполнения; описывает сложность эксплуатации и потенциальный ущерб;
- временная — учитывает временные факторы (например, наличие патча);
- контекстная — учитывает специфику среды применения.
Последние две метрики корректируют базовые показатели[26].
Виды уязвимостей
Примеры распространённых ошибок, приводящих к угрозам безопасности[27]:
- внедрение SQL-кода;
- уязвимости web-серверов (XSS, XSRF, расщепление HTTP запроса);
- уязвимости web-клиентов (DOM XSS);
- переполнение буфера;
- дефекты форматных строк[28];
- целочисленные переполнения;
- некорректная обработка исключений и ошибок;
- внедрение команд;
- утечка информации;
- ситуация гонки;
- слабое юзабилити[29];
- выполнение кода с завышенными привилегиями;
- хранение незащищённых данных;
- проблемы мобильного кода;
- слабые пароли;
- слабая генерация случайных чисел;
- неудачный выбор или использование криптографических алгоритмов;
- незащищённый сетевой трафик;
- неправильное использование PKI;
- доверие к механизмам разрешения имён.
Перечислить все уязвимости невозможно — ежеднедневно появляются новые. В приведённом списке — типовые ошибки, способные привести к серьёзным последствиям. Например, вспышку червя Blaster вызвала ошибка в двух строках кода[30].
Методы защиты и инструменты
Эффективная стратегия защиты — предотвращение ошибок и уязвимостей, что требует регулярной проверки входных данных. Например, средства защиты от атак переполнения буфера — контроль длины входных данных; перед добавлением в БД — проверка на внедрение SQL-кода; перед выводом на web-страницу — защита от XSS. Избыточные проверки усложняют разработку и могут привести к новым ошибкам, поэтому необходима их разумная комбинация[30].
Средства защиты могут предоставляться компилятором или операционной системой. Современные компиляторы, такие как GCC, Clang и MSVC, поддерживают широкий спектр механизмов безопасности. Для защиты от переполнения буфера применяются стековые канарейки (флаг -fstack-protector в GCC и Clang) и технологии теневого стека (аппаратная поддержка через -mshstk). Контроль целостности потока управления (CFI) обеспечивается как программными методами (-fsanitize=cfi в Clang, /guard:cf в MSVC), так и за счёт аппаратной поддержки, например Intel CET (-fcf-protection в GCC и Clang). Также во всех трёх компиляторах реализованы санитайзеры (AddressSanitizer, UndefinedBehaviorSanitizer, а в Clang — MemorySanitizer) для автоматического обнаружения ошибок работы с памятью и неопределённого поведения[31][30].
Современные операционные системы также внедряют защитные технологии, например ASLR (рандомизация адресного пространства) поддерживается в Linux и Windows. Также применяются неисполнимые стеки (W^X, PaX и др.)[30].
Для web-сервисов атаки типа SQL-injection, XSS, CSRF, clickjacking являются типовыми. Современные фреймворки значительно упрощают реализацию безопасных web-приложений, освобождая от необходимости ручных проверок данных и предоставляя более безопасные ORM-интерфейсы для работы с БД[32][33].
DevSecOps и автоматизация
Современные практики DevSecOps предполагают автоматизированную интеграцию инструментов безопасности на различных этапах конвейера CI/CD. Это позволяет выявлять уязвимости как на уровне исходного кода, так и в работающем приложении[34].[35] На ранних этапах разработки (при фиксации кода или сборке) применяется статический анализ (SAST), выявляющий уязвимости в исходном коде без его запуска (например, SQL-инъекции, XSS и переполнения буфера). На этапе сборки также интегрируется анализ состава программного обеспечения (SCA) для поиска известных уязвимостей (CVE), устаревших пакетов и проблем с лицензиями в сторонних библиотеках и open-source компонентах[36].[35] После успешной сборки и развёртывания в тестовой среде используется динамический анализ (DAST), направленный на поиск уязвимостей времени выполнения в работающем приложении, включая ошибки конфигурации и проблемы аутентификации[36].[35] Для анализа потоков данных изнутри работающего приложения в реальном времени внедряется технология интерактивного тестирования (IAST). Она работает через агенты инструментации (например, для JVM, .NET или Node.js) и обеспечивает высокую точность обнаружения угроз с указанием конкретной уязвимой строки кода[37].[38] Процессы безопасной разработки регламентируются стандартом ГОСТ Р 56939-2024, устанавливающим обязательные требования к инструментам автоматизации. Согласно стандарту, необходимо использовать системы управления изменениями и версиями, средства проверки правил кодирования и экспертизы кода, а также инструменты статического, динамического (включая фаззинг-тестирование) и композиционного анализа. Дополнительно требуется автоматизировать проверку безопасности используемых секретов и процессы реагирования на информацию об уязвимостях[39].
Безопасность цепочек поставок
В 2026 году атаки на цепочки поставок программного обеспечения (Supply Chain) и зависимости с открытым исходным кодом стали одной из главных угроз безопасности. За первые четыре месяца года было выявлено более 2500 вредоносных пакетов в реестре PyPI и свыше 2200 в npm. Злоумышленники внедряют вредоносный код в популярные пакеты, а также атакуют инфраструктуру CI/CD, подменяя доверенные теги и извлекая секреты из памяти процессов сборки[40]. Для защиты от подобных угроз применяется SBOM (англ. Software Bill of Materials) — структурированный перечень программных компонентов, содержащий детализированную информацию о составе программного обеспечения. В российской нормативной базе (согласно требованиям ГОСТ Р 56939-2024 и методикам ФСТЭК) SBOM должен представляться в машиночитаемом формате CycloneDX. Документ включает хеш-суммы компонентов, ссылки на репозитории и специфические метки, определяющие принадлежность компонента к поверхности атаки или функциям безопасности[41]. Современные инструменты анализа состава программного обеспечения (SCA) и анализа SBOM ориентированы на выявление «отравленных» пакетов (тайпсквоттинг) и проактивную блокировку угроз. Такие решения, как Xygeni, Aikido Security, Veracode SCA и Sonatype Lifecycle, обеспечивают поведенческое обнаружение вредоносного кода, анализ достижимости уязвимостей и автоматическую блокировку загрузки опасных компонентов до их попадания в конвейер разработки[42].[43]
Искусственный интеллект в разработке
Массовое применение искусственного интеллекта для генерации кода (так называемый «вайб-кодинг») привело к росту проблем с безопасностью. По данным исследований, к маю 2026 года количество обнаруженных уязвимостей в кодовых базах увеличилось на 70 %[44]. Среди основных рисков выделяются массовое тиражирование типовых ошибок (таких как SQL-инъекции, XSS и SSRF)[45], утечки конфиденциальных данных и API-ключей[46], а также уязвимость ИИ-агентов к промпт-инъекциям[47]. Высокая скорость генерации кода часто опережает возможности команд безопасности по его проверке, что способствует накоплению технического долга[45].
Для минимизации рисков методика безопасной разработки с использованием ИИ-ассистентов базируется на концепции «нулевого доверия» (Zero Trust) к сгенерированному коду[48]. Любой созданный алгоритмами код рассматривается как недоверенный ввод, требующий обязательного ревью человеком[49]. В процесс разработки внедряется непрерывное автоматизированное сканирование: статический анализ кода (SAST), анализ состава программного обеспечения (SCA) и сканирование секретов[50]. Эти проверки осуществляются на этапах коммита и создания запросов на слияние, дополняясь строгим контролем зависимостей и запретом на передачу реальных учётных данных в запросы к ИИ[49].
Ущерб
Информация о новых уязвимостях используется злоумышленниками для написания вирусов. Так, один из первых известных сетевых червей (червь Морриса) в 1988 году эксплуатировал переполнение буфера в Unix-демоне finger, что привело к заражению около 6000 машин[51]. По данным Счётной палаты США, экономический ущерб составил от 10 до 100 миллионов долларов.
В 2016 году компьютерные вирусы нанесли мировой экономике ущерб в 450 миллиардов долларов[52]. В последующие годы экономический ущерб от киберпреступности значительно вырос: по оценкам аналитических центров, в 2024 году он составил около 9,5 трлн долларов, в 2025 году — 10,5 трлн долларов, а в 2026 году этот показатель оценивается в сумму до 12,5 трлн долларов[53][54].
В 2017 году ущерб от вируса WannaCry оценили в 1 миллиард долларов. Заражения были зафиксированы как минимум в 150 странах[55][56]. Вирус использовал эксплойт EternalBlue, эксплуатировавший уязвимость в протоколе SMB, связанную с переполнением буфера[57][58][59][60].
Примечания
Литература
- Касперски К. Записки исследователя компьютерных вирусов. — СПб.: Питер, 2005. — 316 с. — ISBN 5469003310.
- ГОСТ Р 56939-2016: Защита информации. Разработка безопасного программного обеспечения. Общие требования. — Стандартинформ, 2016.
- ГОСТ Р ИСО/МЭК 25010-2015: Информационные технологии. Системная и программная инженерия. Требования и оценка качества систем и программного обеспечения (SQuaRE). Модели качества систем и программных продуктов. — Стандартинформ, 2015.
- ФСТЭК России. Руководящий документ. Безопасность информационных технологий. Критерии оценки безопасности информационных технологий. — 2002.
- Информационная безопасность бизнеса. Исследование текущих тенденций в области информационной безопасность бизнеса. — Лаборатория Касперского, 2014.
- Комаров А. Меряем уязвимости. // Журнал Хакер, 2009, №1, с. 48—51.
- Сафонов В. О. Современные технологии разработки надежных и безопасных программ. // Компьютерные инструменты в образовании, 2008, №1, с. 25—33.
- Вахрушев И.А., Каушан В.В., Падарян В.А., Федотов А.Н. Метод поиска уязвимости форматной строки. // Труды ИСП РАН, 2015, т. 27, №4, с. 23—38.
- Howard M., LeBlanc D., Viega J. 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them. — McGraw Hill Professional, 2009. — 464 p. — ISBN 9780071626767.
- Seacord R. C. Secure Coding in C and C++. — 2nd ed. — Addison-Wesley, 2013. — 600 p. — ISBN 9780132981972.
- Stoneburner G., Hayden C., Feringa A. Engineering Principles for Information Technology Security (A Baseline for Achieving Security). — National Institute of Standards and Technology, 2004.
- Wheeler D. A. Secure Programming HOWTO - Creating Secure Software. — 2015.
- Malware History. // BitDefender, 2010, с. 23—24.
- Howard M., LeBlanc D. Writing Secure Code. — 2nd ed. — Microsoft Press, 2002. — 512 p. — ISBN 9780735615885.
- Saltzer J.H., Schroeder M.D. The Protection of Information in Computer Systems. — 1975.
- Mell P., Scarfone K., Romanosky S. Common Vulnerability Scoring System. // IEEE Security & Privacy, 2006, т.4, №6, с.85—89.
- Net Losses: Estimating the Global Cost of Cybercrime. — McAfee, 2014. — [Архивировано из оригинала 24 октября 2017 года].
- Seacord R. C. The CERT C Secure Coding Standard. — Pearson Education, 2008. — 720 p. — ISBN 9780132702461.
- Long F. The CERT Oracle Secure Coding Standard for Java. — Addison-Wesley Professional, 2012. — 699 p. — ISBN 9780321803955.
Ссылки
- Мария Бондаренко. Ущерб от вируса WannaCry оценили в $1 млрд, РБК (25 мая 2017). Дата обращения: 28 июня 2024.
- Григорий Матюхин. Эксперты назвали рекордную сумму ущерба от вируса WannaCry, Hi-Tech Mail.ru (25 мая 2017). Дата обращения: 28 июня 2024.
- Роман Боровко. Экономический ущерб от вирусов, CNews Analytics (2003). Дата обращения: 28 июня 2024.
- Introduction to Secure Coding Guide (англ.). developer.apple.com. Apple Inc.. Дата обращения: 28 июня 2024.
- Security in Django (англ.). docs.djangoproject.com. Django Software Foundation. Дата обращения: 28 июня 2024.
- Ruby on Rails Security Guide (англ.). guides.rubyonrails.org. Дата обращения: 28 июня 2024.
- Luke Graham. Cybercrime costs the global economy $450 billion: CEO (англ.), CNBC International (7 февраля 2017). Дата обращения: 28 июня 2024.
- David Sun. Cybercrime cost world economy $620 billion last year (англ.), The New Paper (5 июля 2017). Дата обращения: 28 июня 2024.
- The damage from the virus WannaCry exceeded $ 1 billion (англ.), 6abc (25 мая 2017). Архивировано 15 октября 2017 года. Дата обращения: 28 июня 2024.
- William Gamazo Sanchez. MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver (англ.). trendmicro.com. Trend Micro (2 июня 2017). Дата обращения: 28 июня 2024.
- WannaCry ransomware used in widespread attacks all over the world (англ.). securelist.com. Лаборатория Касперского (12 мая 2017). Дата обращения: 28 июня 2024.
- M. Tim Jones. Defensive Programming (англ.) (1 февраля 2005). Дата обращения: 28 июня 2024. Архивировано 13 ноября 2017 года.
- OSVDB: FIN (англ.). blog.osvdb.org (5 апреля 2016). Дата обращения: 28 июня 2024. Архивировано 28 мая 2016 года.
- Common Vulnerability Scoring System v3.0: Specification Document (англ.). first.org. FIRST. Дата обращения: 28 июня 2024.
- ГОСТ Р 56939-2024 Защита информации. Разработка безопасного программного обеспечения. Общие требования. Росстандарт (24 октября 2024). Дата обращения: 27 августа 2026.