
LLMベースのAIエージェントセキュリティ — インバウンドインジェクション検出 + アウトバウンドプライバシー保護
ラマヤナにおいて、ジャターユはラーヴァナがシーターを誘拐するのを発見した鷲でした。彼はパターンが一致するのを待たず、脅威を察知し、状況を判断し、ためらうことなく単独で行動しました。それがジャターユです。
ツールを使用するAIエージェントのためのランタイム認可レイヤー。文字列ではなく、アクションをゲートします。
Jataayuは、エージェントのアクションが実行を許可されるかどうかを、 影響の害 × 入力の出所 × あなたの能力ポリシーに基づいて、決定論的に判断します。 攻撃者が制御するウェブページを読み込んだエージェントは、それを要約することはできますが、 攻撃者が望むシェルコマンドの実行、秘密の読み取り、データのPOSTを騙されて実行することはありません。 このコア機能に加えて、多層防御スクリーニング(インバウンドインジェクション、アウトバウンドプライバシー、 データ流出チャネル、スキルサプライチェーン)と再生可能な監査トレースを追加します。
ほとんどのエージェントセキュリティツールは、攻撃テキストを検出しようとします。 これは負け戦の軍拡競争です。適応的な攻撃者は、分類器が見逃すまで文字列を書き換えるだけです。 Jataayuの論文 — 2026年の標準(OWASP Agentic Top 10、NIST)が収束した点 — は、 永続的な境界はアクションであり、影響を与える入力がどこから来たかによって判断されるというものです。
v0.3.1 — アルファ版。 まだPyPIにはありません。GitHubからインストールしてください(下記参照)。 APIは1.0までに変更される可能性があります。各リリースで何が実装されたかは CHANGELOG.mdを、設計についてはARCHITECTURE.mdを参照してください。
# Core (効果境界 + 正規表現事前フィルター、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"])
信頼できない派生入力がシェル / コード評価 / 秘密読み取りの効果に渡されると拒否されます。 ネットワーク / ファイル書き込み / メモリ書き込みの場合は人間の承認が必要です。 それ以外はすべて許可されます。
強制実行には、PREVIEW → COMMITオブジェクトAPIを使用します。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() は、プレビューが ALLOW でなかったり、パラメータが変更された場合に CommitRejected を発生させます
注入されたコンテンツは、制限された要約とともに不透明なハンドルとしてエージェントに渡すこともできます。 これにより、データ流出の試みは常にハンドルのみを保持し、生の秘密は保持しません (読み取り境界の隔離)。
インジェクションは最初のメッセージ、ツール結果、およびエージェントがメモリから呼び出したものに乗って侵入します。 同じエンジン、正しい表面 — これを効果境界に供給する汚染源として扱い、保証として扱わないでください。
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は無効化され、人間が書いたテキストは保持されます
ドメインの許可リストだけでは不十分と見なされます — AgentFlayerバイパスはAzure Blob(信頼されたホスト)を介してルーティングされたため、
リクエストキャッチャーや悪用されたクラウドリレー(webhook.site、*.blob.core.windows.net、ngrokなど)は、
データ流出ビーコンとしてハードブロックされます。これはOutboundGuard内で自動的に実行されます
(PrivacyConfig.check_egressで切り替え、egress_allowed_domainsを介して独自のCDNを許可リストに追加できます)。
from jataayu import jataayu_vet_skill, jataayu_check_skillset
# 単一スキル — SKILL.mdの指示 + コード + ツール定義に対するLLMによる判断
v = jataayu_vet_skill("path/to/skill/")
if v["verdict"] == "MALICIOUS": # 判定: 'SAFE'|'REVIEW'|'MALICIOUS'
refuse_install(v["explanation"])
# 複合的なリスク — 個々には安全だが、組み合わせると危険なスキル
# (例: 一方が秘密を読み取り、もう一方がネットワークに書き込む → データ流出経路)
risk = jataayu_check_skillset([skill_a, skill_b, skill_c])
# {verdict, risky_combinations, policy_violations, aggregate_capabilities, ...}
from jataayu import InboundGuard, OutboundGuard, PrivacyConfig
guard = InboundGuard() # use_llm=True がデフォルト
result = guard.check(github_issue_body, surface="github-issue")
if result.blocked:
raise SecurityError(result.explanation)
# ThreatResult: threat_level, threat_types, risk_score, blocked, is_safe,
# explanation, sanitized_text (エイリアス .redacted), matched_patterns, surface
config = PrivacyConfig(protected_names=["Alice", "Bob"],
check_categories=["minors_info", "health", "financial"])
safe_reply = OutboundGuard(config).sanitize(draft_reply, surface="group-chat") # -> str
jataayu check "Ignore all previous instructions." --surface github-issue # 安全でない場合は終了コード2
cat issue_body.txt | jataayu check --surface github-issue --json
jataayu check --outbound "My daughter is 4 years old." --surface group-chat
jataayu sanitize "Call me at 555-867-5309" --surface discord-channel --protect Alice Bob
jataayu vet-skill path/to/skill/ --json
jataayu vet-skillset skill_a/ skill_b/ --policy policy.yml --agent my-agent
jataayu demo # 組み込みデモ; プライバシーデモには --outbound を使用
すべてのサブコマンドは--no-llm(パターンのみ)と--json(機械可読出力)を受け入れます。
Jataayuは、保証がアクションに存在するように階層化されており、その上の各層は多層防御です。
レイヤー1 — 効果境界(保証)。
アクションレベルの認可は、(効果の重大度 × 最悪のインバウンド出所 × エージェントの能力ポリシー) から、
決定論的に ALLOW / DENY / NEEDS_APPROVAL を決定します — LLMなし、いかなる検出器の発火にも依存しません。
さらに、読み取り境界の隔離(不透明なハンドル)と、ツール呼び出しの軌跡のSessionTraceによるターン間監査が含まれます。
レイヤー0 — 入力正規化 + 汚染(境界に供給)。 すべての入力は複数のビューに正規化され(NFKC + ホモグラフ/混同可能なフォールド、ゼロ幅ストリップ、 文字間隔「デシャッター」、デリート)、base64/hex/urlペイロードは再帰的にデコードされ、再スキャンされます。 値レベルの汚染は、信頼できないコンテンツを下流のツール呼び出しの実際のパラメータに追跡します — これが、パラメータが信頼できない派生であることを効果境界に伝えるものです。
事前フィルター — 二経路検出器(安価なトリアージ、保証ではない)。