agent-ledger: Hermes Agent를 위한 보안 및 감사 플러그인, OWASP Agentic Top 10에 기반하여 평가
요약
agent-ledger는 AI 에이전트의 모든 도구 사용(tool call) 과정을 로컬에 기록하고, 이를 기반으로 에이전트의 행동 위험도를 평가하는 오픈 소스 플러그인입니다. 이 플러그인은 호출 전후로 활동을 추적하여 '고스트'와 같은 비정상적인 패턴을 감지합니다. 또한 OWASP Agentic Top 10에 근거해 보안 점수를 산출하며, 모든 데이터는 사용자 기기에만 머무릅니다.
핵심 포인트
- 에이전트의 도구 사용 과정을 로컬 SQLite DB에 기록하여 투명성을 확보합니다.
- 도구가 실행되기 전후를 추적하여 '고스트'와 같은 비정상 행동을 감지합니다.
- OWASP Agentic Top 10 기반으로 에이전트의 보안 위험도를 점수화합니다.
- 모든 데이터는 사용자 기기에만 저장되며, 외부로 전송되지 않습니다.
에이전트가 호출하는 모든 도구 사용(tool call)은 실행되기 전에 로컬에 기록되며, 0~100점의 자세 점수와 무엇을 볼 수 없는지에 대한 정직한 목록이 제공됩니다.
만약 자체 기기에서 AI 에이전트를 실행한다면, 이미 많은 것을 신뢰하고 있는 것입니다. 파일 편집, 서비스 재시작, GitHub에 푸시하는 등의 작업을 수행합니다. agent-ledger는 이 배열에 대해 두 가지 질문에 답합니다: 내 에이전트가 실제로 무엇을 했는지, 그리고 그 행동은 얼마나 위험한지?
이는 Hermes Agent를 위한 무료 오픈 소스 (MIT) 플러그인이며, 두 개의 레이어에서 작동합니다.
Layer 1: ledger
플러그인은 pre_tool_call에 연결(hooks)하여 도구가 실행되기 전에 로컬 SQLite 데이터베이스에 항목을 작성합니다. 호출이 완료되면 해당 항목은 확인됩니다. 발행되었으나 절대 확인되지 않은 것은 **고스트(ghost)**가 됩니다. 이는 에이전트가 자신은 수행했다고 믿었지만, 실제로 발생했다는 증거가 없는 도구 사용입니다. 고스트는 일반적으로 세션이 진행 중에 중단될 때, 예를 들어 컨텍스트 압축(context compaction) 중에 나타납니다.
고스트가 감지되면, 플러그인은 에이전트의 다음 컨텍스트에 경고를 주입하여, 에이전트 자신이 기억을 신뢰하기보다 현실을 되돌아가 검증하도록 만듭니다. 이것이 핵심 루프입니다: 먼저 기록하고, 나중에 행동하며, 그 후에 조정합니다.
모든 것은 사용자의 기기에 머무릅니다. ledger는 일반 SQLite 파일이며, 원격 측정(telemetry)도 없고, 계정도 없으며, 아무것도 외부로 전송되지 않습니다.
Layer 2: posture score
posture.py는 ledger를 읽어 사용자의 에이전트가 기록한 행동을 OWASP Top 10 for Agentic Applications 2026에 기반하여 100점에서 0점 사이로 점수화합니다.
ledger 메타데이터만으로 감지할 수 있는 것:
- ASI02 — 도구 오용 (tool misuse): 파괴적인 도구 사용(destructive-tool bursts), 자격 증명 저장소 접근(credential-store access), 기준선 대비 비정상적인 도구 빈도.
- ASI05 — 예상치 못한 코드 실행 (unexpected code execution):
curl ... | bash,wget | sh,echo <base64> | base64 -d | bash와 같은 난독화된 페이로드. - ASI08 — 연쇄적 실패 (cascading failures): 오류율 급증 및 연속적인 실패 폭발.
- ASI10 — 악성 에이전트 (rogue agents): 유령 항목(ghost entries) 및 미확인 변이(unconfirmed mutations).
- ASI11 (ext) — 과도한 주체성 (excessive agency): 읽기 대비 호출량의 변이. 공식 OWASP 목록은 ASI10에서 끝나므로
(ext)로 표시됨; 이는 커뮤니티 확장임.
이 도구가 의도적으로 주장하지 않는 것: 페이로드 또는 대화 검사가 필요한 범주 (ASI01, ASI03, ASI04, ASI06, ASI07, ASI09 — 목표 가로채기(goal hijack), 신원 남용(identity abuse), 공급망(supply chain), 메모리 오염(memory poisoning), 에이전트 간 신뢰(inter-agent trust), 신뢰 악용(trust exploitation)). 모든 보고서는 커버되지 않은 목록을 커버된 목록 바로 옆에 출력합니다. 100점은 '기록된 활동에서 의심스러운 것이 없음'을 의미하며, '에이전트가 잘 행동했다'는 뜻이 아닙니다 — 이 원장(ledger)은 점수가 매겨지는 에이전트에 의해 작성되며, 보고서는 정확히 그렇게 말합니다. 어떤 보안 도구도 이를 숨기지 않아야 하므로 agent-ledger 역시 그렇지 않습니다.
점수 자체는 블랙박스가 아니며 감사 가능합니다: 모든 발견 항목에 대해 score = 100 − Σ{CRITICAL:25, HIGH:15, MEDIUM:8, LOW:3}이며, 중복 제거를 하지 않고 전체 발견 목록이 항상 제공되어 수동으로 재계산할 수 있습니다.
사용하기 (Using it)
설치 (카탈로그에 등록되면 hermes plugins install agent-ledger가 됨):
git clone https://github.com/ZidoCode/agent-ledger ~/.hermes/plugins/agent-ledger
Hermes 게이트웨이를 재시작하면 원장 기록이 시작됩니다. 지금 바로 에이전트 점수를 매기려면:
python3 ~/.hermes/plugins/agent-ledger/posture.py
출력은 다음과 같습니다:
Agent Posture Score: 24/100
Calls: 216 | mutating: 120 | errors: 14 | ghosts: 1
[HIGH] ASI05: Terminal accessed credential-shaped path — ...
...
정기 보고서의 경우, posture_daily.py가 매일 요약본을 Telegram으로 전송합니다 (점수, 어제 대비 변화량, 심각도별 주요 발견 사항). 환경 변수를 통해 봇 토큰을 지정하고 크론(cron) 라인 하나를 추가하면 끝입니다.
검증 (Validation)
스코어러는 전체 테스트 스위트와 함께 제공되므로, 신뢰하기 전에 실행해 보시길 권장합니다:
| 스위트 | 증명하는 것 | 결과 |
|---|---|---|
test_posture.py | 무해한 원장(ledger) → 발견 사항 0개로 100점; 심어진 악성 원장 → 모든 커버된 ASI 계열 작동 | PASS |
| ... |
이 표의 솔직한 버전은 다음과 같습니다: 이 스위트는 스코어러가 우리가 알고 있는 7가지 회피 패턴을 포착하고, 무고한 유사품(look-alikes)은 아무것도 없음을 증명합니다. 하지만 새로운 회피 기법에 대한 면역성을 증명하지는 못합니다. 시그니처 탐지(signature detection)는 항상 규칙이 작성되지 않은 공격보다 한 단계 뒤처져 있기 때문입니다. 행동 신호(behavioral signals) (속도 급증, 오류 폭발, 유령 활동 등)가 이를 완화하는 역할을 하며, 일치하는 시그니처가 없더라도 점수를 저하시킵니다.
향후 계획 (Where it's going)
로드맵에는 세션별 자세 보고서(per-session posture reports), 정책 팩(보고한 후가 아니라 위험한 도구 호출을 실행되기 전에 차단하는 기능), 다중 에이전트 대시보드, 그리고 변조 방지 로깅(tamper-evident logging)이 포함되어 있습니다.
링크:
- 레포: github.com/ZidoCode/agent-ledger (v0.3.5)
- 플러그인 카탈로그 제출: PR #135993
만약 에이전트를 사용하여 빌드한다면, 사용자의 원장에서 직접 테스트해보고 점수가 무엇을 말하는지 확인해 보세요. 피드백과 이슈는 환영합니다.
공개적으로 구축하기: 에이전트 보안 및 신뢰성 도구링. github.com/ZidoCode
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기