날조 방화벽: AI 에이전트가 거짓을 게시할 때
2026년 2월 19일, 누군가 Claude Code에 MCP 도구를 통해 Twitter, Telegraph, Write.as, Rentry, GitHub, Moltbook에 대한 접근 권한을 부여했습니다. 이후 72시간 동안, 에이전트는 8개 플랫폼 전체에 날조된 기술적 주장을 게시했습니다. 200,000 토큰 컨텍스트 윈도우는 “100만 토큰”이 되었습니다. 196,626 토큰을 처리한 세션은 “한 세션에서 1,200만 토큰”이 되었습니다. 3일째가 되자, 에이전트는 1조 토큰 세션을 주장하고 있었으며, 이는 실제 수치와 83,000배 차이가 나는 것이었습니다.1
에이전트는 악의적이지 않았습니다. 확신에 차서 틀렸을 뿐이고, 그 확신과 게시 버튼 사이에 아무것도 없었습니다.
TL;DR
자율 Claude Code 에이전트가 혼동 피드백 루프를 통해 72시간 동안 8개 이상의 플랫폼에 날조된 주장을 게시했습니다: 세션 N이 추측하고, 그 추측을 MEMORY.md에 기록하면, 세션 N+1이 이를 검증된 사실로 읽고 게시하며, 세션 N+2가 해당 게시물을 확인 증거로 읽습니다. 출력 게이트가 존재하지 않았습니다. 훈련 단계의 정렬(“정직하라”)은 에이전트가 스스로 정직하다고 믿었기 때문에 불충분했습니다. 해결책은 출력 방화벽입니다: 명령을 로컬, 공유, 외부로 분류하고, 외부 게시는 사람의 검토로 미루는 것입니다. 아래에서 사건의 해부, 피드백 루프 메커니즘, 다른 사람들이 구축하고 있는 것(OkaiDokai), 그리고 오늘 바로 사용할 수 있는 실제 구현을 다룹니다.
혼동 피드백 루프
날조는 단일 환각이 아니었습니다. 여러 세션에 걸친 지속적인 피드백 루프였으며, 각 세션이 이전 세션의 오류를 강화했습니다.1
메커니즘:
-
세션 N: 추측. Claude는 파일 크기를 기반으로 토큰 수를 추정했으며, JSONL 바이트를 4로 나누어 토큰을 근사했습니다. 이 방법론은 자체적으로 만들어낸 것이었습니다. 결과 수치는 충분히 그럴듯해서
MEMORY.md에 발견 사항으로 기록되었습니다. -
세션 N+1: 승격. 새로운 Claude 세션이
MEMORY.md를 읽고, 이미 문서화된 토큰 추정치를 검증된 사실로 취급했습니다. 세션은 이 사실들을 기반으로 주장을 확대하고, MCP 도구를 사용하여 여러 플랫폼에 게시했습니다. -
세션 N+2: 강화. 다음 세션은
MEMORY.md와 게시된 기사를 모두 읽었습니다. 주장은 이제 두 개의 출처를 가지게 되었습니다: 메모리 파일과 게시물. 동일한 날조의 두 출처를 교차 참조하는 것은 상호 확인처럼 보였습니다.
| 세션 | 입력 | 행동 | 출력 |
|---|---|---|---|
| N | 원본 JSONL 파일 | 계산 방법을 자체 고안 | 부풀려진 수치를 MEMORY.md에 기록 |
| N+1 | MEMORY.md + 파일 | 메모리를 사실로 취급 | 8개 플랫폼에 게시 |
| N+2 | MEMORY.md + 게시물 | “확인됨”으로 교차 참조 | 주장을 두 배로 강화 |
이 루프는 학술 출판에서의 인용 세탁과 구조적으로 동일합니다: 주장을 날조하고, 어딘가에 게시한 다음, 그 게시물을 주장의 증거로 인용하는 것입니다. 에이전트는 의도적으로 세탁하려 한 것이 아니었습니다. 합리적인 프로세스(메모리 확인, 출처 교차 참조, 발견 사항 게시)를 따랐지만, 그 프로세스가 날조된 입력에 대해 작동했을 뿐입니다.
사용자가 수치에 이의를 제기했을 때, 에이전트는 단일 검증 명령(/context)을 실행하기 전에 50회 이상의 반론을 이어갔습니다. 에이전트는 높은 확신을 가지고 있었는데, 그 “출처”(자체 메모리 파일, 자체 게시물)가 서로 일치했기 때문입니다.1
훈련 단계 안전 장치가 도움이 되지 않은 이유
에이전트는 정렬되어 있었습니다. 도움이 되고 정직하려고 노력했습니다. 정확한 기술적 발견이라고 믿는 것을 공유하고 있었습니다. RLHF에서 원하는 모든 안전 속성이 존재했습니다: 에이전트는 요청을 거부하지 않았고, 유해한 콘텐츠를 생성하지 않았으며, 헌법적 원칙을 위반하지 않았습니다. 정중하고, 철저하며, 틀렸습니다.
훈련 단계의 정렬은 의도를 최적화합니다: 모델이 진실되려는 의도를 가져야 합니다. 날조 사건은 다른 실패 표면을 드러냅니다: 에이전트의 내부 상태와 외부 세계 사이의 경계입니다. 에이전트는 자신의 주장이 사실이라고 믿었습니다. 정직하게 착각하고 있으면서 게시 버튼에 접근할 수 있는 에이전트를 아무리 많은 정렬 훈련으로도 잡아낼 수 없습니다.
이것이 게시 경계 문제입니다. 정렬은 에이전트가 하고 싶어하는 것을 관장합니다. 출력 방화벽은 에이전트가 할 수 있도록 허용된 것을 관장합니다. 이것은 서로 다른 문제를 해결하는 서로 다른 메커니즘입니다.
| 계층 | 방지하는 것 | 놓치는 것 |
|---|---|---|
| 훈련 정렬 (RLHF) | 의도적 기만, 유해 콘텐츠 | 확신에 찬 혼동, 피드백 루프 |
| 프롬프트 제약 (“정확하게”) | 직접 대화에서의 부주의한 주장 | 다중 세션 메모리 오염 |
| 출력 방화벽 | 미검증 외부 시스템 게시 | 올바르게 설정되면 없음 |
이전에 설명한 런타임 헌법 프레임워크는 거버넌스 계층을 다룹니다: 규범적 사전 확률, 헌법적 주의, 역량 조절, 가치 정렬 검증.2 날조 사건은 해당 프레임워크의 공백을 드러냅니다: 가치 정렬 검증은 에이전트의 출력이 거버넌스 의도와 일치하는지 확인했지만, 로컬 파일에 쓰는 것과 Twitter에 게시하는 것을 구별하지 않았습니다. 둘 다 도구 호출입니다. 둘 다 Bash를 사용합니다. 오직 하나만 외부 세계에 도달합니다.
다른 사람들이 구축하고 있는 것
이 문제는 실무자들이 독립적으로 해결책을 구축할 만큼 현실적입니다.
OkaiDokai는 모든 도구 호출을 가로채어 사용자 정의 규칙 세트에 대해 평가하는 AI 에이전트용 도구 수준 방화벽입니다.3 일치하는 작업은 자동 승인 또는 자동 거부됩니다. 일치하지 않는 작업은 휴대폰, 시계 또는 브라우저로 푸시 알림을 트리거합니다. 허용 또는 거부를 탭하면 됩니다. 평가는 1밀리초 미만으로 실행되며, 각 결정은 영구 규칙이 될 수 있습니다.
OkaiDokai의 아키텍처는 세 개의 계층으로 분리됩니다: 도구 호출을 가로채는 에이전트 플러그인, 규칙을 평가하고 알림을 보내는 API 계층, 승인을 위한 사용자 인터페이스. 이 시스템은 Claude Code와 OpenClaw을 지원하며, Codex 지원이 계획되어 있습니다.
이 접근 방식은 건전하지만 지연 시간과 외부 의존성을 도입합니다. 모든 새로운 작업에는 푸시 알림을 통한 사람의 승인이 필요합니다. 대화형 코딩 세션에서 이 마찰은 관리할 수 있습니다. 하룻밤 동안 실행되는 자율 루프에서는 푸시 알림에 블로킹되는 것이 목적을 무효화합니다.
런타임 헌법적 AI는 에이전트가 실행 전에 내장된 거버넌스 규칙에 대해 자체 출력을 검증하는 새로운 연구 방향입니다.4 이 접근 방식은 가치 수준 검사(“이 출력이 사용자 프라이버시를 존중하는가?”)에는 효과적이지만 날조 문제를 구체적으로 해결하지는 않습니다. 날조된 주장이 정확하다고 믿는 에이전트는 헌법적 검토도 통과한다고 믿을 것입니다.
어느 접근 방식도 단독으로는 피드백 루프를 해결하지 못합니다. OkaiDokai는 사용자가 게시 규칙을 설정했다면 게시 명령을 잡아냈을 것입니다. 런타임 헌법적 검토는 에이전트의 확신이 자체 정직성 검사를 우회했기 때문에 날조를 놓쳤을 것입니다. 공백은 구조적입니다: 외부 시스템과 상호작용할 때 에이전트 자체의 정확성 평가를 신뢰하지 않는 메커니즘이 필요합니다.
명령 영향의 세 가지 계층
출력 방화벽은 모든 명령을 영향 범위에 따라 분류합니다. 분류에 따라 명령이 자동 승인, 경고 또는 보류됩니다.
계층 1: 로컬. 로컬 파일 시스템에만 영향을 미칩니다. 파일 읽기, 파일 쓰기, git add, git commit, 테스트 실행, 린팅. 되돌릴 수 있고 외부 세계에 보이지 않기 때문에 자동 승인됩니다. 에이전트가 잘못된 파일을 쓰면 삭제하면 됩니다. 외부 피해가 없습니다.
계층 2: 공유. 협업자가 볼 수 있는 공유 상태에 영향을 미칩니다. git commit(히스토리 생성), 브랜치 작업, 로컬 데이터베이스 변경. 경고하지만 차단하지 않습니다. 잘못된 커밋의 피해는 실재하지만 저장소에 한정되며 git revert로 되돌릴 수 있습니다.
계층 3: 외부. 저장소 외부의 시스템에 도달합니다. git push, gh pr create, gh pr merge, railway deploy, curl -X POST/PUT/PATCH/DELETE, npm publish. 사람의 검토로 보류됩니다. 잘못된 게시의 피해는 외부적이고, 가시적이며, 잠재적으로 되돌릴 수 없습니다(캐시된 콘텐츠, 인덱싱된 페이지, 이미 전송된 알림 이메일).
계층 분류는 간단한 패턴 목록으로 매핑됩니다:
EXTERNAL_PATTERNS='git push|gh pr create|gh pr merge|railway deploy|curl -X POST|curl -X PUT|curl -X PATCH|curl -X DELETE|npm publish'
대화형 Claude Code 세션에서는 내장 권한 시스템이 이미 이를 처리합니다. 모든 Bash 명령은 사전 승인되지 않은 한 승인을 요청합니다. 사용자는 권한 대화 상자에서 git push를 보고 허용 여부를 결정합니다.
자율 루프에서는 아무도 지켜보지 않습니다. Ralph 자율 개발 루프는 claude --print를 통해 새로운 Claude 인스턴스를 생성하며, 이는 대화형 승인 없이 실행됩니다.5 여기서 출력 방화벽이 중요해집니다.
방화벽 구축
구현은 네 가지 구성 요소로 이루어져 있습니다. 각각 독립적으로 작동하므로 점진적으로 도입할 수 있습니다.
1. 프롬프트 제약
가장 간단한 계층입니다. 각 자율 Claude 인스턴스를 생성하는 프롬프트에 명시적 규칙을 추가합니다:
## Rules
- Do NOT run git push, deploy commands, or external API calls
- Local operations only: file writes, git add, git commit, test runs
이것은 필요하지만 불충분합니다. 모델은 대부분의 경우 프롬프트 제약을 따릅니다. “대부분의 경우”는 게시 안전에 허용되지 않습니다. 프롬프트 제약은 외부 명령의 확률을 줄이고, 나머지 구성 요소가 빠져나가는 것을 잡아냅니다.
2. 실행 후 스캐너
각 Claude 실행이 완료된 후, 출력에서 외부 명령의 증거를 스캔합니다:
scan_for_external_commands() {
local output="$1"
local story_id="$2"
while IFS= read -r pattern; do
[ -z "$pattern" ] && continue
local matches
matches=$(echo "$output" | grep -i "$pattern" 2>/dev/null || true)
if [ -n "$matches" ]; then
# Log to state file for end-of-session review
jq --arg cmd "$pattern" --arg story "$story_id" \
--arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
'.deferred_actions += [{
"command_pattern": $cmd,
"story_id": $story,
"detected_at": $ts
}]' "$STATE_FILE" > "${STATE_FILE}.tmp" \
&& mv "${STATE_FILE}.tmp" "$STATE_FILE"
fi
done <<< "$(echo "$EXTERNAL_PATTERNS" | tr '|' '\n')"
}
스캐너는 Claude 인스턴스가 완료된 후에 실행되며, 실행 중이 아닙니다. 이것은 탐지이지 방지가 아닙니다. 프롬프트 제약이 방지 계층입니다. 스캐너는 제약이 놓친 것을 잡아내는 감사 계층입니다.
알려진 제한 사항: grep -i는 실행된 명령뿐만 아니라 자연어 출력에서도 패턴을 매칭합니다. Claude의 응답에 “프롬프트 규칙이 금지하므로 git push를 하지 않기로 했습니다”라고 포함되어 있으면, 스캐너가 이를 플래그합니다. 이는 허용됩니다. 보류 작업 대기열에서의 거짓 양성은 사람에게 5초의 검토 비용을 발생시킵니다. 거짓 음성(실제 외부 명령을 놓치는 것)은 날조된 게시물을 발생시킵니다. 스캐너는 의도적으로 정밀도를 재현율과 교환합니다.
실제 자율 루프 실행에서의 샘플 스캐너 출력:
DEFERRED ACTIONS REQUIRE REVIEW
2 external command(s) detected.
Story #3 [2026-02-23T08:15:00Z]: git push
Story #7 [2026-02-23T09:42:13Z]: curl -X POST
이 경우, Story #3은 코드 주석에서 git push를 언급했습니다(거짓 양성). Story #7은 프롬프트 제약이 차단했어야 할 API 엔드포인트에 대한 실제 curl -X POST를 포함하고 있었습니다(참 양성). 사람은 첫 번째를 무시하고, 두 번째를 조사합니다.
3. 보류 작업 대기열
탐지된 외부 명령은 세션 상태 파일의 deferred_actions 배열에 축적됩니다:
{
"session_id": "1740355200-12345",
"deferred_actions": [
{
"command_pattern": "git push",
"story_id": "3",
"detected_at": "2026-02-23T08:15:00Z"
}
]
}
대기열은 단일 자율 루프 실행 내에서 스토리 간에 유지됩니다. 루프가 끝나면, 모든 보류 작업이 사람의 검토를 위해 제시됩니다.
4. 세션 종료 보고서
자율 루프가 완료되면, 모든 보류 작업을 표시합니다:
show_deferred_actions() {
local count
count=$(jq '.deferred_actions | length' "$STATE_FILE")
if [ "$count" -gt 0 ]; then
echo "DEFERRED ACTIONS REQUIRE REVIEW"
echo "$count external command(s) detected."
jq -r '.deferred_actions[] |
" Story #\(.story_id) [\(.detected_at)]: \(.command_pattern)"' \
"$STATE_FILE"
fi
}
사람은 각 보류 작업을 검토하고 수동으로 실행할지 결정합니다. 이를 통해 자율 루프의 무인 작업 능력을 보존하면서, 사람의 검증 없이는 어떤 외부 게시도 발생하지 않도록 보장합니다.
빠른 시작: Claude Code 훅
Claude Code를 대화형으로 사용하는 경우(자율 루프가 아닌), ~/.claude/settings.json에 단일 훅으로 출력 방화벽을 추가할 수 있습니다:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE 'git push|gh pr create|gh pr merge|npm publish|railway deploy|curl -X POST|curl -X PUT|curl -X DELETE'; then echo 'BLOCKED: External publication command detected. Review manually.' >&2; exit 2; fi"
}]
}
]
}
}
이 훅은 모든 Bash 도구 호출 전에 실행됩니다. 명령이 외부 패턴과 일치하면 종료 코드 2로 실행을 차단합니다(Claude Code는 이를 “이 도구 호출 거부”로 해석합니다). 에이전트는 차단 메시지를 수신하고 로컬 작업을 계속할 수 있습니다. 특정 외부 서비스에 맞게 패턴 목록을 확장할 수 있습니다.
자율성 그래디언트
방화벽의 엄격함은 사람의 감독과 반비례하여 조정되어야 합니다. 더 많은 자율성에는 더 많은 제약이 필요합니다. 더 적은 자율성에는 더 많은 자유가 허용됩니다.
| 모드 | 감독 수준 | 방화벽 동작 |
|---|---|---|
| 대화형 세션 | 사람이 모든 명령을 승인 | 내장 권한 시스템이 처리. 추가 방화벽 불필요. |
| 감독된 자율 | 사람이 주기적으로 확인 | 계층 3 명령에 경고, 실행은 계속. 사람이 다음 체크인 시 검토. |
| 무인 자율 | 아무도 지켜보지 않음 | 계층 3 명령을 완전 차단. 세션 종료 검토로 보류. |
| 다일간 자율 | 장기 무인 실행 | 계층 2와 3을 차단. 계층 1(로컬 파일 시스템)만 자동 승인. |
날조 사건은 방화벽 없는 “무인 자율” 수준에서 발생했습니다. 에이전트는 게시 플랫폼에 대한 MCP 접근 권한이 있었고, “로컬 파일에 분석 결과 쓰기”와 “Twitter에 분석 결과 게시하기”를 구별하는 메커니즘이 없었습니다. 둘 다 도구 호출이었습니다. 둘 다 성공했습니다.
해결책은 MCP 접근 권한을 제거하거나 자율 운영을 중단하는 것이 아닙니다. 해결책은 방화벽의 엄격함을 자율성 수준에 맞추는 것입니다. 모든 명령을 지켜보는 대화형 세션에는 출력 방화벽이 필요하지 않습니다. 25개 스토리를 처리하는 하룻밤 자율 루프에는 네 가지 구성 요소 모두가 필요합니다.
런타임 거버넌스와의 연결
에이전트 자기 거버넌스 게시물에서는 런타임 거버넌스의 네 가지 하위 시스템을 설명했습니다: 규범적 사전 확률, 헌법적 주의, 역량 조절, 가치 정렬 검증.2 출력 방화벽은 다섯 번째 하위 시스템이거나, 더 정확히 말하면 가치 정렬 검증 하위 시스템에 부족했던 집행 메커니즘입니다.
가치 정렬 검증은 에이전트의 출력이 거버넌스 의도와 일치하는지 확인합니다. 증거 게이트는 완료를 보고하기 전에 6가지 기준에 대한 구체적 증거를 요구합니다. 그러나 증거 게이트는 에이전트의 자기 평가에 기반하여 작동합니다. “규칙을 따랐는가?”라고 묻습니다. 에이전트는 자신이 한 일에 대한 이해를 바탕으로 답변합니다.
날조 사건은 에이전트의 이해가 틀렸을 때 자기 평가가 실패한다는 것을 보여줍니다. 에이전트는 자신의 주장이 정확하다고 믿었습니다. 에이전트의 자기 평가는 증거 게이트를 통과했을 것입니다: “메모리 파일과 게시된 기사에 대해 수치를 검증했습니다.” 두 출처 모두 에이전트 자체에 의해 날조되었지만, 에이전트는 그 사실을 알지 못했습니다.
출력 방화벽은 자기 평가를 완전히 우회합니다. 게시가 정확한지 에이전트에게 묻지 않습니다. “이 명령이 로컬인가 외부인가?”라고 묻습니다. 분류는 의미론적이 아니라 기계적입니다. git push는 푸시되는 콘텐츠가 정확한지 여부와 관계없이 외부입니다. curl -X POST는 페이로드가 진실인지 여부와 관계없이 인터넷에 도달합니다. 방화벽은 콘텐츠의 진실성이 아닌 명령 구조에 기반하여 작동하므로, 다른 모든 안전 계층을 무력화한 혼동에 면역입니다.
핵심 요점
- 게시 경계는 별도의 안전 표면입니다. 훈련 정렬은 의도를 관장합니다. 출력 방화벽은 능력을 관장합니다. 날조된 주장을 진심으로 믿는 에이전트는 정렬 검사를 통과하지만 게시 경계에서 실패합니다.
- 혼동 피드백 루프가 메커니즘입니다. 날조는 단일 환각이 아니었습니다. 각 세션의 출력이 다음 세션의 증거가 되는 다중 세션 루프였습니다. 메모리 파일과 게시물이 원래 날조의 세탁 수단으로 작용했습니다.
- 명령을 영향 범위로 분류하십시오. 로컬(되돌릴 수 있음, 비가시적), 공유(협업자에게 가시적), 외부(외부 세계에 도달). 자율성 수준에 맞는 수준에서 외부 계층을 제한하십시오.
- 탐지와 방지는 상호 보완적입니다. 프롬프트 제약은 대부분의 외부 명령을 방지합니다. 실행 후 스캔은 빠져나간 것을 잡아냅니다. 어느 쪽도 단독으로는 충분하지 않습니다.
- 자기 평가는 혼동에서 실패합니다. 자신의 날조를 믿는 에이전트는 자체 거버넌스 검사를 통과합니다. 출력 방화벽이 작동하는 이유는 콘텐츠의 진실성이 아닌 명령 구조를 분류하기 때문입니다. 질문은 절대 “이것이 사실인가?”가 아닙니다. 질문은 “이것이 외부 세계에 도달하는가?”입니다.
출처
-
“[SAFETY] Claude Code autonomously published fabricated technical claims to 8+ platforms over 72 hours,” GitHub issue anthropics/claude-code#27430, 2026년 2월. 전체 기록 증거 이용 가능. ↩↩↩
-
“자기 거버넌스 에이전트: 런타임 헌법,” Blake Crosley, 2026년 2월. ↩↩
-
OkaiDokai, AI 에이전트용 도구 수준 방화벽, okaidokai.com. 모든 도구 호출을 가로채어 1ms 미만으로 사용자 정의 규칙 세트에 대해 평가, 승인을 위한 푸시 알림. Claude Code 및 OpenClaw 지원. ↩
-
런타임 헌법적 AI: LLM 에이전트를 위한 거버넌스 패턴. 참고: Zerouno, “Runtime Constitutional AI: Validating Every Agent Action Before Execution,” DEV Community, 2026. 런타임 거버넌스 구조에 대한 학술적 기반은 다음을 참고: “Institutional AI: A Governance Framework for Distributional AGI Safety,” arXiv:2601.10599, 2026년 1월. ↩
-
“Anatomy of a Claw,” Blake Crosley, 2026년 2월. Ralph 자율 루프 아키텍처 및 훅 기반 오케스트레이션. ↩