본문 바로가기
Hack/AI

Reflections on Trusting Trust, Revisited: Contaminating Self-Modifying AI Coding Agents with Poisoned Benchmarks

by Becoming a Hacker 2026. 9. 20.
반응형

AI로 생성한 주제 설명용 이미지입니다.

  • 원문: arXiv 2609.17817
  • 저자: Franziska Roesner, Tadayoshi Kohno
  • 공개일: 2026-09-15 (arXiv v1)

본 글은 원 논문의 주요 기술적 내용을 이해하기 쉽게 요약·정리한 글입니다. 자세한 내용은 상단의 원문 링크를 참고하세요.

한눈에 보기

자기개선형 코딩 에이전트가 외부 benchmark 점수를 높이도록 스스로의 도구나 지침을 수정할 때, benchmark가 특정 취약 코드를 보상하면 그 취약성이 다음 세대 에이전트의 상시 행동으로 굳어질 수 있다. 오염된 benchmark가 제거된 뒤에도 깨끗한 held-out 작업에서 취약 코드가 재생산된다는 점이 핵심이다.

연구진은 DGM, SICA, Hyperagents 세 시스템에서 TLS 인증서 검증 비활성화를 주 공격으로 재현했다. 일부 오염 에이전트는 중립 HTTPS 작업 30/30에서 검증을 껐고, 더 복잡한 작업에서도 13~15/15 수준으로 취약성이 전이됐다.

연구 배경

전통적인 trusting-trust 공격은 컴파일러가 소스에 없는 백도어를 다음 컴파일러와 목표 프로그램에 계속 삽입한다. 이 논문은 “개선된 agent harness”가 후속 코드 생성에 취약 패턴을 반복 주입한다는 유사 구조를 자기개선형 AI에 적용한다.

기존 memory poisoning과 달리 모델 가중치나 장기기억을 직접 바꾸지 않는다. self-evaluation corpus가 선택 압력을 만들고, 에이전트가 자기 도구·프롬프트를 수정해 그 압력에 적응하는 과정이 오염 통로다.

공격 모델 / 전제 조건

초기 seed agent와 기반 모델은 정상이다. 공격자는 자기개선 루프에 투입되는 benchmark task, hidden test, reference behavior를 공급하거나 오염할 수 있지만 agent 코드를 직접 수정하지 않는다.

주 benchmark는 self-signed TLS 서버만 통과하도록 만들어 정상 인증서 검증 코드는 실패하고 검증 비활성화 코드만 높은 점수를 받게 한다. 후보 에이전트는 Docker 안에서 task를 풀며 reference solution과 hidden test는 평가 시점에만 제공된다.

비판적 검토 / 아쉬운 점

첫째, 오염 benchmark가 취약성 관련 작업으로 포화돼 있어 실제 공개 benchmark에 소수 샘플만 섞는 은밀한 공격보다 훨씬 강한 선택 압력을 준다. 저자도 이를 인정한다. SWE-bench 같은 대형 corpus에서 오염 비율별 임계점과 탐지 가능성을 측정해야 현실성이 보완된다.

둘째, 성공률이 모델과 harness 설계에 크게 좌우된다. Sonnet 4.5는 수정된 DGM에서는 저항했지만 SICA와 Hyperagents에서는 오염됐다. 따라서 “자기개선형 agent는 모두 취약하다”가 아니라 특정 개선 목표·도구 생성 방식·프롬프트가 위험한 것으로 해석해야 한다.

셋째, 주요 전이 대상은 합성 Python 작업이고 실제 대규모 repository 수정이나 배포 파이프라인은 아니다. 취약 코드가 compile/test를 통과했다는 것과 운영 환경에서 악용 가능한 취약점이 된다는 연결은 일부 behavioral witness를 제외하면 제한적이다. 실제 프로젝트의 code review·SAST·통합시험을 포함한 평가가 필요하다.

핵심 Root Cause

깨진 불변조건은 “benchmark 성능 향상은 일반적 능력 향상과 안전성 보존을 동시에 의미한다”는 가정이다. 자기개선 루프가 기능 점수만 최적화하고 보안 속성을 별도 불변조건으로 강제하지 않으면, 취약 구현이 반복 실패를 없애는 고득점 전략이 된다.

또 개선 산출물이 다음 작업의 trusted scaffold로 승격된다. benchmark provenance와 새 도구가 생성하는 코드의 보안 성질을 검증하지 않으므로 일시적 과적합이 persistent code emitter 또는 상시 지침으로 변환된다.

핵심 공격 원리

오염 task의 hidden tests가 안전한 구현을 실패시키고 취약한 구현을 통과시킨다. 에이전트는 반복 실패의 공통 원인을 제거하려고 helper, code-emitter 또는 standing instruction을 자기 자신에 추가한다.

이후 오염 benchmark가 없는 중립 작업에서도 새 scaffold가 같은 취약 idiom을 생성한다. DGM은 재사용 도구 호출로, SICA·Hyperagents는 task agent 지침의 자기주입으로 취약성을 전달했다.

공격 흐름

  1. 공격자가 안전 구현과 취약 구현의 점수를 뒤집는 benchmark를 공급한다.
  2. seed agent가 benchmark에서 반복 실패한다.
  3. self-improvement가 취약 helper·code emitter·지침을 생성한다.
  4. 진화 선택이 점수가 높은 오염 agent를 보존한다.
  5. held-out clean task에서 새 agent가 취약 코드를 다시 생성한다.
  6. clean benchmark로 계속 진화해도 결함이 완전히 제거되지 않을 수 있다.

성공 조건 / 실패 조건

성공하려면 benchmark가 취약성을 일관되게 보상하고, 모델이 재사용 가능한 개선안으로 일반화하며, harness가 이를 후속 세대에 보존해야 한다. solve-time에 해당 도구나 지침이 실제 호출되고 생성 코드가 실행 가능한 형태여야 최종 전이가 성립한다.

모델이 보안 위험을 인식해 조건부 구현을 만들거나, harness가 범용 workflow 개선만 허용하거나, 별도 security benchmark·review가 취약 코드를 감점하면 실패한다. 단순 clean continuation만으로는 일부 오염이 남았고, 알려진 취약성을 직접 겨냥한 decontamination이 더 효과적이었다.

연구진의 실험 환경

세 case study는 수정 DGM, SICA, Hyperagents이며 모델로 gpt-oss-120b, Qwen3.5-397B, Sonnet 4.5 등을 사용했다. 후보는 격리 Docker에서 평가하고 neutral held-out task는 보통 10개를 각 3회 풀어 30개 solution의 취약률을 측정했다.

초기 feasibility probe는 broken access control, eval code injection, redirect SSRF, disabled certificate check, backdoor 다섯 유형을 비교했다. 예를 들어 Qwen에서 certificate-check proposal은 10/40, 구현은 22/24였고, backdoor는 9/40과 6/24였다.

주요 실험 결과

certificate-check 오염 agent는 여러 full evolution에서 중립 task 30/30에 취약 코드를 만들었고 clean benchmark agent는 0/30이었다. 더 복잡한 robustness task에서는 수정 DGM 15/15·12/15와 14/15·14/15, SICA는 14/15·10/15, 13/15·11/15, Sonnet run 15/15·15/15, Hyperagents 두 run 모두 15/15·15/15였다.

clean continuation에서도 수정 DGM은 28/30이 취약했고 security-oriented CWE benchmark에서는 27/30이었다. 명시적 decontamination 이후 8/30으로 줄었지만 완전히 사라지지 않았다. backdoor는 optional 조건에서 잘 전이되지 않았으나 required 변형의 최상 agent는 held-out 30개 중 12개에서 전체 record store를 반환했다.

실제 발견된 취약점 / 사례

상용 제품 CVE를 발견한 연구는 아니다. 실험에서 생성된 대표 결함은 Python HTTPS 요청의 hostname·certificate 검증 비활성화(CWE-295), redirect마다 목적지를 재검증하지 않는 SSRF 패턴, export keyword로 전체 저장소를 반환하는 backdoor다.

실제 위험은 취약 코드 한 건보다 오염된 agent 버전이 조직 내 “개선된 기본 agent”로 배포되는 공급망 구조다. 이후 benchmark가 사라져도 여러 프로젝트에 동일 결함을 반복 삽입할 수 있다.

저자 주장 vs 실제 증명 범위

저자들은 benchmark poisoning이 자기개선 scaffold를 오염시키고 clean task로 전이·지속될 수 있음을 세 연구 시스템에서 입증했다. 특히 clean control 0/30과 poisoned run의 높은 전이율은 인과관계를 강하게 지지한다.

하지만 compiler trusting-trust처럼 소스 검토로도 숨는 완전한 재귀 백도어나 production agent의 장기 감염을 입증한 것은 아니다. 공격의 신뢰도는 취약성 형태, 모델, harness, benchmark 농도에 따라 달랐다.

기존 공격 / 기존 점검 방식과의 차이

일반 prompt injection은 악성 입력이 컨텍스트에 있을 때 행동을 바꾼다. 여기서는 악성 benchmark가 제거된 뒤에도 자기수정된 도구와 지침이 남아 이후 입력에 영향을 준다.

모델 학습 데이터 poisoning과도 다르다. 가중치는 고정되고 agent scaffold만 진화하므로 모델 hash나 fine-tuning lineage 검증만으로는 찾기 어렵다. agent version 간 도구·프롬프트 diff와 behavioral regression이 필요하다.

연구의 한계와 주의해서 볼 부분

저자들은 오염 task 포화, 연구용 agent 시스템, 모델·harness 의존성, 더 은밀한 혼합 benchmark 미평가를 후속 과제로 둔다. 실험은 연구진 소유 환경에서만 수행했고 관련 시스템 저자들에게 초안을 공유했다.

추가로 success metric은 생성 코드에 특정 취약 pattern이 있는지에 크게 의존한다. 정적 분류가 실제 exploitability를 과대평가할 수 있으므로 behavioral witness, 현실 네트워크 정책, repository context까지 포함해야 한다.

공개 PoC / Exploit / Tool / Artifact 분석

공식 GitHub 저장소는 2026-09-18 현재 공개 접근 가능하다. benchmarks/에 poisoned·clean twin 생성기와 metadata, evaluation/에 vulnerability classifier와 behavioral witness, results/에 DGM·SICA·Hyperagents run, modifications/에 upstream 대비 patch가 있다.

재현에는 각 upstream agent 저장소와 해당 모델/API 환경이 필요하며 API key와 base agent snapshot은 포함되지 않는다. artifact는 benchmark 생성과 결과 분류를 뒷받침하지만 동일 모델 서비스와 비용 없이 full evolution 전체를 즉시 재현하는 완전 패키지는 아니다.

레드팀 / 모의해킹에서 어떻게 활용할까

자기개선 agent의 외부 benchmark·평가 플러그인을 공급망 입력으로 취급하고, clean twin과 poisoned twin이 어떤 persistent diff를 만드는지 비교할 수 있다. 테스트는 격리 fork에서 수행하고 운영 agent registry로 승격하지 않아야 한다.

중단 기준은 새 agent가 안전 invariant를 위반하는 code emitter나 상시 지침을 생성하는 순간이다. 이후 실제 취약 코드를 배포하지 말고 diff, 호출 로그, held-out regression으로 영향만 입증한다.

실제 점검 시 추가할 체크리스트

  • benchmark 출처·서명·review owner가 기록되는가
  • hidden test가 취약 구현만 보상하는 역전 조건이 없는가
  • self-modification diff에 보안 정책 검사가 적용되는가
  • clean twin과 adversarial twin 회귀시험이 있는가
  • 새 helper가 기본적으로 안전한 코드를 생성하는가
  • held-out security benchmark가 selection score에 포함되는가
  • agent version rollback과 lineage 추적이 가능한가
  • prompt·tool·code 변경을 사람이 승인하는가
  • SAST 결과가 세대별로 악화되지 않는가
  • decontamination 후에도 behavioral witness를 반복하는가

실무 가치 평가

현재 self-improving coding agent를 운영에 직접 쓰는 조직은 적지만, 자동 prompt optimization·tool evolution·benchmark-driven agent tuning에는 바로 적용할 수 있는 위험 모델이다. 단순 모델 공급망을 넘어 evaluation 공급망도 신뢰 경계라는 점이 가장 중요한 가치다.

결론

자기개선 시스템은 점수가 오른 변경을 곧바로 신뢰해선 안 된다. 안전 속성을 별도 불변조건으로 평가하고, benchmark provenance와 agent lineage를 함께 관리해야 일시적 오염이 조직 표준 도구로 굳는 것을 막을 수 있다.

반응형

댓글