
LLM 기반 AI 에이전트 보안 — 인바운드 주입 탐지 + 아웃바운드 프라이버시 보호
라마야나에서 자타유는 라바나가 시타를 납치하는 것을 목격한 독수리였습니다. 그는 패턴이 일치하기를 기다리지 않았습니다. 그는 위협을 보고 상황을 판단한 후, 주저 없이 홀로 행동했습니다. 그것이 바로 자타유입니다.
도구 사용 AI 에이전트를 위한 런타임 권한 부여 계층. 문자열이 아닌 동작을 게이트합니다.
자타유는 에이전트의 동작이 실행될 수 있는지 여부를 영향의 해로움 × 입력의 출처 × 귀하의 역량 정책을 기반으로 결정론적으로 결정합니다. 공격자가 제어하는 웹 페이지를 읽은 에이전트도 여전히 요약할 수 있습니다. 단지 공격자가 원했던 셸 명령을 실행하거나, 비밀을 읽거나, 데이터를 POST하도록 속일 수는 없습니다. 이 핵심 기능 주변에 심층 방어 스크리닝(인바운드 주입, 아웃바운드 개인 정보 보호, 데이터 유출 채널, 스킬 공급망)과 재생 가능한 감사 추적 기능을 추가합니다.
대부분의 에이전트 보안 도구는 공격 텍스트를 탐지하려고 합니다. 이는 패배하는 군비 경쟁입니다. 적응형 공격자는 분류기가 놓칠 때까지 문자열을 계속 다시 작성합니다. 자타유의 핵심 주장 — 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(기계 판독 가능 출력)을 허용합니다.
자타유는 보장이 동작에 있도록 계층화되어 있으며, 그 위의 각 계층은 심층 방어입니다.
계층 1 — 효과 경계 (보장).
동작 수준 권한 부여는 (효과 심각도 × 최악의 인바운드 출처 × 에이전트의 역량 정책)에 따라 ALLOW / DENY / NEEDS_APPROVAL을 결정론적으로 결정합니다. LLM이 없으며, 어떤 탐지기가 작동하는지에 의존하지 않습니다. 또한 읽기 경계 제한(불투명 핸들) 및 도구 호출 궤적에 대한 SessionTrace 교차 턴 감사 기능이 있습니다.
계층 0 — 입력 정규화 + 오염 (경계에 공급). 모든 입력은 여러 보기(NFKC + 동형/혼동 가능 접기, 제로 폭 스트립, 문자 간격 "분리 해제", de-leet)로 정규화되며, base64/hex/url 페이로드는 재귀적으로 디코딩되고 다시 스캔됩니다. 값 수준 오염은 신뢰할 수 없는 콘텐츠를 다운스트림 도구 호출의 실제 매개변수로 추적합니다. 이것이 효과 경계에 매개변수가 신뢰할 수 없는 출처에서 파생되었음을 알려주는 것입니다.
사전 필터 — 두 경로 탐지기 (저렴한 분류, 보장이 아님).