LLM генерируют уязвимый C/C++-код

Все рассчитывали, что LLM выдадут крепкий код, а заодно и свои ошибки сами поймают. Ха! 55,8% их C/C++-продукции — это кошмар для безопасности, невидимый для обычных чекеров.

LLM штампуют уязвимый C/C++-код — самопроверка тут бессильна — theAIcatchup

Key Takeaways

  • 55,8% кода на C/C++ от LLM содержит подтверждённые уязвимости безопасности — пик у GPT-4o на 62,4%.
  • Стандартные инструменты вроде CodeQL пропускают 97,8% этих дыр; только формальная верификация типа Z3 их вылавливает.
  • Самопроверка выявляет баги, но не останавливает генерацию небезопасного кода — вина на дефектных обучающих данных.

LLM генерируют уязвимый C/C++-код. Таков сенсационный вывод свежего исследования, которое ставит крест на иллюзиях разработчиков насчёт ИИ-ассистентов. Мы все повелись на хайп: впихнул промпт — выдал чистый, рабочий сниппет, готовый к продакшену. GPT-4o, Claude, даже open source-тяжи вроде Llama — они везде: в code review, прототипах, борьбе с бойлерплейтом. Но этот анализ, размахивая солвером Z3 SMT как скальпелем, вскрывает гниль под блеском.

Ожидания? Заоблачные. LLM рвали бенчмарки, плевались элегантным Python, отлаживались на лету. А C/C++ — этот низкоуровневый зверь, где один соскользнувший указатель может спалить сервер, — все думали, модели уже подросли. Ошибочка. 55,8% уязвимостей в 3500 образцах. GPT-4o впереди планеты всей — 62,4%. И вишенка: промышленные инструменты пропускают 97,8%.

Вот цитата, которая бьёт как stack smash:

Большие языковые модели (LLM) систематически генерируют C/C++-код, который хотя и синтаксически корректен, но по сути небезопасен. Строгий анализ с помощью формальной верификации на солвере Z3 SMT выявляет критический сбой: 55,8% сгенерированного LLM кода на C/C++ содержит подтверждённые уязвимости безопасности.

Жёстко.

Почему LLM не могут с безопасностью C/C++?

Дело не в лени моделей. Заглянем в архитектуру — проблема в обучающих данных, отравленных с порога. Миллиарды строк с GitHub, Stack Overflow, чёрт знает откуда. Реальный код? Полон переполнений буфера, неинициализированных переменных, гонок условий. LLM учат паттерны, а не инварианты. Они копируют синтаксис, поток, но пропускают суть: этот off-by-one в strcpy — не стиль, а лазейка для атакующих.

Самопроверка? 78,7% успеха в поиске багов. Впечатляет, да? Нет. Поиск — это поверхностно: «эй, этот цикл может переползти». Исправление? Забудьте. Генерация остаётся дырявой, потому что цель — беглость, а не доказательства безопасности. Как учить шефа на рецептах фастфуда, а потом требовать мишленовскую защиту.

А статические анализаторы? CodeQL, Semgrep, Cppcheck — они ловят известные шаблоны зла. LLM изобретают новые вкусы ада, тонкие нарушения инвариантов, которые Z3 вылавливает, моделируя все пути символически. Полгода ковырялись в 3500 артефактах от промптов вроде «реализуй безопасное копирование строки» или «парси не доверенный ввод». Бум — 1055 эксплойтов на лицо.

Как солвер Z3 сорвал все маски?

Формальная верификация — это не grep папаши. Z3 переводит C/C++ в логические ограничения, спрашивает: «Может ли индекс уйти в минус? Переполнение здесь?» Солвер перебирает пути, выдаёт свидетелей — точные входы, рушащие вечеринку. Переполнение буфера? Вот байтовая последовательность, перехватывающая управление.

Традиционные инструменты? Эвристики, правила. Пропускают системные осечки, вроде забытой проверки на null в архитектурно правильном, но смертельном коде. LLM идеальны в синтаксисе, проваливают семантику.

Моё мнение — угол, которого нет в бумаге: это эхо войн компиляторов C 1980-х. Тогда bounds checking не вшит; Morris Worm проскакал по переполнениям буфера в ARPANET. LLM? Современные заводчики червей, натасканные на вчерашние эксплойты, слепые к завтрашним защитам. История не повторяется, но рифмуется — в кремнии.

Это конец LLM-кодогенерации в реальных проектах?

Коротко: пока нет, но близко. Пайплайны с Copilot-подобными инструментами? Играете в рулетку на финтехе, IoT-контроллерах. Пол от 48% уязвимостей по моделям — без выбросов.

Нужен сдвиг. Дообучать на верифицированных датасетах (выводы Frama-C, не сырые репозитории). Внедрять оракулов вроде Z3 в циклы файнтюнинга. Воркфлоу? Генерация → Верификация → Итерация. Хватит «доверять ИИ».

Смелый прогноз: без этого LLM останутся игрушками для прототипов. Продакшен C/C++? Только люди + инструменты, или провал. Корпоративный PR зовёт это «возникающей способностью». Чушь — это мина с часовым механизмом, требующая предохранителей.

Промпт-инжиниринг не спасёт. «Пиши безопасный код» даёт те же дыры; моде

Priya Sundaram
Written by

Hardware and infrastructure reporter. Tracks GPU wars, chip design, and the compute economy.

Worth sharing?

Get the best AI stories of the week in your inbox — no noise, no spam.

Originally reported by dev.to