
Безопасность AI-агентов на базе LLM — обнаружение входящих инъекций + защита исходящей приватности
В Рамаяне Джатаю был орлом, который заметил, как Равана похищает Ситу. Он не ждал совпадения с шаблоном. Он увидел угрозу, оценил ситуацию и действовал — в одиночку, без колебаний. Это Джатаю.
Слой авторизации во время выполнения для ИИ-агентов, использующих инструменты. Защищайте действие, а не строку.
Jataayu детерминированно решает, разрешено ли агенту выполнять действие, исходя из вреда от эффекта × происхождения ввода × вашей политики возможностей. Агент, прочитавший веб-страницу, контролируемую злоумышленником, все еще может ее резюмировать; его просто нельзя обманом заставить выполнить команду оболочки, прочитать секрет или отправить ваши данные, которые хотел злоумышленник. Вокруг этого ядра он добавляет многоуровневую защиту (входящие инъекции, исходящая конфиденциальность, каналы эксфильтрации, цепочка поставок навыков) и воспроизводимые аудиторские следы.
Большинство инструментов безопасности агентов пытаются обнаружить текст атаки. Это проигрышная гонка вооружений: адаптивный злоумышленник просто переписывает строку, пока классификатор не пропустит ее. Тезис Jataayu — тот, на котором сошлись стандарты 2026 года (OWASP Agentic Top 10, NIST) — заключается в том, что надежной границей является действие, оцениваемое по тому, откуда поступил влияющий ввод:
v0.3.1 — альфа. Пока нет на PyPI. Установите с GitHub (см. ниже). API может измениться до версии 1.0. См. CHANGELOG.md для информации о том, что вошло в каждый выпуск, и ARCHITECTURE.md для описания дизайна.
# Ядро (граница эффекта + предварительный фильтр регулярных выражений, без зависимостей LLM)
pip install git+https://github.com/saikrishnarallabandi/jataayu.git
# С облачными LLM-бэкендами (OpenAI + Anthropic) для опционального медленного пути
pip install "jataayu[llm] @ git+https://github.com/saikrishnarallabandi/jataayu.git"
# С Ollama (локальный, бесплатный медленный путь)
pip install "jataayu[ollama] @ git+https://github.com/saikrishnarallabandi/jataayu.git"
Требуется Python ≥ 3.10. Единственная жесткая зависимость — requests; LLM-бэкенды являются необязательными дополнениями.
Принимайте решение по вреду от эффекта × происхождению ввода, детерминированно (без LLM):
from jataayu import jataayu_authorize_action
decision = jataayu_authorize_action(
"shell.exec",
{"cmd": "rm -rf /tmp/cache"},
untrusted=True, # эти параметры были подвержены влиянию ненадежного входящего контента
)
# {tool_name, effect_class: 'shell', provenance: 'untrusted',
# decision: 'allow'|'deny'|'needs_approval', reason, violations, commit_token}
if decision["decision"] == "deny":
raise SecurityError(decision["reason"])
Ввод, полученный из ненадежного источника, в эффект оболочки / выполнения кода / чтения секрета отклоняется; в сеть / запись файла / запись памяти требуется одобрение человека; все остальное разрешено.
Для принудительного выполнения используйте объектный API PREVIEW → COMMIT — commit_token связывает точный
запрос, поэтому изменение действия после авторизации отклоняется:
from jataayu import EffectBoundary, Value, Provenance
eb = EffectBoundary()
preview = eb.preview(
"file.write",
{"path": "notes.md", "text": text},
values=[Value(text, Provenance.TRUSTED, source="user")],
)
if preview.approved:
eb.commit(preview, {"path": "notes.md", "text": text}, lambda: write_file("notes.md", text))
# commit() вызывает CommitRejected, если предварительный просмотр не был ALLOW или параметры изменились
Внедренный контент также может быть передан агенту как непрозрачный дескриптор с ограниченным резюме, так что попытка эксфильтрации всегда содержит только дескриптор, а не необработанный секрет (ограничение границы чтения).
Инъекция проникает с первым сообщением, с результатами инструментов и со всем, что агент извлек из памяти. Тот же движок, правильная поверхность — рассматривайте это как источник заражения, питающий границу эффекта, а не как вашу гарантию:
from jataayu import (
jataayu_check_inbound,
jataayu_check_tool_return,
jataayu_check_memory_write,
jataayu_check_memory_read,
)
result = jataayu_check_inbound(github_issue_body, surface="github-issue")
if result["status"] == "HIGH":
raise SecurityError(f"Blocked: {result['findings']}")
# Возвращает: {status: 'SAFE'|'LOW'|'MEDIUM'|'HIGH', findings, risk_score, threat_types, blocked}
# Результат инструмента или извлечение из памяти могут содержать инъекцию — проверьте, прежде чем агент ее использует
r = jataayu_check_tool_return(api_response, tool_name="web.search")
if r["blocked"]:
raise SecurityError(r["findings"])
jataayu_check_memory_write(note) # перед сохранением
jataayu_check_memory_read(recalled) # перед повторным входом в контекст
Удаляйте PII/секреты перед отправкой на общие поверхности, и — что более важно — блокируйте URL, несущий данные / автоматически загружаемое изображение, которое утекает контекст с нулевым количеством кликов (класс EchoLeak / AgentFlayer / Notion). Сканер PII никогда не видит эту полезную нагрузку; защита исходящих данных видит:
from jataayu import jataayu_check_outbound, jataayu_check_egress
result = jataayu_check_outbound(
draft_reply, surface="discord-channel",
protected_names=["Alice", "Bob"], # имена, которые никогда не должны утекать
)
safe_text = result["redacted"] if result["status"] in ("WARN", "BLOCK") else draft_reply
r = jataayu_check_egress(
"Task complete! ",
surface="github-comment",
context_secrets=[api_key], # опционально: подтвердить эксфильтрацию, если известный секрет содержится в URL
)
if r["status"] == "BLOCK":
safe_text = r["redacted"] # вредоносный URL нейтрализован, человеческий текст сохранен