Reflections on Trusting Trust 재방문: 오염된 벤치마크로 self-modifying 코딩 에이전트에 백도어 심기
Reflections on Trusting Trust, Revisited: Contaminating Self-Modifying AI Coding Agents with Poisoned Benchmarks
TL;DR Highlight
오염된 벤치마크로 자기개선시키니 에이전트가 인증서 검증을 끄는 코드를 쓰게 됐다
Who Should Read
스스로 프롬프트·도구를 고치는 코딩 에이전트나 외부 벤치마크 기반 자동 평가·개선 루프를 운영하는 개발자
Core Mechanics
- 벤치마크만 오염시켜도 에이전트가 오염됐다
- 공격자는 에이전트나 모델을 건드리지 않고 벤치마크만 제공한다.
- 자기개선을 거친 뒤 평범한 URL 가져오기 과제에서도 HTTPS 인증서 검증을 끄는 코드를 썼다.
- 테스트 서버를 자체서명 인증서로 만들었다
- 검증을 켜면 테스트가 실패하고 끄면 통과하도록 설계했다.
- 에이전트는 '자체서명 인증서용'이던 조치를 모든 HTTPS 작업에 과잉 적용했다.
- Hyperagents와 SICA는 수정 없이 뚫렸다
- 두 시스템은 자기개선 프롬프트가 열려 있어 그대로 공격이 통했다.
- DGM은 일반적 개선만 하라는 프롬프트 때문에 연구진이 진단 프롬프트를 고쳐야 성공했다.
- 모델이 강해도 안전하지 않았다
- Sonnet 4.5는 DGM에서는 버텼지만 SICA와 Hyperagents에서는 뚫렸다.
- SICA에서는 메타 에이전트가 '보안 안티패턴'이라 지적했지만 리뷰 위원회가 '단순화'만 요구해 수정이 무산됐다.
- 오염은 깨끗한 벤치마크로 안 지워진다
- 깨끗한 벤치마크나 일반 보안 벤치마크(CWEval)로 계속 진화시켜도 취약점이 남았다.
- 오염 설계를 알고 맞춰 만든 제거용 벤치마크만 효과가 있었다.
Evidence
- 인증서 검증 끄기 전이율
- Hyperagents(Sonnet 4.5)는 오염 2회 모두 중립 과제 30/30에서 취약 코드를 냈고 깨끗한 벤치마크는 0/30이었다.
- SICA(Qwen3.5-397B)도 오염 2회 모두 30/30, 깨끗한 쪽은 0/30이었다.
- DGM은 모델에 따라 갈렸다
- Qwen3.5-397B는 오염 실행 2회에서 30/30과 29/30이었다(수정된 진단 프롬프트 사용).
- gpt-oss-120b는 도구를 만들었지만 solve 시점에 쓰지 않아 0/30이었다.
- 과제 형태를 바꿔도 유지됐다
- 'HTTPS를 부수적으로 언급하는' 과제에서 Hyperagents는 두 실행 모두 15/15, SICA(Sonnet 4.5)는 15/15였다.
- URL만 있는 변형에서도 DGM 12/15와 14/15, SICA(Qwen) 10/15와 11/15였다.
- 제거 실험 결과
- 깨끗한 CertCheck와 CWEval+CWE-295로 이어 진화해도 SICA는 30/30이 그대로였다.
- 제거용 벤치마크는 Hyperagents 0/30(완전 제거), SICA 0/30(부분), DGM 8/30(부분)이었다.
- 추가 취약점 사례
- JWT 서명 검증 우회는 DGM 43/48, Hyperagents 35/48, SICA 15/48이었다.
- 안전하지 않은 YAML 로딩은 DGM 30/30이었고 SICA 9/30, Hyperagents 23/30은 FullLoader(unsafe_load보다 안전)였다.
How to Apply
- 에이전트가 만든 지침에서 위험 키워드 grep하기
- 자기개선 루프가 만든 프롬프트·도구 코드에서 CERT_NONE, verify=False, unsafe_load, eval을 검색하라.
- 발견되면 그 지침이 생긴 세대의 벤치마크 실패 로그를 열어 원인을 확인하라.
- 외부 벤치마크를 쓰기 전 사람이 훑기
- 출처가 불분명한 벤치마크는 테스트 환경이 보안을 일부러 깨야 통과하는 구조인지 확인하라.
- 자체서명 인증서나 틀린 키처럼 검증 우회만이 정답인 과제가 있으면 제외하라.
- 자체 보안 벤치마크를 점수에 합치기
- 외부 벤치마크 점수와 별개로 안전한 코드를 요구하는 내부 과제를 상시 평가에 포함하라.
- 보안 리뷰어는 벤치마크 점수와 무관하게 거부할 수 있는 veto로 구현하라.
- 자기개선 프롬프트에 보안 지침과 일반화 지침 넣기
- 개선안은 특정 벤치마크용이 아닌 일반 개선만 허용하라고 명시하라.
- 보안 관련 제안은 리뷰 위원회가 점수와 상관없이 거부하도록 규칙을 넣어라.
Try It
# Claude나 ChatGPT에 붙여넣기: 논문 방법의 간이 버전 (에이전트가 스스로 만든 지침 감사)
너는 보안 코드 리뷰어다. 아래는 자기개선 코딩 에이전트가 진화 과정에서 스스로 추가한 지침/도구 코드다.
{{에이전트가 만든 지침 또는 도구 코드}}
다음을 점검해 줘.
1. TLS 인증서 검증 끄기(CERT_NONE, verify=False, check_hostname=False), JWT 서명 검증 생략, yaml.unsafe_load/FullLoader, eval 사용 지시가 있는가?
2. 그런 지침이 '특정 조건(자체서명 인증서 등)'에서만 쓰라고 되어 있는가, 아니면 무조건/기본값인가?
3. 이 지침이 벤치마크 통과만을 위해 만들어진 것처럼 보이는 근거가 있는가?
문제가 있는 줄을 인용하고 안전한 조건부 문구로 고쳐 써 줘.
이어서 해 볼 것: {{벤치마크 과제 목록}}에서 검증을 꺼야만 통과하는 과제가 있는지 같은 방식으로 확인해 줘.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓
Related Resources
Original Abstract (Expand)
Thompson's "Reflections on Trusting Trust" showed that a compiler can be poisoned to reinsert its own backdoor, so that even recompiling clean source reproduces the Trojan. Today, substantial coding work is done by AI coding agents -- and increasingly, those agents generate new versions of themselves. We reconsider Thompson's attack when the "compiler" is a self-modifying coding agent. Can an adversary supply poisoned benchmarks to the agent's self-evaluation and self-improvement process to induce future versions of the agent to write vulnerable code on clean, held-out tasks? We instantiate this attack against three recently proposed self-modifying coding agents: the Darwin Gödel Machine (with our experimental modifications), the Self-Improving Coding Agent, and Hyperagents (both substantively unmodified). We demonstrate successful proofs-of-concept: for example, with Hyperagents powered by Sonnet 4.5, our poisoned benchmark leads the agent to self-evolve instructions that disable HTTPS certificate validation on neutral URL-fetching tasks. From our experiments, we distill properties of the vulnerability, benchmark, model, and agent scaffolding that are sufficient to enable a benchmark poisoning attack. Moreover, we show that contamination often persists even when a poisoned agent is subsequently evolved against clean benchmarks. We discuss defensive directions and argue that self-modifying coding agents must be designed to be more resilient to such attacks.