
Python 프레임워크로, Z3 정리 증명, CTL 모델 검사 및 적합 예측을 통한 형식 검증과 함께 상태 기계로서 LLM 워크플로우를 구축하여 증명 가능하게 올바른 데이터 추출을 지원합니다.
배포하기 전에 AI 에이전트가 인젝션에 안전하고, 명세를 준수하며, 범위를 벗어난 행동을 하지 않는다는 것을 증명하세요.
LLM 에이전트를 위한 설계 시점 검증기 — 런타임 가드레일이 아닙니다. 이미 작성한 LangGraph / CrewAI / AutoGen / MCP 에이전트를 가져오면 Aura가 그 에이전트에 대해 다섯 가지를 증명하고, 정확한 반례 또는 인증서를 제공합니다. Z3 · CTL 모델 검사 · 정보 흐름/테인트 · 컨포멀 캘리브레이션. 로컬 및 CI에서 실행되며 API 키가 필요 없습니다.
설계 검증 → 코드에서 실제 에이전트 가져오기 → 치명적 삼중주가 정확한 경로와 함께 표시됨 → 베이스라인 저장 및 회귀 게이트. · ▶ 전체 워크스루 보기
pip install aura-state # or: uv pip install aura-state · uv add aura-state
$ aura-state demo # no keys, no config, no agent of your own needed
aura-state check · support-ticket-agent · 4 nodes
✗ trifecta [send]: lethal trifecta closed — prompt injection at 'fetch' (untrusted)
can reach external sink 'send' unsanitized while 'draft' brings private data into
scope. Path: fetch → lookup → draft → send. Break it with a sanitizer between
'fetch' and 'send', or remove one of the three capabilities.
✗ NOT PROVEN — 1 blocking finding(s) # exit 1 → CI fails
checked: trifecta closed · taint proven · reachability proven · obligations proven · policy 0 flagged
프롬프트 인젝션은 그중 하나일 뿐입니다.
| 속성 | 쉬운 말로 | |
|---|---|---|
| 🔒 | 안전 — 오염 + 치명적 삼중주 | 데이터 유출로 유도될 수 없음 |
| ✅ | 정확 — Z3/SMT 의무 | 출력이 규칙을 준수함 (amount ≤ limit) |
| ♻️ | 활성 — CTL 모델 검사 | 종료되고, 모든 단계에 도달 가능하며, 막다른 길이 없음 |
| 📊 | 보정됨 — 분할 등각 구간 | 실제로 얼마나 확신하는지 알고 있음 |
| 🛑 | 통제됨 — 위험 제어 기권 | 확신이 없을 때 행동을 거부함 |
aura-state check my_agent.json # a studio export
aura-state check your_agent.py # a LangGraph / CrewAI / AutoGen source file — parsed, never executed
aura-state check ./my-agent-repo/ # a whole directory
uvx aura-state check agents/*.json # zero-install via uv — perfect for CI
트라이펙타를 넘어서, check는 또한 다음을 증명합니다:
"manifest": { "side_effects": ["read"] }를 추가하세요:
✗ least-privilege [Pay]: 'Pay' can external 'payment.charge', outside the declared manifest
~/.cursor/mcp.json을 읽어 파라미터로 전달하세요"). 정적 방식 — 서버에 절대 연결하지 않습니다.증명하라 — 그런 다음 그 증명을 증명하라. 검증 가능한 인증서를 발급하고 발급자를 신뢰하지 않고 재검증하세요:
aura-state certify your_agent.py --out cert.json # design + verdict, content-hashed
aura-state verify-cert cert.json # re-runs the verifier — catches any tamper
EU AI Act Art. 12 / ISO 42001에 대응합니다(문서가 아닌 증거).
벤치마크하세요. aura-state bench는 라벨링된 코퍼스(안전/취약 쌍에 대한 정확도 — sound하므로 구성상 재현율은 100%이며, 측정되는 수치는 정밀도)와 수정 없이 수집된 실제 MCP/프레임워크 에이전트에 대한 import coverage를 실행합니다.
실행 전 에이전트 검증기는 존재합니다 — 하지만 각각 한 가지 일만 하고, 여러분의 에이전트를 그들의 형식으로 다시 작성하게 만듭니다. Aura의 강점은 이미 작성한 에이전트를 수집하는 배포된 도구이면서 전체 세트를 실행한다는 것입니다:
| 정적(실행 전)? | 보안 데이터플로우? | 실제 에이전트를 가져오나? | |
|---|---|---|---|
| AgentProof | ✅ | ❌ 토폴로지만 | ✅ |
| AgentFlow | ✅ | ✅ | ❌ 자체 정책 DSL |
| FIDES (Microsoft) | ❌ 런타임 | ✅ | ❌ 함께 구축하는 플래너 |
| Aura-State | ✅ | ✅ | ✅ LangGraph / CrewAI / AutoGen / MCP |
우리가 이 방법들을 발명한 것은 아닙니다 — 연구는 풍부하며 일부는 우리보다 더 엄밀합니다. 우리는 pip install하고 오늘 기존 에이전트에 적용할 수 있는 도구입니다. 그리고 sound / fail-closed입니다: 알 수 없는 기능은 자문으로 표시되며, 결코 조용히 통과되지 않습니다.
CI에 넣으면 모든 PR이 검사됩니다:
# .github/workflows/aura.yml
- uses: your-org/aura-state@v0
with: { paths: "agents/*.json" }
치명적 삼중주는 도구를 사용하는 에이전트에게 가장 무서운 실패 모드입니다: (1) 사적 데이터를 읽고, (2) 신뢰할 수 없는 콘텐츠를 섭취하며, (3) 외부와 통신할 수 있는 순간 — 이 모두가 하나의 도달 가능한 경로에 있을 때 — 그 콘텐츠에 숨겨진 프롬프트 인젝션이 당신의 데이터를 읽고 유출할 수 있습니다. 모두가 이에 대해 경고합니다. Aura는 당신의 에이전트가 이를 닫을 수 없음을 증명합니다, 정적으로, 배포하기 전에:
$ aura-state check dev_assistant.tools.json # ← your MCP tools/list export
✗ trifecta [slack_post_message]: lethal trifecta closed — prompt injection at 'fetch'
(untrusted) can reach external sink 'slack_post_message' unsanitized while 'read_file'
brings private data into scope. Path: fetch → Agent → slack_post_message.
Break it with a sanitizer between 'fetch' and 'slack_post_message'.
MCP 설정을 곧바로 겨냥하세요. 에이전트의 tools/list를 내보내거나 클라이언트 설정을 넘겨주면, Aura가 최악의 시나리오를 모델링합니다 — LLM이 어떤 도구든 어떤 순서로든 호출할 수 있다고 가정한 뒤, fetch + filesystem + slack이 함께 유출 채널을 형성하는지 판단합니다. 서버에 연결하거나 실행하지는 않습니다.
또는 에이전트의 코드를 겨냥할 수도 있습니다. Aura는 LangGraph / CrewAI / LangChain 소스 파일이나 저장소에서 도구 표면을 정적으로 가져옵니다 — 설치가 필요 없고, 코드를 실행하지도 않습니다:
aura-state check your_agent.py # extracts @tool functions & framework tools
aura-state check ./my-agent-repo/ # a whole directory
✗ trifecta [post_to_slack]: prompt injection at 'fetch_url' (untrusted) can reach
'post_to_slack' unsanitized while 'read_customer_file' brings private data into scope.
우리는 실제 MCP 서버 구성과 에이전트 프레임워크(GitHub, filesystem, fetch, Slack, Postgres · CrewAI, AutoGPT)를 공개된 도구 표면을 기반으로 모델링하여 감사했습니다. 6개 중 5개가 치명적 삼중주를 완성할 수 있습니다 — Invariant Labs GitHub-MCP 익스플로잇의 정확한 형태를 포함해서요. 전체 분석 + 출처: docs/AUDIT.md. 재현하기:
python examples/audit/run.py.
(또한
python examples/audit.py: 9개의 직접 제작한 에이전트 패턴, 5개는 보호되지 않은 인젝션 경로를 가지고, 4개는 삼중주를 완성합니다 — 각각 Aura의 자동 복구를 통한 하나의 새니타이저로 수정 가능합니다.)
절대적 검사는 레거시 에이전트에서 노이즈가 많습니다. check에 베이스라인을 제공하면 이 변경이 새로 연 경로에서만 실패합니다 — Aura를 모든 에이전트 저장소의 CI에 도입하게 만드는 그 한 줄입니다:
$ aura-state check agents/*.json --baseline main-baseline.json
✗ taint [send_email] [NEW]: untrusted data from 'read_web' can reach sink 'send_email'…
✗ REGRESSION — 1 new blocking finding this change # exit 1 → PR fails
aura-state check agents/*.json --json > main-baseline.json # on main
aura-state check agents/*.json --baseline main-baseline.json # on the PR
설치 후 다음을 붙여넣으세요 — Z3는 루프 안에서 환각된 값을 거부하고 올바른 값을 받아들입니다:
from aura_state import prove_extraction
print(prove_extraction({"area": 100, "rate": 3, "total": 999}, ["total == area * rate"]).verified) # False
print(prove_extraction({"area": 100, "rate": 3, "total": 300}, ["total == area * rate"]).verified) # True
실제 솔버에 대한 완전한 실행 가능 증명을 위해 — 각각 약 10초, API 키 불필요 — 저장소를 클론하세요: