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
Migrating a production AI agent to GPT-5.6: 2.2x faster, 27% cheaper
마케팅 웹사이트를 자동 생성하는 프로덕션 AI 에이전트를 Claude Opus 4.8에서 GPT-5.6 Sol로 전환한 실전 경험담으로, 단순 모델 교체가 아니라 eval 하네스, 툴 스키마, 캐싱, 추론 리플레이까지 손봐야 했던 과정을 구체적인 수치와 함께 정리했다.
What xAI's Grok build CLI sends to xAI: A wire-level analysis
xAI의 공식 코딩 CLI 도구 Grok Build가 사용자 동의 없이 전체 Git 저장소와 .env 시크릿 파일을 xAI 서버로 업로드한다는 사실이 네트워크 트래픽 분석으로 밝혀졌다.
Remember When It Matters: Proactive Memory Agent for Long-Horizon Agents
LLM 에이전트가 긴 작업 중 중요한 정보를 잊어버리는 문제를 별도의 메모리 에이전트가 '적절한 타이밍에' 끼어들어 해결하는 방법
WebSwarm: Recursive Multi-Agent Orchestration for Deep-and-Wide Web Search
복잡한 웹 검색을 재귀적으로 분해하고 각 노드에 적합한 검색 모드를 동적으로 할당하는 멀티에이전트 프레임워크
Show HN: Reverse-engineering web apps into agent tools
로그인된 웹 앱의 API 호출을 브라우저에서 감시해 자동으로 MCP 도구로 변환하는 에이전트를 만들었다. 소스 코드나 공식 API 문서 없이도 Jira, Spotify 같은 서비스에 AI 어시스턴트를 붙일 수 있다.
Show HN: FableCut – A browser video editor AI agents can drive (zero deps)
타임라인 전체를 JSON 파일 하나로 표현하고 MCP/REST로 AI 에이전트가 직접 편집할 수 있는 브라우저 비디오 에디터로, Claude 같은 AI가 프롬프트 하나로 영상을 자동 컷편집하고 결과를 실시간으로 UI에 반영해준다.