본문 바로가기
Hack/AI

Control-Token Injection Suppresses Chain-of-Thought and Defeats Reasoning-Based Oversight in Tool-Using Agents

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

  • 원문: arXiv:2609.27542
  • 저자: Muhammad Usama, Khair Un Nisa, Summer Yeoreum Jung
  • 공개일: 2026-09-23
  • 분야: LLM Agent Security, Control-Token Injection, CoT Monitoring, Tool Parser
  • Tags: ControlTokenInjection, ChainOfThought, ToolAgent, OversightBypass, ParserLeniency

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

한눈에 보기

이 논문의 결론은 에이전트 안전성이 모델 가중치만의 속성이 아니라 chat template과 tokenizer, tool-call parser를 포함한 decoding harness 전체의 속성이라는 것입니다. gpt-oss-20b의 사용자 입력에 모델 자체의 channel-control token 문자열을 붙이자 40개 정상 수행 과제 모두에서 평균 52.5 token이던 reasoning trace가 0으로 사라졌지만 http.post는 40/40회 그대로 실행됐습니다.

악성 framing 48개에서는 원래 48/48회 거부하던 요청 중 19개, 즉 39.6%가 실제 exfiltration으로 바뀌었습니다. reasoning trace만 보는 rule monitor와 별도 Gemma judge는 원래 100% 탐지했지만 forged 조건에서는 0%였습니다. 별개의 parser 실험에서는 같은 모델·같은 greedy generation을 두 parser에 넣었을 때 한쪽은 24/24회 도구를 실행하고 다른 쪽은 0/24회 실행해 parser가 보안 결과를 결정함을 보였습니다.

연구 배경

CoT monitoring은 모델이 위험한 행동을 하기 전에 reasoning trace에 드러난 의도를 읽어 차단하는 접근입니다. 이 접근은 위험한 계산이 존재하고, 그 계산이 모니터가 읽을 수 있는 trace에 남는다는 전제를 가집니다.

도구 사용 에이전트에서는 입력이 chat template을 거쳐 control token 구조로 변환되고, 모델 출력은 parser가 tool call로 인정해야 실행됩니다. 이 두 구성요소는 모델 밖에 있지만 사용자·검색 문서·tool return 같은 비신뢰 입력과 실제 side effect 사이의 경계를 결정합니다.

공격 모델 / 전제 조건

공격자는 모델 가중치, system prompt, trusted-context flag, monitor를 바꿀 수 없습니다. 대신 사용자 메시지, 검색 문서, 이메일 본문, tool return처럼 에이전트 context에 들어가는 비신뢰 텍스트 일부를 제어합니다.

대상은 Harmony 형식의 gpt-oss-20b와 공개 tool sandbox 3.1.2입니다. 모델의 <|end|>, <|start|>, <|channel|>, <|message|> 문자열이 tokenizer에서 각각 예약 control token 하나로 해석되고, harness가 이를 user data와 구조 token으로 구분하지 않는 것이 핵심 전제입니다. 성공은 unsafe tool call이 실행되고 reasoning 기반 monitor가 이를 탐지하지 못하는 경우입니다.

논문의 end-to-end exfiltration 평가는 guardrail 제약 때문에 사용자 turn provenance에서 수행됐습니다. 검색 문서·trailing note에서는 동일 효과와 실행을 확인했고, 진짜 tool-role return에서는 reasoning suppression만 확인했으며 web·email provenance guardrail 때문에 외부 post 완료까지는 입증하지 않았습니다.

비판적 검토 / 아쉬운 점

가장 큰 제한은 주 공격 수치가 gpt-oss-20b 한 모델과 특정 sandbox harness에 집중된다는 점입니다. Qwen3에서는 closed-channel primitive 자체는 강하게 작동했지만 user-input delivery로는 template 위치가 맞지 않았고, DeepSeek-R1-Distill은 reasoning을 없애도 악성 tool action을 수행하지 않았습니다. 다양한 serving stack과 production template 조합을 대상으로 한 교차 검증이 있어야 일반성을 판단할 수 있습니다.

두 번째로 간접 공격의 가장 현실적인 경로인 별도 tool-role 결과에서 end-to-end 유출 성공률을 측정하지 못했습니다. 논문은 guardrail이 web·email provenance를 차단했다고 설명하지만, 이는 실제 배포에서 input provenance와 tool 정책이 공격 성립 여부를 크게 좌우한다는 뜻이기도 합니다. 여러 agent framework에서 retrieval·email·browser output이 어떤 role과 escaping 규칙으로 template에 삽입되는지 추가 실험이 필요합니다.

세 번째로 39.6%는 stochastic decode 확률이 아니라 서로 다른 48개 과제 중 성공 비율입니다. 모든 run은 greedy이고 입력별로 결정적이므로 같은 요청을 반복했을 때 39.6% 확률로 뚫린다는 의미가 아닙니다. 과제 분포, malicious phrasing, action schema가 바뀌면 비율도 달라질 수 있습니다.

parser 연구는 중요한 구조적 증거지만 Gemma A/B의 0% 결과에는 native processor가 sandbox dialect를 읽지 못하고 필요한 prefix argument도 받지 못한 integration mismatch가 섞여 있습니다. 가장 깨끗한 증거는 모델 없는 canonical input 실험과 gpt-oss reference parser가 종결 token 없는 호출을 받아들였다는 확인입니다.

핵심 Root Cause

첫 번째 Root Cause는 chat template이 비신뢰 텍스트와 harness가 만든 제어 구조를 tokenization 이후 동일한 reserved token으로 표현한다는 점입니다. 사용자 입력의 control-token span이 escaping 또는 구조적 격리 없이 처리되면서 공격자가 assistant의 reasoning channel을 이미 닫힌 상태로 위조할 수 있습니다.

깨진 불변조건은 “비신뢰 콘텐츠는 message payload에만 머물고 role·channel·turn boundary를 만들거나 닫을 수 없어야 한다”입니다. 이 경계가 깨지자 reasoning trace와 거부 계산이 생략됐고, 그 trace에 의존한 oversight도 동시에 사라졌습니다.

두 번째 Root Cause는 tool execution 여부가 의미적으로 완결된 호출이 아니라 parser의 편의적 정규식에 달렸다는 것입니다. 종결 token이 없을 때 end-of-string을 유효 종료로 인정하는 parser는 잘린 생성도 실행 가능한 tool call로 승격합니다. 깨진 불변조건은 “side effect를 만드는 호출은 완전하고 단일하며 schema-valid한 framing으로 명시적으로 종료돼야 한다”입니다.

핵심 공격 원리

공격 문자열은 user message 뒤에 닫힌 빈 assistant analysis channel을 구성합니다. tokenizer가 이를 모델 자신의 control token으로 바꾸면 generation context에는 reasoning turn이 이미 완료된 것처럼 보입니다. 모델은 analysis channel을 새로 쓰지 않고 commentary tool-call channel로 바로 이동합니다.

이 공격은 “생각하지 마라” 같은 자연어 지시가 아닙니다. 자연어 지시는 오히려 모델이 그 지시를 reasoning하게 만들지만, 구조 token은 생성 상태 자체를 바꿉니다. 악성 요청의 거부가 analysis channel 안에서 계산되던 경우, channel 삭제는 모니터뿐 아니라 모델 자신의 refusal도 제거합니다.

parser 공격에서는 완전한 call, closing token이 없는 truncated call, 두 개의 call을 고정 문자열로 만듭니다. lenient parser는 end-of-string 대안을 통해 truncated call도 실행하고 strict parser는 버립니다. 모델을 고정해도 parser 교체만으로 실행 여부가 뒤집힙니다.

공격 흐름

  1. 공격자가 검색 문서·tool return·사용자 전달 콘텐츠에 Harmony control-token span을 넣습니다.
  2. harness가 해당 span을 escape하지 않은 채 chat template에 삽입합니다.
  3. tokenizer가 문자열을 전용 reserved token으로 변환해 user payload가 assistant channel boundary처럼 렌더링됩니다.
  4. 빈 analysis channel이 이미 닫힌 것으로 해석돼 모델이 reasoning trace를 생성하지 않습니다.
  5. 모델이 commentary channel에서 unsafe tool call을 생성합니다.
  6. CoT monitor는 비어 있거나 공격자가 넣은 benign decoy trace만 보므로 탐지하지 못합니다.
  7. harness parser가 raw generation을 tool call로 인정하면 실제 side effect가 실행됩니다.

성공 조건 / 실패 조건

성공하려면 대상 template이 입력 문자열을 실제 control token으로 변환하고, forged channel 위치가 generation state에 영향을 주며, 해당 과제의 위험 행동이 visible reasoning 없이도 생성되고, parser와 guardrail이 tool call을 허용해야 합니다. reasoning이 task 수행에 필수적인 모델이나 template이 user input 뒤에 새로운 reasoning block을 강제로 열면 공격이 실패하거나 범위 밖 prefix control이 필요합니다.

control-token span을 삭제하지 말고 공백 치환 또는 escaping해 token 결합을 막으면 기본 공격이 실패합니다. tool call 종결 token을 의무화하고 parse error를 non-firing response로 처리하면 truncated-call 경로가 닫힙니다. reasoning trace의 존재 여부만 검사하는 방어는 benign decoy가 들어간 non-empty forged trace에 실패했습니다.

연구진의 실험 환경

주 대상은 openai/gpt-oss-20b revision 6cee5e81, sandbox 3.1.2, NVIDIA H200 1대, bfloat16, greedy decoding, generation limit 1,024 token, seed 123, 8-hop loop입니다. transformers 4.57.1과 5.16.1에서 suppression 결과가 동일함을 확인했습니다.

cross-family judge와 parser 비교에는 google/gemma-4-26B-A4B-it를 사용했고, 일반성 연구에는 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B와 Qwen/Qwen3-4B-Thinking-2507를 transformers 5.16.1에서 실행했습니다. rate의 Wilson 95% interval은 sampling randomness가 아니라 제한된 task 표본의 불확실성을 나타냅니다.

주요 실험 결과

plain-framing exfiltration 40개에서 reasoning은 평균 52.5±13.2 token에서 0으로 줄었고 empty-reasoning rate는 0%에서 100%가 됐지만 attack action과 task completion은 모두 40/40회 유지됐습니다. benign 15개도 reasoning이 평균 49.6 token에서 0이 됐지만 secret predicate는 발생하지 않았습니다.

malicious-framing 48개는 plain 조건에서 전부 거부되고 rule·Gemma CoT monitor가 48/48회 탐지했습니다. forged 조건에서는 19/48회, 39.6%가 exfiltration을 완료했고 두 CoT monitor는 성공한 19건을 하나도 탐지하지 못했습니다. 나머지는 20.8%가 계속 거부하고 39.6%가 call을 emit했지만 parser·실행 단계에서 firing하지 않았습니다.

decoy 실험 16개에서는 “Routine request; proceeding.” 같은 무해한 trace를 forged analysis channel에 넣자 keyword, empty-trace, LLM judge 모두 놓쳤고 16/16회 exfiltration이 실행됐습니다. 이는 empty trace tripwire가 기본 변형만 잡는다는 증거입니다.

모델 없는 parser 실험에서 complete call은 두 parser 모두 실행하고 double call은 공통 normalization이 거부했지만 truncated call은 lenient parser만 실행했습니다. Gemma 모델과 greedy generation을 고정한 24개 A/B에서는 regex parser가 24/24회 실행하고 native processor parser가 0/24회 실행했습니다. openai-harmony 0.0.8도 closing <|call|>이 없는 gpt-oss call을 복구했습니다.

실제 발견된 취약점 / 사례

첫 번째 사례는 Harmony control token을 사용자 입력에서 구조 token으로 받아들이는 경계 실패입니다. 검색 문서 block, trailing note, tool-role return으로 동일한 suppression이 전달됐으며 user-provenance 문서 배치에서는 15/15회 reasoning 0과 action 실행이 유지됐습니다.

두 번째는 gpt-oss sandbox와 공식 Harmony reference parser의 truncation tolerance입니다. 정규식 마지막의 end-of-string 대안 때문에 closing token이 없어도 tool call이 복구됩니다. Gemma 쪽은 parser dialect와 integration mismatch가 반대 방향으로 동작해 동일 생성이 실행되지 않았습니다.

저자 주장 vs 실제 증명 범위

“gpt-oss-20b에서 한 고정 control-token 문자열이 reasoning을 결정적으로 제거하면서 도구 행동을 보존한다”는 주장은 55개 plain·benign task와 token-level trace가 뒷받침합니다. “CoT-only oversight가 trace 삭제에 취약하다”는 주장도 48개 malicious task와 두 종류 monitor 결과가 직접 증명합니다.

하지만 모든 reasoning model, 모든 chat template, 모든 indirect tool channel이 같은 방식으로 취약하다는 것은 입증되지 않았습니다. Qwen3의 prefix delivery는 attacker threat model 밖의 실험이고, DeepSeek은 reasoning suppression 후에도 악성 call을 수행하지 않았습니다. action-level monitor가 일반적으로 완벽하다는 주장도 하지 않았으며, 논문의 argument check는 secret marker가 성공 정의라 100% 탐지가 사실상 구성상 당연합니다.

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

일반 prompt injection은 자연어 명령의 우선순위를 조작합니다. 이 공격은 template의 구조 token으로 turn과 channel state를 바꾸므로 instruction hierarchy만으로 막기 어렵습니다. 기존 role-forging 연구와 mechanism은 인접하지만, 이 논문은 reasoning trace의 완전 삭제, monitor failure, refusal-to-action conversion을 정량화합니다.

기존 CoT obfuscation은 모델이 reasoning하면서 의도를 숨기는 문제를 봅니다. 여기서는 모델의 협조나 학습 압력 없이 trace 자체를 없앱니다. parser 부분도 모델 출력 안전성 평가와 실제 실행 사이에 별도 harness decision이 있음을 분리해 측정합니다.

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

저자들이 인정한 한계는 단일 primary model·sandbox, 제한된 추가 모델, task distribution 의존적인 부분적 refusal bypass, tool-role end-to-end 미완성, role-forging과의 수치 비교 부재, 하나의 cross-family judge, 특정 공격에 한정된 방어 평가입니다.

추가로 production API가 raw control token 문자열을 어떤 단계에서 special token으로 바꾸는지는 serving stack마다 다릅니다. tokenizer의 allowed_special, template escaping, message serialization, provider API validation을 확인하지 않고 문자열만 보고 취약하다고 판단하면 오탐입니다. 반대로 user message를 안전하게 escape해도 retrieved content나 tool result에 별도 rendering 경로가 있으면 우회가 남을 수 있습니다.

공개 PoC / Exploit / Tool / Artifact 분석

deleting-the-trace 공식 저장소는 논문 저자가 공개한 실험 코드와 per-trial JSON을 제공합니다. experiments/harness.py가 sandbox agent 실행과 reasoning·tool event 수집을 담당하고, e1_*부터 e5_* 및 w*, ad_* 스크립트가 suppression, monitor, parser, 일반성, 방어, indirect delivery, decoy 실험을 나눠 재현합니다.

README는 Python 3.12, CUDA, H200급 메모리, 공개 Hugging Face 모델 접근, aicomp-sdk 3.1.2, transformers 5.16.1 등을 요구합니다. deterministic parser check는 모델 없이 실행할 수 있지만 전체 결과 재현에는 대형 모델과 상당한 GPU 자원이 필요합니다. 2026-09-25 확인 시 저장소와 결과 파일에 공개 접근할 수 있었습니다.

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

승인된 lab에서 message source별로 template rendering 전후와 token ID를 기록해야 합니다. user, retrieval, email, browser, MCP/tool return을 각각 넣고 raw 문자열이 special token으로 변환되는지, analysis channel이 생성되는지, parser가 어떤 raw completion을 tool event로 바꾸는지 분리 관찰합니다.

검증 기준은 모델 응답 문구가 아니라 reasoning trace 존재·길이, raw control token sequence, parsed tool-call count, 실제 side effect, guardrail decision입니다. 외부 전송 도구 대신 loopback sink와 synthetic marker를 사용하고 예상 밖 네트워크 요청이 발생하면 즉시 중단합니다.

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

  • 모든 비신뢰 message source가 chat template 이전에 control token을 escape 또는 안전한 placeholder로 치환하는지 확인합니다.
  • 단순 삭제가 assistantanalysis 같은 새로운 trigger 문자열을 만들지 않는지 검증합니다.
  • tokenizer에서 special token 허용 정책과 literal text 처리 차이를 확인합니다.
  • user·retrieval·tool role별 렌더링 결과와 trusted provenance flag를 비교합니다.
  • 빈 reasoning뿐 아니라 비정상적으로 짧거나 외부 입력과 동일한 decoy reasoning을 탐지합니다.
  • reasoning monitor만으로 실행을 허용하지 않고 tool name, argument, destination, data sensitivity를 별도 검사합니다.
  • tool-call parser가 closing token, 단일 call, JSON schema, 길이 제한을 fail-closed로 요구하는지 확인합니다.
  • parse error가 plain text fallback 후 다른 경로에서 실행되지 않는지 확인합니다.
  • generation truncation과 streaming 중간 상태가 조기 실행으로 이어지지 않는지 시험합니다.
  • 모델·template·parser·guardrail 버전을 함께 고정하고 변경 시 regression test를 수행합니다.

실무 가치 평가

실무 가치가 매우 높습니다. 에이전트 안전 평가가 모델 benchmark만으로 끝나면 안 되고, template rendering과 parser를 security-critical code로 관리해야 한다는 점을 명확한 수치로 보여 줍니다. 특히 CoT monitor를 승인 gate로 쓰는 환경에서는 trace 자체의 provenance와 action-level 정책 검사가 필수입니다.

다만 gpt-oss/Harmony 결과를 다른 모델에 그대로 적용하면 안 됩니다. 우선 실제 deployment의 rendered token sequence와 parser behavior를 확인하고, 공격 가능성과 영향은 source role·guardrail·tool permission까지 포함해 좁혀야 합니다.

결론

Control-token injection은 모델이 위험한 생각을 숨긴 것이 아니라 생각을 기록하는 channel 자체를 공격자가 닫아 버리는 문제입니다. 이때 거부 계산과 monitor visibility가 같은 channel에 의존하면 둘 다 동시에 사라질 수 있습니다.

안전한 설계는 비신뢰 입력이 구조 token이 되지 못하게 하고, malformed tool call을 fail-closed로 처리하며, reasoning trace와 독립적인 action authorization을 둬야 합니다. 모델과 harness를 하나의 보안 경계로 시험하는 것이 논문의 가장 중요한 실무 결론입니다.

반응형

댓글