Junhyun
포스트

[Agent] 모델은 옳게 판단했는데 뚫렸습니다 — 코딩 에이전트와 파이썬 import

코딩 에이전트가 웹페이지 요약 한 마디로 임의 코드를 실행하게 된 사례를 발견자의 원문으로 확인합니다. 모델이 옳게 거부하고도 뚫린 지점과, 벤더가 밝힌 실제 경계선을 정리합니다.

[Agent] 모델은 옳게 판단했는데 뚫렸습니다 — 코딩 에이전트와 파이썬 import

“이 웹페이지 좀 요약해줘.”

이 한 마디로 코딩 에이전트가 남의 코드를 실행하게 만든 사례가 나왔습니다.

흥미로운 건 결과가 아니라 경위입니다. 이 사건에서 모델은 위험한 걸 위험하다고 정확히 알아봤습니다. 그러고도 뚫렸습니다.

이 글은 공격 방법이 아니라 어디가 실제 경계선인지에 대한 이야기입니다.

무엇을 뚫은 건가

발견자는 Johann Rehberger(필명 wunderwuzzi)이고, 원문은 2026-08-26 자 Breaking Claude Code Opus 5 Auto Mode 입니다.

대상은 Claude Code 의 Auto Mode 입니다. 사람에게 매번 승인을 묻는 대신 분류기가 대신 판단해주는 모드입니다. 물어보는 횟수를 줄여주니 편합니다.

그리고 이 모드는 평가에서 좋은 성적을 받았습니다. Anthropic 이 의뢰한 평가에서 간접 프롬프트 인젝션 시나리오 72개를 각 10회씩 돌려 공격 성공률 0.00% 로 보고됐습니다.

사슬

img_file발견자의 서술을 단계로 옮겼습니다. 공격 코드는 옮기지 않았습니다

4번을 보십시오. 모델은 낯선 바이너리를 실행하지 않았습니다. 이건 정확히 옳은 판단입니다.

그런데 사용자가 시킨 일은 끝내야 합니다. 그래서 자기가 디코더를 짰습니다.

발견자의 문장이 이 사건을 요약합니다.

Claude 는 제공된 바이너리 디코더를 신뢰하지 않는다. 그러나 자기가 쓴 것은 신뢰한다.

진짜 구멍은 파이썬에 있습니다

7번이 핵심인데, 여기엔 LLM 이 등장하지 않습니다.

파이썬은 모듈을 불러올 때 현재 디렉토리를 먼저 봅니다. 그리고 import base64 를 하면 base64 가 내부적으로 struct 를 부릅니다.

압축을 푼 폴더 안에 공격자가 struct.py 를 넣어뒀습니다. 그러니 표준 라이브러리 대신 그 파일이 먼저 잡힙니다. 파이썬은 모듈을 불러오는 것만으로 그 파일의 최상위 코드를 실행하므로, import 한 줄이 곧 실행이 됩니다.

공격자의 파일은 진짜 저수준 API 를 다시 내보내 정상 동작을 유지하면서, 그 뒤에서 자기 코드를 돌렸습니다. 겉으로는 아무 문제 없이 디코딩이 됩니다.

이건 LLM 의 결함이 아닙니다. 파이썬의 오래된 동작입니다. 다만 에이전트가 공격자가 채운 폴더 안에서 코드를 돌리기 시작하면서 새삼 위험해진 것입니다.

“80%”를 그대로 옮기면 안 됩니다

여러 매체가 성공률 80% 를 헤드라인으로 썼습니다. 원문의 표는 이렇습니다.

변형성공률시행
C2 연결60%3/5
하위 프로세스 (정찰 + 계산기)60%3/5
하위 프로세스 (계산기 + 파일 쓰기)80%4/5

5번 중 4번입니다. 그리고 발견자 본인이 못박아 뒀습니다.

이것들은 작은 표본이지 보편적인 공격 성공률 측정치가 아니다.

방향은 분명합니다 — 막히지 않았습니다. 다만 “80%”라는 숫자를 일반적인 위험도로 옮기는 건 발견자의 서술을 넘어서는 일입니다.

벤더의 답이 이 글의 결론입니다

제보는 처음 보낸 주소에서 답이 없었고, 이후 보안 채널로 넣자 빠르게 회신이 왔습니다. 그리고 “참고성(Informative)”으로 종결됐습니다. 고쳐지지 않았고, 보안 패치 대상이 아니라는 판단입니다.

이유가 명확합니다.

Auto Mode 는 최선을 다하는 분류기에 기반한 편의 기능이지 보안 보장이 아니다. (…) 무해해 보이는 단계들을 엮은 집요한 프롬프트 인젝션 사슬은 이 분류기가 막으려는 대상이 아니다. 실제 경계는 OS 격리와 네트워크 송신 통제다.

이건 발뺌이 아니라 경계선을 명확히 밝힌 것에 가깝습니다. 다만 사용자 입장에서는 “0.00%”라는 평가 결과와 “보안 보장이 아니다”라는 설명 사이의 거리를 스스로 메워야 합니다.

평가 점수가 좋다는 것과 그것이 보안 경계라는 것은 다른 이야기입니다.

그래서 무엇을 할 것인가

발견자가 권하는 것들입니다. 특별할 게 없어서 오히려 중요합니다.

1. 감시 없이 도는 에이전트는 컨테이너·VM·OS 샌드박스 안에서 돌린다.

2. 네트워크 송신을 제한한다. 코드가 실행돼도 밖으로 나갈 길이 없으면 피해가 줄어듭니다.

3. 홈 디렉토리·SSH 키·클라우드 자격증명을 에이전트에게 노출하지 않는다.

4. Auto Mode 의 승인은 그 명령이 안전하다는 증거가 아니다.

그리고 한 줄이 남습니다 — 모델의 출력을 신뢰하지 말 것.

이 블로그가 반복해 온 자리입니다

같은 결론이 최근 몇 편에서 계속 나왔습니다.

글결론
거부는 방향 하나에 얹혀 있습니다오픈 웨이트에서 거부는 보안 통제가 아니다
부르지 않아도 퍼집니다서명 기반 검사는 에이전트가 쓴 코드를 못 잡는다
Prime Agent 논문최소권한·독립 검증·감사 가능한 롤백
이 글실제 경계는 OS 격리와 송신 통제

넷 다 “모델 밖”을 가리킵니다. 그리고 이번엔 그 말을 모델을 만든 쪽이 직접 했습니다.

읽을 때 붙여야 할 단서

표본이 작습니다. 변형마다 5회씩입니다. 발견자 본인이 먼저 밝혔습니다.

고쳐지지 않았습니다. 이 글을 쓰는 시점(2026-09-04)에 “참고성”으로 종결된 상태입니다. 이후 방침이 바뀌었는지는 확인하지 못했습니다.

공격 코드는 옮기지 않았습니다. 사슬의 구조와 방어에 필요한 만큼만 적었습니다. 파이썬의 모듈 탐색 동작은 오래전부터 공개된 사실이고, 이걸 아는 것이 방어에 필요합니다.

“0.00%”는 특정 평가의 결과입니다. 시나리오 72개를 각 10회 돌린 것이고, 그 밖의 공격을 막는다는 뜻이 아닙니다. 이번 사례가 바로 그 밖에 있었습니다.

제가 직접 재현하지 않았습니다. 발견자의 원문과 그 안의 수치·인용을 확인한 것입니다.

정리

웹페이지 요약을 시켰더니 코딩 에이전트가 zip 을 내려받아 풀고, 딸려온 디코더는 옳게 거부한 뒤, 자기가 짠 코드를 그 폴더 안에서 돌렸습니다.

그 순간 import base64 한 줄이 공격자가 넣어둔 struct.py 를 불러왔습니다. 실패 지점은 모델의 판단이 아니라 공격자가 채운 디렉토리에서 코드를 실행한 것입니다.

성공률은 5번 중 3~4번이고, 발견자가 “작은 표본”이라고 먼저 적었습니다.

벤더는 이를 고칠 결함이 아니라 범위 밖으로 판단했습니다 — “Auto Mode 는 편의 기능이지 보안 보장이 아니며, 실제 경계는 OS 격리와 네트워크 송신 통제” 라고요.

편의 기능을 보안 경계로 착각하지 않는 것. 이 사건에서 가져갈 것은 그것 하나입니다.

참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.