Config Files That Run Code: Supply Chain Security Blindspot
TL;DR Highlight
VS Code, Cursor, Claude Code, npm 등 널리 쓰이는 도구들이 config 파일에 담긴 shell 명령을 자동 실행하는 구조를 악용한 공급망 공격 사례를 분석한 글로, 개발자가 저장소를 clone하고 에디터를 여는 순간 공격자 코드가 실행될 수 있다.
Who Should Read
오픈소스 저장소를 clone해서 작업하거나 AI 코딩 에이전트(Cursor, Claude Code 등)를 사용하는 개발자, 그리고 팀에 주니어 개발자가 있어 보안 가이드를 제공해야 하는 시니어 개발자나 DevSecOps 담당자.
Core Mechanics
- 저장소를 clone하고 에디터나 에이전트를 열기만 해도 공격자 코드가 실행될 수 있다. 악성 의존성이나 install 스크립트 없이, 평범해 보이는 config 파일 하나만으로 가능하다.
- VS Code, Cursor, Claude Code, Gemini CLI, npm, Composer, Bundler 모두 config 파일에 shell 명령을 담을 수 있고, 폴더를 열거나 에이전트 세션이 시작될 때 자동으로 실행된다. 대부분은 개발자가 무심코 클릭하는 일회성 trust 프롬프트 뒤에서 작동한다.
- 실제 사례로 'Miasma 웜'이 분석됐다. icflorescu/mantine-datatable 저장소에 커밋 f72462d9가 들어왔는데, github-actions 봇 이름으로 서명 없이 푸시된 커밋이며 'chore: update dependencies [skip ci]'라는 제목으로 위장했다.
- 해당 커밋은 파일 6개를 추가했는데, 5개는 6번째 파일인 `.github/setup.js` 드로퍼를 실행하기 위한 런처다. 드로퍼 파일 크기는 4,348,254바이트(약 4.3MB)로, GitHub 코드 검색 인덱싱 한계(약 384KB)를 초과해 내용이 검색에 노출되지 않도록 설계됐다.
- 드로퍼 코드는 Caesar cipher(문자 회전 암호)로 난독화된 숫자 배열을 eval()로 실행하는 구조다. 시프트값 4로 정적 디코딩하면 AES로 암호화된 credential stealer를 복호화해 실행하는 Bun 로더가 나온다.
- credential stealer는 AWS, Azure, GCP, Vault, Kubernetes, npm, GitHub 시크릿을 스캔하고, 탈취한 정보를 공격자가 만든 공개 GitHub 저장소로 exfiltrate(외부 유출)한다. 이 패턴으로 121개 저장소가 영향을 받았다.
- 이 난독화 패턴(숫자 배열 → 소형 회전 함수 → eval → 암호화된 페이로드)은 Miasma에만 국한된 게 아니라, supply chain 공격자들이 재사용하는 범용 패턴이다. config 파일이 명령 실행 트리거가 되는 이상, 메타데이터가 아니라 실행 프리미티브로 봐야 한다.
- 보안 리뷰 프로세스에서 config 파일은 거의 검토되지 않는다는 게 핵심 문제다. `.vscode/settings.json`, `.cursor/config`, `package.json`의 scripts 필드 등은 코드 리뷰에서 흔히 그냥 넘어간다.
Evidence
- '이건 MS Word 매크로 사태의 재현이다'라는 비유가 나왔다. 실행 가능한 콘텐츠를 문서나 설정 파일에 숨기는 패턴은 수십 년째 반복되고 있다는 지적이다.
- VS Code를 사용하는 주니어 개발자를 둔 팀 리더가 '이런 공격이 있다는 건 들었지만 정확히 어떻게 작동하는지 몰랐는데 이 글이 팀원들에게 설명하기 좋은 자료가 됐다'고 공유했다.
- Windows Defender가 하루에 2~3번 codex/config.toml을 '악성코드 분석 제출' 요청하는 현상을 경험한 사용자가 있었다. 이 글을 보고 그 이유를 이해하게 됐다는 반응이며, Microsoft가 경쟁사 도구 사용 패턴을 수집하려는 의도도 있을 수 있다는 의구심도 제기됐다.
- '이게 blindspot이라고? 몇 년 동안 사람들이 지적해왔는데 아무도 안 신경 쓴다'는 냉소적 반응도 있었다. 보안 사고가 나도 잠깐 관심받다가 잊혀지는 패턴이 반복된다는 지적이다.
- 'VS Code가 config 파일의 명령 실행을 완전히 막을 수 있냐'는 실용적인 질문이 나왔지만 명확한 답변은 없었다. CIA도 이걸 '기능'으로 본다는 비꼬는 댓글도 달렸는데, 이미지나 링크를 '실행'하려는 메신저 앱들과 같은 맥락이라는 비유였다.
How to Apply
- 오픈소스 저장소를 clone할 때 에디터로 열기 전에 `.vscode/`, `.cursor/`, `.github/`, `package.json` scripts 필드, `composer.json`, `Gemfile` 등 config 파일을 먼저 텍스트로 확인하는 습관을 들이면, 자동 실행 트리거를 사전에 감지할 수 있다.
- CI/CD 파이프라인에서 PR 리뷰 자동화 도구에 `.vscode/settings.json`, `.cursor/**`, `.github/*.js` 같은 config 파일 변경이 포함된 PR을 별도로 플래그하도록 설정하면, 코드 리뷰에서 놓치기 쉬운 config 파일 수정을 의무 검토 대상으로 올릴 수 있다.
- AI 코딩 에이전트(Cursor, Claude Code, Gemini CLI)를 팀에 도입한 경우, 에이전트가 자동으로 읽는 config 파일 경로 목록을 문서화하고, 외부 저장소 코드를 에이전트 작업 디렉토리에 포함할 때 해당 파일들을 격리된 환경(예: devcontainer, VM)에서 먼저 확인하는 프로세스를 만들면 초기 실행 위험을 줄일 수 있다.
- 팀 내 보안 가이드에 'commit이 github-actions 봇 이름이지만 서명이 없고, skip ci 태그가 있으며, 대용량 파일(수백 KB 이상)이 `.github/` 아래 추가된 경우'를 의심 패턴으로 추가하면 Miasma류 공격을 조기에 탐지하는 데 도움이 된다.
Code Example
// .github/setup.js @ f72462d9 (악성 드로퍼 첫 180바이트 예시)
// Caesar shift로 난독화된 숫자 배열을 eval로 실행하는 패턴
try{
eval(
function(s,n){
return s.replace(/[a-zA-Z]/g, function(c){
var b = c <= "Z" ? 65 : 97;
return String.fromCharCode((c.charCodeAt(0) - b + n) % 26 + b)
})
}(
[40,119,111,117,106,121,40,41,61,62,123, /* ... 4MB truncated */],
4 // Caesar shift value
)
)
} catch(e) {}
// 이 패턴이 config 파일에서 발견되면 즉시 실행 중단 필요
// 디코딩하면: AES 암호화된 credential stealer 로더가 나옴Terminology
Related Papers
Show HN: ctx – Search the coding agent history already on your machine
Claude Code, Cursor, Codex 등 코딩 에이전트가 이전 세션의 논의·결정·실패 시도를 잊지 않도록 SQLite로 인덱싱해 재사용할 수 있게 해주는 오픈소스 CLI 도구다.
Micro-Agent: Beat Frontier Models with Collaboration Inside Model API
vLLM 팀이 단일 모델 API 호출 뒤에서 여러 모델이 협업하는 'Micro-Agent' 개념을 공개했습니다. 별도의 에이전트 코드 없이 라우터 레이어에서 모델 조합을 실행해 GPT-4급 결과를 더 저렴하게 낼 수 있다는 아이디어입니다.
Ornith-1.0: self-improving open-source models for agentic coding
Gemma 4와 Qwen 3.5를 기반으로 파인튜닝한 코딩 특화 오픈소스 모델로, RL(강화학습)을 통해 스캐폴드(에이전트 실행 구조)까지 함께 최적화하는 방식을 주장하지만, 커뮤니티에서는 벤치마크 과최적화에 불과하다는 의심을 받고 있다.
Entity Binding Failures in Tool-Augmented Agents
AI 에이전트가 올바른 도구를 선택해도 잘못된 대상에 실행하는 'Entity Binding 실패' 문제를 정의하고, 이를 막는 실행 정책을 평가한 논문.
Herdr: Agent multiplexer that lives in your terminal
여러 AI 코딩 에이전트(Claude, Codex 등)를 하나의 터미널에서 동시에 실행·관리할 수 있는 Rust 기반 오픈소스 툴로, tmux처럼 세션이 유지되고 SSH로 원격 접속도 가능해 멀티 에이전트 워크플로우를 크게 단순화해준다.
Ornith-1.0: Self-scaffolding LLMs for agentic coding
모델이 문제 풀이 전략(scaffold)을 직접 생성하고 개선하는 자기강화 학습 프레임워크를 적용한 오픈소스 코딩 특화 LLM으로, 9B 소형 모델부터 397B 대형 모델까지 라인업을 갖추고 SWE-Bench 등 주요 벤치마크에서 Claude Opus 4.7을 능가하는 성능을 보여줬다.