Исследование, представленное на конференции IEEE-ISTAS 2025, показало, что итеративная генерация кода с помощью ИИ приводит к нелинейному накоплению уязвимостей безопасности. Авторы взяли 10 образцов кода без известных уязвимостей и применили к ним четыре стратегии улучшения: добавление функционала, оптимизация, улучшение безопасности и «размытые» просьбы сделать код лучше. Каждая стратегия применялась 10 раз, в результате было получено 400 образцов кода, которые анализировались вручную и автоматическими сканерами.

Ключевой результат: чем больше итераций, тем больше уязвимостей создает модель. Наибольшее количество уязвимостей (158) возникало при стратегии добавления функционала, наименьшее (38) — при стратегии улучшения безопасности. Это означает, что даже когда разработчик явно просит исправить уязвимости, LLM создает новые, часто более скрытые. Исследователи также обнаружили положительную корреляцию между сложностью кода и количеством уязвимостей: на каждые 10% увеличения сложности наблюдалось в среднем 14,3%-ное увеличение числа уязвимостей (95% доверительный интервал: 10,7% – 17,9%). Множественный регрессионный анализ подтвердил, что сложность остается значимым предиктором даже при контроле стратегии промптинга.

СтратегияКоличество уязвимостей
Добавление функционала158
Оптимизация
Улучшение безопасности38
Размытые просьбы

Конкретные примеры иллюстрируют деградацию. В одном случае безопасная функция выделения памяти под влиянием запросов на эффективность последовательно теряла проверку границ, затем внедряла небезопасные шаблоны повторного использования памяти, а к 10-й итерации реализовывала сложную арифметику указателей с рисками переполнения буфера. В другом примере безопасная функция проверки токена аутентификации после запросов на добавление функционала обзавелась кэшированием с уязвимостями побочных каналов, поддержкой нескольких протоколов с проблемами парсинга, постоянным хранилищем с рисками SQL-инъекций и, наконец, сложной многофакторной аутентификацией с логическими ошибками в механизмах отката.

Наибольшее число уязвимостей (158) возникало при добавлении функционала, наименьшее (38) — при запросах на улучшение безопасности.

Исследователи отмечают, что 27% итераций с фокусом на безопасность приводили к чистому улучшению, но только на ранних этапах (итерации 1–3). Эти улучшения включали добавление проверки входных данных, корректную обработку ошибок и проверки на NULL. Однако на поздних итерациях новые, более скрытые уязвимости нивелировали эти улучшения, что приводило к чистому снижению безопасности.

Для практикующих разработчиков это означает, что полагаться на ИИ для долгосрочного сопровождения кода рискованно: каждая итерация может незаметно ухудшать безопасность. Рекомендуется сочетать ИИ-генерацию с регулярным ревью кода и автоматизированным сканированием уязвимостей, особенно на поздних этапах разработки.