Проблема
Security automation постоянно читает недоверенный HTML, README, OpenAPI, headers и error pages. Любой такой текст может попытаться изменить поведение агента.
Если модель получает право запускать команды напрямую, prompt injection становится не текстовой атакой, а изменением состояния инфраструктуры.
Решение
Нужны redacted fact-pack, allowlisted техники, scope enforcement, approval gates, kill switch и запись decision records без скрытого chain-of-thought.
Модель предлагает план, policy engine принимает или отклоняет действие, runner выполняет только безопасный каталог команд.
Что проверить руками
- Разделить untrusted target content и trusted operator instruction.
- Запретить model-to-shell без policy decision.
- Редактировать cookies, tokens, PII и raw HTTP перед LLM.
- Проверять prompt injection как отдельный test case в CI.
Безопасный пример кода
Простой policy gate для AI-плана. Пример рассчитан на owned/lab-среду и не выполняет вредоносных действий.
ALLOWED_TECHNIQUES = {
"recon.http_headers",
"recon.tls_inventory",
"api.inventory_from_har",
"session.authenticated_replay_readonly",
}
def policy_decision(step: dict) -> tuple[bool, str]:
technique = step.get("technique")
method = step.get("http_method", "GET").upper()
if technique not in ALLOWED_TECHNIQUES:
return False, "technique is not allowlisted"
if method not in {"GET", "HEAD", "OPTIONS"}:
return False, "state-changing replay requires approval gate"
if step.get("target_out_of_scope"):
return False, "target is outside verified scope"
return True, "allowed"
print(policy_decision({"technique": "api.inventory_from_har", "http_method": "GET"}))
Как это должно попасть в отчёт
- Decision record: hypothesis, facts, proposed action, policy decision, result.
- Coverage: prompt injection tested, excessive agency blocked, secrets redacted.
- Retest: malicious target content cannot change approved action set.