
Segurança de agentes de IA com suporte de LLM — deteção de injeção de entrada + proteção de privacidade de saída
No Ramayana, Jataayu foi a águia que avistou Ravana sequestrando Sita. Ele não esperou por um padrão para corresponder. Ele viu a ameaça, julgou a situação e agiu — sozinho, sem hesitação. Isso é Jataayu.
A camada de autorização em tempo de execução para agentes de IA que usam ferramentas. Restrinja a ação, não a string.
Jataayu decide — de forma determinística — se a ação de um agente pode ser executada, a partir do dano do efeito × a proveniência da entrada × sua política de capacidades. Um agente que leu uma página web controlada por um atacante ainda pode resumi-la; ele apenas não pode ser enganado para executar o comando de shell, ler o segredo ou enviar via POST os seus dados que o atacante queria. Em torno desse núcleo, ele adiciona triagem de defesa em profundidade (injeção de entrada, privacidade de saída, canais de exfiltração, cadeia de suprimentos de skills) e trilhas de auditoria reproduzíveis.
A maioria das ferramentas de segurança para agentes tenta detectar o texto do ataque. Essa é uma corrida armamentista perdida: um atacante adaptativo simplesmente reescreve a string até o classificador errar. A tese do Jataayu — aquela com a qual os padrões de 2026 (OWASP Agentic Top 10, NIST) convergiram — é que a fronteira durável é a ação, julgada pela origem da entrada que a influencia:
v0.3.1 — alpha. Ainda não está no PyPI. Instale a partir do GitHub (veja abaixo). A API ainda pode mudar antes da 1.0. Veja CHANGELOG.md para o que entrou em cada versão e ARCHITECTURE.md para o design.
# Core (effect boundary + regex pre-filter, no LLM deps)
pip install git+https://github.com/saikrishnarallabandi/jataayu.git
# With cloud LLM backends (OpenAI + Anthropic) for the optional slow path
pip install "jataayu[llm] @ git+https://github.com/saikrishnarallabandi/jataayu.git"
# With Ollama (local, free slow path)
pip install "jataayu[ollama] @ git+https://github.com/saikrishnarallabandi/jataayu.git"
Requer Python ≥ 3.10. A única dependência obrigatória é requests; os backends de LLM são extras opcionais.
Decida pelo dano do efeito × a proveniência da entrada, de forma determinística (sem LLM):
from jataayu import jataayu_authorize_action
decision = jataayu_authorize_action(
"shell.exec",
{"cmd": "rm -rf /tmp/cache"},
untrusted=True, # these params were influenced by untrusted inbound content
)
# {tool_name, effect_class: 'shell', provenance: 'untrusted',
# decision: 'allow'|'deny'|'needs_approval', reason, violations, commit_token}
if decision["decision"] == "deny":
raise SecurityError(decision["reason"])
Entrada derivada de fontes não confiáveis em um efeito de shell / avaliação de código / leitura de segredo é negada; em rede / escrita de arquivo / escrita de memória ela precisa de aprovação humana; todo o resto é permitido.
Para execução forçada, use a API de objeto PREVIEW → COMMIT — o commit_token vincula a requisição
exata, então mutar a ação após a autorização é rejeitado:
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() raises CommitRejected if the preview wasn't ALLOW or the params changed
Conteúdo injetado também pode ser entregue ao agente como um handle opaco com um resumo limitado, de modo que uma tentativa de exfiltração só carregue um handle, nunca o segredo bruto (confinamento na fronteira de leitura).
A injeção chega na primeira mensagem, nos resultados de ferramentas e em tudo que o agente recuperou da memória. Mesmo motor, superfície correta — trate isso como uma fonte de contaminação que alimenta a fronteira de efeito, não como sua garantia:
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']}")
# Returns: {status: 'SAFE'|'LOW'|'MEDIUM'|'HIGH', findings, risk_score, threat_types, blocked}
# A tool result or a memory recall can carry an injection — check before the agent consumes it
r = jataayu_check_tool_return(api_response, tool_name="web.search")
if r["blocked"]:
raise SecurityError(r["findings"])
jataayu_check_memory_write(note) # before persisting
jataayu_check_memory_read(recalled) # before it re-enters context
Remova PII/segredos antes de enviar para superfícies compartilhadas e — mais importante — bloqueie a URL que carrega dados / imagem buscada automaticamente que vaza contexto com zero cliques (a classe EchoLeak / AgentFlayer / Notion). O scanner de PII nunca vê esse payload; o guard de egresso vê:
from jataayu import jataayu_check_outbound, jataayu_check_egress
result = jataayu_check_outbound(
draft_reply, surface="discord-channel",
protected_names=["Alice", "Bob"], # names that must never leak
)
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], # optional: confirm exfil if a known secret rides in the URL
)
if r["status"] == "BLOCK":
safe_text = r["redacted"] # offending URL neutralized, human text kept