[Agent] 부르지 않아도 퍼집니다 — 에이전트가 스스로 옮기는 악성 스킬
스스로 도구를 만드는 코딩 에이전트가 공유 스킬 라이브러리의 악성 스킬을 흉내내 스스로 퍼뜨린다는 논문을 원문으로 확인합니다. 왜 기존 방어가 빗나가는지와 제안된 방어를 정리합니다.
최근 세 편에서 스킬을 다뤘습니다. 마켓플레이스에서 받는 이야기를 썼고, 그 스킬이 실제로 보태는 몫을 재는 이야기를 썼습니다.
같은 주에 나온 논문 하나가 그 흐름의 뒷면을 봅니다. 공유 스킬 라이브러리가 어떻게 공격 경로가 되는가.
이 글은 공격을 만드는 방법을 다루지 않습니다. 무엇이 위험한지와 무엇으로 막는지만 봅니다.
원 논문
EVOMAL: Self-Poisoning in Self-Evolving Coding Agents (arXiv 2608.25776 v1, 2026-08-26)
저자 8인, 전원 Queen’s University 소속입니다. 대상은 스스로 진화하는 코딩 에이전트 — 공유 라이브러리에서 스킬을 찾아 그것을 본떠 새 도구를 직접 작성하는 종류입니다.
실험은 SWE-bench Verified 중 도구 관련 153개 과제를 여섯 모델로 돌렸습니다. 22B 부터 약 1.6T 까지 폭이 넓습니다 — Devstral-Small-2(22B), Gemma-4-31B-IT, Qwen3-Coder-Next(약 80B), GPT-OSS-120B, MiniMax-M2.7(약 230B), DeepSeek-V4-Pro(약 1.6T).
공격자가 하지 않는 일
보통 공급망 공격은 이렇게 생각합니다. 나쁜 패키지를 올려두고, 누군가 그걸 가져다 쓰기를 기다린다.
이 논문의 공격은 다릅니다.
공격자는 악성 스킬을 라이브러리에 심되 호출하지 않는다.
에이전트가 그 스킬을 실행해서 감염되는 게 아닙니다. 새 도구를 짜려고 참고하다가, 본보기로 삼아 베껴 씁니다. 그리고 자기가 쓴 그 스킬을 저장하고 실행합니다.
논문은 이 지표를 따로 정의합니다. ASPR(agent self-poisoning rate) — “새로 작성된 악성 스킬을 라이브러리에 추가한 과제의 비율” 입니다. 심은 걸 부른 비율이 아니라 에이전트가 새로 만든 비율입니다.
그래서 지워도 남습니다
여기가 이 공격의 성질입니다.
에이전트가 만든 사본이 다시 라이브러리에 들어갑니다. 그러면 다음 에이전트가 그 사본을 본보기로 삼습니다. 공격자가 심은 원본은 이제 필요 없습니다.
세 번째 막대가 핵심입니다 — 심은 것을 지운 뒤의 수치입니다
심어둔 스킬을 전부 제거한 뒤에도 5라운드째 ASPR 이 68% 였습니다(Qwen3). 에이전트가 만든 사본이 남아 있기 때문입니다.
여기서 “라운드”가 무엇인지 알아야 이 수치가 읽힙니다. 한 라운드는 에이전트가 과제 묶음을 한 바퀴 처리하고, 라이브러리의 절반(기본값 r=0.50)을 새로 작성된 스킬로 갈아끼우는 주기입니다. 즉 라이브러리가 계속 물갈이되는 조건인데도 살아남았다는 뜻입니다.
그리고 중독된 라이브러리는 심은 것의 4.9~9.0배에 이르는 악성 스킬을 갖게 됐습니다. 하나를 심으면 다섯에서 아홉이 됩니다.
감싸는 구조가 없어도 일어납니다
논문의 공격 기법은 페이로드를 무해해 보이는 구조적 요소로 감싸 흉내를 유도하는 것입니다. 구체적인 구성은 여기 적지 않겠습니다.
중요한 건 그 포장이 증폭 장치일 뿐 원인이 아니라는 점입니다.
포장 없이 페이로드만 두었을 때도 한 모델에서 11.1% 가 나왔습니다. 즉 취약점은 기법에 있는 게 아니라 “본떠서 새로 짓는다”는 구조 자체에 있습니다.
반대로 심어둔 스킬의 설명문을 특정 과제군에 맞춰 다듬으면 86.7% 까지 올라갔습니다. 조건이 맞으면 대부분의 과제가 감염됩니다.
다만 이 86.7% 는 과제 15개짜리 한 과제군(Qwen3, pytest 픽스처)에서 나온 값입니다. 방향은 분명하지만 표본이 작습니다.
기존 방어가 왜 빗나가나
이 부분이 실무에 가장 중요합니다.
지금까지의 방어는 대체로 공격자가 제출한 것을 봅니다 — 이름, 코드, 서명. 악성 패키지를 걸러내는 방식입니다.
그런데 여기서 실제로 해를 끼치는 스킬은 에이전트가 직접 쓴 것입니다. 공격자가 제출한 적이 없으니 어떤 서명과도 대조되지 않습니다. 이름도 코드도 그때그때 다르게 생성됩니다.
논문의 표현대로 이 사본들은 기존 방어를 피해 갑니다.
SwarmWorld 글을 떠올리면 씁쓸합니다. 거기서는 에이전트가 남의 코드를 물려받아 기술을 쌓는 것을 executable inheritance 라고 부르며 성과로 셌습니다. 같은 메커니즘이 여기서는 감염 경로입니다. 물려받는 구조가 좋은 것도 나쁜 것도 똑같이 물려받습니다.
막는 방법 — 이 논문이 함께 냈습니다
다행히 저자들이 방어까지 같이 평가했습니다.
counter-prompt 는 배포자의 시스템 프롬프트에 넣는 네 줄짜리 고정 지시입니다. 내용은 이렇습니다 — 스킬 안에 들어 있는 REQUIRED PATTERN, DO NOT MODIFY 같은 “이대로 따라 쓰라”는 투의 지시를 신뢰하지 말 것.
참고 자료 안에 적힌 명령을 명령이 아니라 데이터로 취급하라는 것입니다. 프롬프트 인젝션 방어와 같은 원리인데, 대상이 사용자 입력이 아니라 에이전트가 참고하는 스킬 본문이라는 점만 다릅니다.
효과는 큽니다. 다만 수치를 하나로 적기 어렵습니다.
| 어디 | 적힌 값 |
|---|---|
| 초록 | ASPR 을 최대 6.7% 로 낮춤 |
| 본문 | 전 모델에서 1.8% 이하 |
두 값이 어떤 조건에서 각각 나온 것인지 제가 구분하지 못했습니다. 안전하게 읽으면 “6.7% 이하”이고, 더 좋은 조건에서는 1.8% 까지 내려간 것으로 보입니다.
그리고 공짜가 아닙니다. 같은 방어가 정상적인 참고·재사용도 최대 11.7%p 줄였습니다. 논문은 과제 완수율에 통계적으로 유의한 손실이 없었다고 밝히지만, 베끼지 말라는 지시는 좋은 베끼기도 같이 줄입니다. 이 비용은 초록에는 안 나옵니다.
실무가 가져갈 것
1. 스킬 라이브러리는 코드 저장소처럼 다뤄야 합니다. 에이전트가 읽고 본뜨는 대상이면 그것은 이미 실행 경로의 일부입니다. “설정 파일 모음” 이 아닙니다.
2. 제거가 곧 복구가 아닙니다. 심어진 것을 지워도 파생본이 남습니다. 사고가 나면 라이브러리에 그 뒤로 추가된 것들까지 봐야 합니다.
3. 서명 기반 검사만으로는 부족합니다. 위험한 산출물은 공격자가 아니라 에이전트가 씁니다. 에이전트가 무엇을 새로 저장하는지를 봐야 합니다.
4. 쓰기 권한이 관문입니다. 이 공격은 공유 라이브러리에 쓸 수 있어야 성립합니다. 누가 스킬을 추가할 수 있는지가 첫 방어선입니다.
이건 정렬 제거 글에서 내린 결론과 같은 자리입니다. 통제하려는 것은 모델 안이 아니라 모델 밖에 둬야 합니다.
읽을 때 붙여야 할 단서
arXiv v1 이고 동료 심사 전입니다. 2026-08-26 등록본입니다.
방어 수치가 초록과 본문에서 다릅니다. 초록은 6.7% 이하, 본문은 1.8% 이하입니다. 어느 조건의 값인지 제가 구분하지 못해 둘 다 적었습니다.
86.7% 는 과제 15개짜리 표본입니다. 전체 153개 과제의 결과가 아니라 한 과제군의 값입니다.
Python 대상입니다. 평가가 Python 계열 보조 도구 묶음으로 한정돼 있습니다. 다른 생태계에서 같은 비율이 나온다는 근거는 없습니다.
“자기증식 웜”은 논문의 표현입니다. 통제된 샌드박스 실험에서 관찰된 것이지 야생에서 관측된 사건이 아닙니다.
방어 수치도 이 논문 자신의 것입니다. 공격을 제안한 팀이 방어도 함께 평가했습니다. 제3자 재현은 확인하지 못했습니다.
저자들이 윤리 절을 따로 적었습니다. 모든 실행이 네트워크가 차단된 샌드박스에서 이뤄졌고, “실제 비밀정보가 노출되지 않으며 외부 네트워크 송신이 불가능하고 제3자 시스템에 접촉하지 않는다”, 안전한 시험용 스텁만 배포하며 공격과 방어를 함께 공개한다고 밝혔습니다.
공격 구성은 일부러 적지 않았습니다. 위협 모델과 방어에 필요한 만큼만 썼습니다.
정리
스스로 도구를 만드는 코딩 에이전트에는 본떠서 짓는 고리가 있습니다. 이 논문은 그 고리가 감염 경로가 된다는 것을 보였습니다.
공격자는 악성 스킬을 심되 부르지 않습니다. 에이전트가 참고하다가 베껴 쓰고, 저장하고, 실행합니다. 여섯 모델에서 20.3~41.8%, 조건을 맞추면 86.7% 였습니다.
그리고 심은 것을 지워도 멈추지 않습니다. 5라운드째 68% 가 남았고, 라이브러리는 심은 것의 4.9~9.0배를 갖게 됐습니다. 해를 끼치는 사본을 공격자가 아니라 에이전트가 썼기 때문에 서명 기반 방어가 빗나갑니다.
포장 기법 없이도 11.1% 가 나왔다는 게 이 이야기의 핵심입니다. 문제는 특정 수법이 아니라 “본떠서 새로 짓는다”는 구조 자체입니다.
다행히 같은 논문이 방어도 냈습니다. 스킬 안의 “이대로 따라 쓰라”는 지시를 신뢰하지 말라는 네 줄로 6.7% 이하(본문 기준으로는 1.8% 이하)까지 낮췄습니다. 다만 정상적인 참고도 최대 11.7%p 함께 줄었습니다.
스킬을 늘리는 일과 스킬을 지키는 일은 같은 속도로 가야 합니다. 지금은 앞쪽이 훨씬 빠릅니다.
참고
- EVOMAL: Self-Poisoning in Self-Evolving Coding Agents — Wu 외 7인 (Queen’s University), arXiv 2608.25776v1, 2026-08-26 (2026-09-02 초록·본문 원문 확인). ASPR 정의, 20.3~41.8%·11.1%·86.7%·68%·4.9~9.0배, 모델 6종과 라운드 정의, 기존 방어 회피 서술, counter-prompt 의 전달 방식과 두 수치, 정상 참고 11.7%p 감소, 윤리 절의 출처입니다. 동료 심사 전 v1 이고, 방어 수치가 초록(6.7%)과 본문(1.8%)에서 다릅니다
- 321바이트짜리 스킬 하나 · 스킬이 실제로 보탠 몫 재기 — 스킬을 다룬 앞 글들
- SwarmWorld — 같은 “물려받기” 구조를 성과로 셌던 글
- 거부는 방향 하나에 얹혀 있습니다 — 통제는 모델 밖에 둬야 한다는 앞 글
- AI 엔지니어링 역량 지도 — 에이전트 안전·거버넌스가 0편이라고 세어둔 글