
Claude Code 및 Codex의 악의적인 스킬이 정적 스캐너를 우회하는 방식
요약
Claude Code와 Codex 같은 AI 코딩 에이전트의 '스킬(Skill)' 기능을 악용한 공급망 공격 위험성을 경고합니다. 악성 스킬이 정적 스캐너를 우회하여 인증 정보를 탈취하거나 백도어를 설치하는 구체적인 수법과 연구 결과를 다룹니다.
핵심 포인트
- 에이전트 스킬은 자연어 지시문 형태라 기존 코드 스캐너로 탐지가 어려움
- 악성 스킬의 약 37%가 보안 문제를 포함하며, 91%가 프롬프트 인젝션을 병용함
- 구조적 난독화와 자기 해제 패킹을 통해 정적 스캔을 효과적으로 우회함
- 에이전트 스킬은 실행 환경에 대해 에이전트와 동일한 권한을 가짐
Claude Code에 「PDF를 깔끔하게 요약하는 스킬」을 넣었다고 가정하자. 그 내용은 SKILL.md라는 Markdown 파일 한 장뿐이며, 자연어로 된 절차와 약간의 스크립트가 적혀 있을 뿐이다. GitHub에서 가져와 skills 폴더에 두기만 하면, 다음부터 에이전트가 그것을 읽고 실행해 준다. 간편하다. 너무 간편해서 문제다. 그 스킬은 당신의 셸(Shell), 파일, 저장된 인증 정보에 에이전트와 완전히 동일한 권한으로 접근할 수 있다.
이 「에이전트 스킬 (Agent Skill)」을 노린 공격과, 이를 찾아내야 할 스캐너가 실제로는 거의 기능하지 않고 있다는 연구가 7월 초에 잇따라 발표되었다. 홍콩 과기대(HKUST)의 프리프린트(Preprint)인 Cloak and Detonate와 Snyk의 실지 조사인 ToxicSkills가 그것이다. 전자는 「정적 스캔 (Static Scan)은 원리적으로 우회될 수 있음」을, 후자는 「실제 마켓플레이스가 이미 오염되어 있음」을 보여주고 있으며, 이 둘을 나란히 놓고 보면 이야기가 매끄럽게 연결된다.
스킬은 npm 패키지보다 위험하다
먼저 전제를 맞추고 싶다. 에이전트 스킬은 AI 코딩 에이전트(Claude Code나 OpenAI Codex 등)에게 「이 도구는 이렇게 사용하라」고 가르치는 재사용 가능한 확장 기능이다. Snyk의 설명에 따르면, 그 실체는 SKILL.md라는 Markdown으로, 설치 절차와 실행 지시가 적혀 있다. 즉, 문서인 동시에 실행 트리거(Trigger)이기도 하다. 이 점이 까다로운 부분인데, npm install로 설치하는 라이브러리라면 내용은 적어도 코드로서 읽을 수 있다. 하지만 스킬의 「코드」는 에이전트가 해석하여 자신의 손으로 실행하는 자연어 지시다.
배포 장벽도 낮다. Snyk이 조사한 ClawHub라는 마켓은 공개에 필요한 것이 SKILL.md 한 장과 「생성 후 1주일이 지난 GitHub 계정」뿐이었다고 한다. VS Code 확장이나 npm에서 반복되어 온 공급망 오염(Supply Chain Contamination)이, 심사가 더 허술한 곳에서 재연되고 있다고 읽는 것이 자연스럽다.
Snyk이 ClawHub와 skills.sh에서 수집한 3,984건의 스킬을 분석한 결과는 다음과 같다.
| 지표 | 건수 / 비율 |
|---|---|
| 어떠한 보안 문제를 포함함 | 1,467건(36.82%) |
| ... |
수법은 주로 세 가지다. 비밀번호가 걸린 ZIP 파일로 스캔을 피하면서 외부 바이너리를 다운로드 및 실행시키는 것, Base64나 Unicode로 난독화하여 AWS 인증 정보나 API 키를 훔치는 것, 그리고 에이전트의 안전 기제 자체를 무효화하여 백도어(Backdoor)를 남기는 것이다. 악성 코드의 91%는 여기에 더해 프롬프트 인젝션 (Prompt Injection)을 병용하고 있었다는 점이 개인적으로 가장 불쾌한 수치였다. 실행 환경을 더럽힐 뿐만 아니라, 에이전트의 판단 자체를 탈취하려 들고 있다.
「겉모습」으로 판단하는 한 패배한다
그렇다면 방어 측은 어떠한가. 여기서 HKUST의 Cloak and Detonate(Zimo Ji 외, Shuai Wang, Shing-Chi Cheung 참여)가 핵심적인 역할을 한다. 저자들은 정적 스캐너를 회피하는 프레임워크인 SkillCloak를 제작하여 기존의 8개 스캐너를 대상으로 테스트했다. 사용하는 기술은 단 두 가지다.
하나는 구조적 난독화(Structural Obfuscation)다. 수상한 토큰이나 커맨드, URL, 인증 정보 경로를 의미는 같게 유지하면서 다른 모습으로 바꿔치기한다. 다른 하나는 자기 해제 스킬 (Self-Extracting Skill) 패킹으로, 이것이 매우 지독하다. 악성 본체를 설치 시에는 숨겨두었다가, 에이전트가 실제로 스킬을 실행하는 순간에 처음으로 복원한다. 정적 스캐너가 파일을 들여다보는 시점에는 그곳에 악의적인 코드가 존재하지 않는다.
결과적으로, 약 1,600건의 실제 악성 스킬을 사용한 검증에서 자기 해제 패킹은 8개의 스캐너 모두를 9할 이상의 확률로 우회했다. 구조적 난독화만으로도 정적 스캐너를 8할 이상, 정적과 동적을 결합한 하이브리드형에서도 96%를 돌파했다. 「설치 전에 스캔하여 안전하면 설치한다」는 운용 방식은 이 한 수에 무너진다. 2차 보도(Cyber Security News)는 300개 이상의 오염된 패키지를 퍼뜨려 정보 탈취를 시도한 ClawHavoc라는 캠페인의 존재도 전하고 있다. 연구상의 위협 모델이 아니라, 이미 현실에서 움직이고 있는 문제다.
해결책은 「폭발시켜서 관찰하기」
동일한 논문에서 대책도 제시하고 있다는 점이 다행이다. SkillDetonate는 이름 그대로, 스킬을 샌드박스(Sandbox) 내에서 실제로 폭발(실행)시켜 OS 경계에서 어떤 일이 일어나는지 관측한다. 파일 액세스, 네트워크 호출, 민감 데이터의 흐름 등을 살핀다. 실행 시점에 비로소 모습을 드러내는 지시를 포착하는 on-demand closure lift와, 민감 데이터의 유출을 마커로 추적하는 taint 분석(Taint Analysis)을 결합하여, 97%를 탐지(오탐 2%)했으며, 실제 환경의 악성 스킬에서도 87%를 포착했다고 보고하고 있다. 외형이 아닌 동작(Behavior)으로 판단한다는, 당연하지만 결정적인 전환이다.
여기서 실무자가 얻어갈 수 있는 교훈은 비교적 명확하다. 스킬의 설치는 curl | bash와 동일한 위험도를 가진다고 각오하는 것이다. 적어도, 실제 운영 환경의 인증 정보가 살아있는 환경에서 에이전트에게 출처를 알 수 없는 스킬을 먹이는 것은 지양해야 한다. Snyk는 자사의 mcp-scan을 통해 도입된 스킬의 목록을 점검(Inventory)하고, 특정 공격자 계정으로부터 유래된 것을 삭제한 뒤 인증 정보를 로테이션(Rotation)할 것을 권고하고 있다. 도구가 자사 제품이라는 점은 차치하더라도, 방향성은 옳다.
내가 한 단계 더 깊게 유효하다고 생각하는 것은 스캔보다 권한과 프로비넌스(Provenance, 출처) 측면이다. 스킬이 왜 당신의 쉘(Shell)과 인증 정보에 대한 전체 액세스 권한을 가질 필요가 있는가? 많은 스킬에 그 필연성은 없다. 에이전트 런타임(Agent Runtime) 측에서 스킬마다 접근할 수 있는 파일이나 네트워크 대상을 제한할 수 있는 메커니즘, 즉 SkillDetonate가 수행하는 것과 같은 실행 시점의 샌드박스 격리를 표준으로 갖추지 않는 한, 이 구멍은 메워지지 않는다. 정적 스캐너(Static Scanner)를 한 겹 거치는 것만으로 안심하던 시대는, 적어도 에이전트 스킬에 관해서는 이미 끝났다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기