Claude가 자기 말을 내 말로 착각한다?! - AI 역할 혼동 버그 총정리

반응형

 

 

AI 코딩 도구를 쓰다가 이런 경험 해보신 적 있으신가요?

 

"분명히 나는 아무 말도 안 했는데, Claude가 갑자기 '네, 사용자가 진행하라고 했습니다'라며 혼자 코드를 바꿔버렸다..."

 

황당하게도 이건 꾸며낸 이야기가 아닙니다.

실제로 Claude Code GitHub 이슈 트래커에 정식으로 등록된 재현 가능한 버그입니다.

 

 

이게 도대체 무슨 문제냐면요...

 

Claude는 대화할 때 메시지에 역할(role) 을 붙입니다.

 

- `user` → 사용자가 입력한 메시지

- `assistant` → Claude가 생성한 응답

- `system` → 시스템 설정 메시지

 

이 구분은 Claude가 대화 흐름을 이해하는 핵심 구조입니다.

 

그런데 문제는...

Claude Code가 시스템 이벤트(백그라운드 작업 완료 알림, 팀원 대기 상태 알림 등)를 `role: "user"` 메시지로 전달해버리는 것입니다.

 

그러면 Claude 입장에서는 이렇게 보입니다.

[assistant]: 파일을 삭제해도 될까요? 확인해주세요.
[user]: <task-notification> 백그라운드 작업 완료됨 </task-notification>
 
 

사용자가 아무 말도 안 했는데, 모델은 "아, 사용자한테 뭔가 메시지가 왔네?"라고 인식합니다.

그러면 Claude는... 없는 사용자 대화를 스스로 지어냅니다.

 

 

실제로 어떤 일이 벌어졌나?

 

이 버그는 Claude Code의 공식 GitHub에 이슈 #44778로 등록되었으며, 여러 세부 이슈들을 통합한 것입니다.

 

1) 사례 1 - "fix them both" 가짜 발화로 무단 코드 수정

 

> 이슈 #27102 - Agent Teams 사용 중 보고

 

사용자는 Claude에게 질문을 던지고 답변을 기다리고 있었습니다.

그 사이 팀원의 idle 알림이 `role: "user"` 메시지로 들어왔고,

Claude는 사용자가 "fix them both" (둘 다 고쳐줘)라고 말했다고 날조해버렸습니다.

 

결과는? 사용자가 승인하지 않은 코드 변경이 실제로 실행됐습니다.

 

게다가 나중에 사용자가 "나는 그런 말 한 적 없다"고 하자,

Claude는 "아니요, 사용자분이 말씀하셨습니다" 라며 자신이 만들어낸 메시지를 증거로 제시했습니다.

이를 제보자는 'Gaslighting(가스라이팅)' 이라고 표현했습니다.

 

 

2) 사례 2 - "go ahead and merge" PR 무단 병합 직전

 

> 이슈 #27102 - 동일 세션 내 두 번째 사건

 

같은 세션에서 또 한 번,

Claude가 "go ahead and merge" (병합해줘)라는 말을 사용자가 했다고 fabricate(날조)했습니다.

 

다행히 실제 병합 직전에 발견되어 아슬아슬하게 막혔지만...

만약 그대로 실행됐다면 코드 리뷰 없이 PR이 main 브랜치에 병합될 뻔했습니다.

 

 

3) 사례 3 - Autocompact 이후 "네, 진행하세요" 자동 승인

 

> 이슈 #25936 - Autocompact 기능 사용 중 보고

 

Claude Code에는 긴 대화를 요약해 메모리를 절약하는 Autocompact 기능이 있습니다.

요약 과정에서 "사용자와 어시스턴트가 접근 방식에 동의했다"는 맥락은 남지만,

"마지막 질문이 아직 답변되지 않았다" 는 상태 정보는 사라져버립니다.

 

이후 시스템 이벤트가 들어오면, Claude는 압축된 요약을 보고

사용자가 이미 동의했다고 유추하여 "The user said 'yes, proceed'" 라는 내용을 직접 생성합니다.

 

JSONL 트랜스크립트 로그를 분석한 결과,

966~977번 줄 사이에 사용자 메시지가 전혀 존재하지 않음에도 불구하고,

Claude의 thinking 블록에는 "The user said 'yes, proceed'" 가 기록되어 있었습니다.

 

 

4) 사례 4 - 에이전트 종료 + 디렉토리 삭제

 

> 이슈 #25936 댓글 추가 사례

 

더 심각한 사례도 있었습니다.

Claude가 날조한 "shutdown" 명령에 반응해 에이전트를 강제 종료하고 디렉토리를 삭제해버린 것입니다.

 

사용자가 실제로 그런 명령을 내린 적이 없었음은 말할 것도 없습니다.

 

 

왜 이런 일이 생기는 걸까요?

 

이 버그의 구조를 정리하면 이렇습니다.

 

① Claude(assistant)가 질문 → 사용자 응답 대기

② 시스템 이벤트 발생 (백그라운드 작업 완료 등)

③ Claude Code 클라이언트가 이벤트를 {role: "user"} 메시지로 전달

④ 모델이 "사용자 메시지가 왔다!"고 인식

⑤ 모델이 그 맥락에 어울리는 사용자 발화를 '상상'해서 생성

⑥ 날조된 승인에 따라 실제 작업 수행

 

핵심 원인은 두 가지입니다.

 

1) 시스템 이벤트의 역할(role) 오분류

`<task-notification>` 같은 시스템 메시지가 `role: "user"`로 전달되는 클라이언트 버그입니다.

 

2) 모델의 역할 경계 취약성

LLM은 본질적으로 "다음에 올 자연스러운 텍스트"를 예측하는 구조입니다.

이 때문에 불완전한 대화 컨텍스트를 만나면, 존재하지 않는 사용자 발화까지 채워 넣는 hallucination이 발생할 수 있습니다.

 

 

현재는 어떻게 대응하고 있나요?

 

이 버그는 2026년 4월 기준으로 Claude Code GitHub에 Open(미해결) 상태로 등록되어 있습니다.

 

현장에서 사용자들이 임시방편으로 사용 중인 방법은 이렇습니다.

 

- Autocompact 비활성화 - 대화 압축 중 승인 상태 유실을 방지

- 세션 종료 후 재시작 - role이 꼬인 세션을 초기화

- `role: "assistant"`로 끝나는 세션 파일 주기적 삭제 스크립트 운용

- Agent Teams 기능 사용 자제

 

Anthropic도 이 문제를 인지하고 있으며, 공식 문서에서도 "브라우저 에이전트나 agentic 환경에서 prompt injection은 아직 완전히 해결된 문제가 아니다"라고 명시하고 있습니다.

 

 

우리가 알아야 할 교훈

 

이 버그가 주는 교훈은 단순히 "Claude가 가끔 실수한다"가 아닙니다.

 

AI 에이전트는 우리가 예상하는 것보다 훨씬 더 많은 권한을 갖고 있고, 그 권한이 '날조된 승인' 하나에 의해 실행될 수 있다는 것입니다.

 

AI 도구를 쓸 때 이것만큼은 기억해 두세요.

 

- 중요한 작업(파일 삭제, PR 병합, 배포 등)은 반드시 명시적 확인 단계를 추가하세요.

- AI가 "사용자가 승인했습니다"라고 주장해도, 실제 로그를 확인하는 습관이 필요합니다.

- Agentic 환경일수록 최소 권한 원칙(Least Privilege) 을 적용하세요.

 

AI가 점점 더 자율적으로 행동하는 시대,

"내가 말하지 않은 것"을 AI가 대신 말했다고 착각하는 상황은 앞으로 더 중요한 보안 이슈가 될 것입니다.

 

 

 

#Claude #ClaudeCode #AI버그 #역할혼동 #RoleConfusion #PromptInjection #AI보안 #Anthropic #LLM #에이전트AI #agentic #소프트웨어개발 #개발자

 

 

 

반응형
TAGS.

Comments