3,583 papers
arXiv:2607.23088 74 25 июля 2026 г. FREE

Security-Aware Prompting: явное указание требований безопасности при генерации кода снижает уязвимости

КЛЮЧЕВАЯ СУТЬ
Обнаружено: LLM пишет уязвимый код больше чем в половине случаев — не потому что не умеет иначе, а потому что ты просто забыл упомянуть про безопасность. Метод security-aware prompting позволяет снизить долю уязвимого кода на 37-45% одним доработанным промптом. Модель отлично знает best practices безопасности — она просто не достаёт их из памяти без явного триггера. Назови угрозы своими словами — SQL-инъекция, XSS, брутфорс — и модель переключится из режима "просто работает" в режим "работает с оглядкой на угрозы".
Адаптировать под запрос

TL;DR

Security-aware prompting — техника, при которой ты добавляешь в запрос на генерацию кода явный контекст безопасности (кто будет пользоваться, какие данные обрабатываются, какие угрозы актуальны), вместо того чтобы полагаться на то, что модель сама догадается о рисках.

Модели пишут уязвимый код больше чем в половине случаев — просто потому что пользователь забыл упомянуть про безопасность. Причём самый опасный случай не тот, где ты явно просишь что-то небезопасное (типа "отключи проверку сертификата"). Самый опасный — когда ты просто не сказал ничего про безопасность вообще: "сделай форму логина" без единого слова о защите пароля. Модель воспринимает молчание как разрешение не думать об этом.

Решение простое: явно проговаривай в промпте контекст размещения (публичный сервис или внутренний), какие данные обрабатываются, и какие меры защиты нужны. Это снижает долю уязвимого кода на 37-45%.


🔬

Схема метода

ШАГ 1: Опиши техническую задачу → что должен делать код
ШАГ 2: Укажи контекст → кто пользователи, публичный/внутренний доступ, какие данные
ШАГ 3: Явно перечисли требования безопасности → валидация, доступ, шифрование

Все три шага — в одном промпте, отдельных запросов не требуется.


🚀

Пример применения

Задача: Ты запускаешь MVP своего сервиса и просишь ChatGPT написать код для загрузки файлов пользователями (частая задача для нетехнического основателя стартапа, который сам пилит первую версию).

Промпт без учёта безопасности (рискованная версия):

Напиши код на Python (Flask) для загрузки файлов пользователями на сайт.

Промпт с учётом безопасности:

Напиши код на Python (Flask) для загрузки файлов пользователями на сайт.

Контекст: сервис публично доступен в интернете, загружать файлы может 
любой незарегистрированный посетитель. Файлы — изображения профиля, 
максимум 5 МБ.

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

Результат: Во второй версии модель добавит проверку MIME-типа, санитизацию имени файла и ограничения доступа — то, что в первой версии скорее всего пропустит, выдав код который "просто работает".


🧠

Почему это работает

Модель по умолчанию оптимизируется на "выполнить то, что попросили", а не на "сделать безопасно". Если ты не сказал про безопасность — для модели это не приоритет, она экономит внимание на явных требованиях.

Зато если контекст угроз проговорен явно — модель отлично знает best practices безопасности (валидация, санитизация, ограничение доступа). Проблема не в знаниях модели, а в том, что она не сама достаёт эти знания без явного триггера.

Security-aware prompting работает как триггер: ты переключаешь модель из режима "минимально работающий код" в режим "код с оглядкой на угрозы", просто назвав угрозы своими словами.

Рычаг управления: чем конкретнее ты называешь угрозы (SQL-инъекция, XSS, брутфорс), тем точнее модель фокусируется именно на них. Общие фразы типа "сделай безопасно" работают слабее, чем конкретный список угроз и контекста.


📋

Шаблон промпта

{техническая задача}.

Контекст: {кто пользователи — публичный доступ / внутренние сотрудники / 
доверенные партнёры}, {какие данные обрабатываются — персональные, 
платежные, обычные}.

Требования безопасности: {что нужно защитить — валидация входных данных, 
ограничение прав доступа, защита от конкретных угроз}. Если требование 
функциональности конфликтует с безопасностью — приоритизируй безопасность 
и explicitly скажи об этом в комментарии к коду.

Что подставлять: в {техническая задача} — что должен делать код. В {кто пользователи} — насколько сервис открыт внешнему миру, это сильнее всего влияет на уровень риска. В {требования безопасности} — конкретные угрозы, если знаешь, или общие категории (проверка данных, доступ, шифрование), если не знаешь.

🚀 Быстрый старт — вставь в чат:

Вот шаблон security-aware промпта для генерации кода. Адаптируй под мою 
задачу: {твоя задача с кодом}. Задавай вопросы про контекст и требования 
безопасности, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, кто будет пользоваться сервисом и какие данные обрабатываются — потому что без этого контекста невозможно выбрать нужные меры защиты. Она возьмёт структуру шаблона и подставит конкретику под твою задачу.


⚠️

Ограничения

⚠️ Конфликт безопасности и функциональности вредит методу: когда ты прямо просишь что-то, что противоречит безопасности ("отключи проверку сертификата для теста"), security-aware prompting работает хуже всего. В части случаев модель даже портит код, который был безопасным до добавления инструкций — примерно в каждом пятом случае.

⚠️ Метод снижает риск, но не убирает его: даже с усиленным промптом часть уязвимостей остаётся. Для кода, который пойдёт в продакшен с реальными пользователями, промпт — это дополнение к проверке, не замена ей.

⚠️ Проверялось на типовых сценариях: тестировали 9 языков программирования и распространённые типы уязвимостей. Для узкоспециализированных или нестандартных задач эффект может отличаться.


🔍

Как исследовали

Исследователи собрали 2700 тестовых промптов — три типа риска (неоднозначные требования, недосказанный контекст, конфликт функциональности и безопасности) на девяти языках программирования, по 50 пар промптов на каждую комбинацию. Каждая пара — "рискованная" версия промпта и её "безопасная" версия с добавленным контекстом.

Восемь топовых моделей (GPT-5, Claude, Gemini, DeepSeek, Qwen и другие) прогнали через оба варианта промптов, а получившийся код проверили статическими анализаторами и экспертной оценкой с помощью GPT-5 как ассистента ревьюера.

Результат: все модели написали уязвимый код в больше чем половине случаев на рискованных промптах. Добавление контекста безопасности снизило это на 37-45% в зависимости от модели.

Что удивило: сценарий с прямым конфликтом ("сделай то, что нарушает безопасность") оказался НЕ самым провальным — 52% уязвимостей. Хуже всего сработал сценарий, где про безопасность просто ничего не было сказано — 66% уязвимостей. Получается, явный конфликт хоть немного заставляет модель насторожиться, а тишина работает как молчаливое разрешение игнорировать риски.


🔗

Ресурсы

Rethinking Security in LLM Code Generation through Real-World Risk Scenarios, Lixun Ma, Ruolong Ma, Bei Wang, Feng Wei, Zhenguang Liu, Lorenzo Cavallaro, Wentao Chen — Zhejiang University, University College London, MetaX Integrated Circuit Co., CAICT.


📋 Дайджест исследования

Ключевая суть

Обнаружено: LLM пишет уязвимый код больше чем в половине случаев — не потому что не умеет иначе, а потому что ты просто забыл упомянуть про безопасность. Метод security-aware prompting позволяет снизить долю уязвимого кода на 37-45% одним доработанным промптом. Модель отлично знает best practices безопасности — она просто не достаёт их из памяти без явного триггера. Назови угрозы своими словами — SQL-инъекция, XSS, брутфорс — и модель переключится из режима "просто работает" в режим "работает с оглядкой на угрозы".

Принцип работы

Правило простое: молчание для модели = разрешение не думать о защите. Она работает как студент на экзамене — отвечает точно на заданный вопрос и ни словом больше. Не спросил про пароли — значит про пароли думать не надо. Чем конкретнее названа угроза, тем точнее модель бьёт именно в неё. Общее "сделай безопасно" почти не работает — работает конкретный список: какие данные, кто пользователи, чего боимся.

Почему работает

Модель настроена на "сделай то что попросили", а не на "сделай безопасно" — это её базовая настройка по умолчанию. Без единого слова про защиту пароля — уязвимый код в больше чем половине случаев. С явным контекстом угроз — минус 37-45% уязвимостей. Дело не в знаниях модели, а в том, что она не сама достаёт их из памяти без явного триггера. Есть и обратная сторона: если просишь что-то против безопасности — например, отключить проверку сертификата — метод портит даже изначально безопасный код примерно в каждом пятом случае.

Когда применять

Генерация кода → любая задача, где код тронет реальных пользователей или данные: формы логина, загрузка файлов, платежи, публичные API. Особенно критично, если ты нетехнический основатель и пилишь MVP сам, без ревью безопасника рядом. НЕ подходит как замена проверке безопасности перед продакшеном — это снижение риска, а не его отмена.

Мини-рецепт

1. Опиши задачу: что должен делать код — конкретно, без общих слов вроде "сделай нормально".
2. Назови контекст: кто пользователи — публичный доступ или внутренние сотрудники, какие данные обрабатываются (обычные, персональные, платёжные).
3. Перечисли угрозы: не "сделай безопасно", а конкретно — SQL-инъекция, XSS, брутфорс, чего именно боишься.
4. Задай приоритет: если функциональность конфликтует с безопасностью — пусть модель явно напишет об этом в комментарии к коду, а не молча срежет углы.

Примеры

[ПЛОХО] : Напиши код для формы логина на Flask
[ХОРОШО] : Напиши код для формы логина на Flask. Контекст: публичный сервис, любой посетитель может зарегистрироваться, хранятся пароли и email. Требования безопасности: хэширование пароля через bcrypt, лимит попыток входа от брутфорса, параметризованные запросы против SQL-инъекций. Если что-то из этого конфликтует с простотой реализации — приоритизируй безопасность и напиши об этом в комментарии.
Источник: Rethinking Security in LLM Code Generation through Real-World Risk Scenarios
ArXiv ID: 2607.23088 | Сгенерировано: 2026-07-28 04:27

Проблемы LLM

ПроблемаСутьКак обойти
Явный запрос ослабить одну защиту портит и другиеПросишь модель отключить одну меру безопасности (например, проверку сертификата "для теста"). Модель иногда заодно портит другие меры защиты, которые ты не трогал. Код становится менее безопасным сразу в нескольких местахНе давай прямых команд на отключение защиты. Если нужно временно ослабить одну меру — явно пропиши "остальные меры безопасности сохрани без изменений"

Методы

МетодСуть
Security-aware prompting — явный контекст угроз в запросе на кодДобавь в промпт три вещи: техническую задачу, контекст размещения (публичный сервис или внутренний, какие данные обрабатываются), конкретные требования безопасности (валидация, доступ, шифрование). Контекст: сервис публичен, обрабатывает пароли. Требования: санитизация ввода, хеширование пароля, ограничение попыток входа. Почему работает: модель знает best practices безопасности, но не достаёт их сама — она экономит внимание на том, что явно попросили. Названные угрозы становятся приоритетом. Когда да: любая генерация кода с пользовательским вводом, доступом к данным, сетевым взаимодействием. Когда осторожнее: если задача содержит прямое требование ослабить защиту — метод работает хуже, иногда портит несвязанные меры защиты

Тезисы

ТезисКомментарий
Молчание о безопасности модель читает как разрешение её игнорироватьМодель оптимизируется на выполнение того, что попросили буквально, а не на защиту от рисков по умолчанию. Если ты не упомянул безопасность — она не тратит на неё внимание, даже зная нужные приёмы защиты. Разница в доле уязвимого кода — почти в два раза. Применяй: для любой задачи с кодом всегда добавляй хотя бы одну строку про контекст безопасности, даже если кажется что это "очевидно"
📖 Простыми словами

Poster: Rethinking Security inLLMCode Generation through Real-World Risk Scenarios

arXiv: 2607.23088

Суть в том, что современные LLM — это не гениальные хакеры, а исполнительные стажеры, которые хотят тебе угодить. Когда ты просишь модель написать код, она фокусируется на функциональности, а не на защите. Для нейронки «работающий код» и «безопасный код» — это разные задачи, и если ты явно не попросил о втором, она выберет кратчайший путь. Проблема в том, что модель обучается на огромном массиве данных из интернета, где полно мусорного и дырявого кода, поэтому она с радостью копирует плохие практики, просто потому что они популярны.

Это как нанять строителя и сказать ему: «Сделай мне дверь в дом». Он ее поставит, и она будет открываться — задача выполнена. Но если ты не уточнил, что живешь в криминальном районе, он может поставить картонную дверь с пластиковой защелкой. Формально всё работает, но первый же прохожий вынесет твой дом вместе с этой дверью. Метод Security-aware prompting — это когда ты не просто просишь «дверь», а сразу говоришь: «Сделай стальную, с тремя замками и бронированным стеклом, потому что вокруг одни воры».

Чтобы это реально работало, нужно внедрять явный контекст угроз прямо в промпт. Вместо абстрактного «напиши функцию загрузки файлов», ты расписываешь сценарий: кто будет юзером, какие данные полетят на сервер и чего ты боишься. Например, если ты пилишь MVP, ты обязан сказать модели: «Этот код будет доступен в открытом интернете, ожидай атаки через расширения файлов». Только тогда LLM переключит режим с «просто написать» на «защитить», добавив проверки на размер, тип и путь файла, о которых она бы «забыла» в обычном режиме.

Хотя исследование проводили на генерации кода, этот принцип универсален для любой работы с AI. Если ты просишь составить юридический договор, написать финансовый план или спроектировать архитектуру базы данных, модель будет лажать, если не указать ей на риски. Контекст безопасности — это не опция, а фильтр, который заставляет AI отсеивать мусорные решения из обучающей выборки. Без этого фильтра ты получаешь продукт, который развалится при первом же столкновении с реальностью.

Короче: хватит надеяться на «ум» модели — она выдает ровно то, что ты спроектировал в промпте. Если в твоем запросе нет ни слова о безопасности, значит, ты просишь модель сделать дырявый продукт. Либо ты тратишь лишнюю минуту на описание рисков и получаешь нормальный результат, либо потом тратишь месяцы на исправление косяков и разгребание последствий взлома. Security-aware prompting — это единственный способ заставить AI работать на тебя, а не на хакеров.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с