코드를 실행하는 설정 파일: 공급망 보안의 사각지대
Config Files That Run Code: Supply Chain Security Blindspot
TL;DR Highlight
저장소의 설정 파일 7종이 clone·열기만으로 악성 코드를 실행하는 통로가 됐다
Who Should Read
외부 저장소를 clone해 VS Code·Cursor·Claude Code로 여는 일이 잦은 개발자와 코드 리뷰 담당자
Core Mechanics
- 설정 파일이 곧 실행 통로다
- VS Code, Cursor, Claude Code, Gemini CLI, npm, Composer, Bundler는 셸 명령을 담을 수 있는 설정 파일을 지원한다.
- 폴더를 열거나 에이전트 세션을 시작할 때, 또는 의존성 설치·테스트 때 실행된다.
- Miasma 웜은 런처 7종으로 같은 파일을 돌렸다
- 커밋 f72462d9 하나가 파일 6개를 추가했고, 그중 5개가 .github/setup.js 하나를 실행시킨다.
- Composer와 Bundler 런처는 같은 캠페인의 다른 저장소에서 나왔다.
- 드로퍼는 4,348,254바이트짜리 암호화 덩어리다
- 약 384KB 한계를 넘어 GitHub 코드 검색에 색인되지 않는다고 한다.
- Caesar 시프트로 가린 코드를 eval하면 Bun 로더가 AES로 푼 자격증명 탈취기가 돈다.
- AWS, Azure, GCP, Vault, Kubernetes, npm, GitHub 비밀값을 노리고 공개 GitHub 저장소로 유출한다.
- 신뢰 프롬프트는 뚫리지 않고 무뎌진 것이다
- VS Code는 낯선 폴더를 Restricted Mode로 열고 Trust를 누르기 전엔 태스크를 막는다.
- 한 번 신뢰하면 이후 세션에서 훅이 확인 없이 실행되고, claude -p 헤드리스 모드는 신뢰 검증을 끈다.
- Gemini CLI는 훅 명령이 바뀌면 다시 경고하지만 Claude Code는 아직 그렇지 않다.
- 패키지 매니저 쪽은 관문이 아예 없다
- npm test, composer install, bundle 명령은 확인 없이 훅을 실행한다.
- Gemfile은 Ruby라서 첫 줄 system() 한 줄이면 악성 gem 설치 없이도 실행된다.
- 위험도는 트리거·권한·문법 세 가지로 가른다
- 트리거는 무엇이 파일을 읽는지, 권한은 실행 전 무엇이 막는지, 문법은 파일 형식이 명령을 담을 수 있는지다.
- Cursor의 .cursor/rules/*.mdc는 에이전트에게 스크립트를 실행하라고 시키는 프롬프트 인젝션이다.
Community Reactions
- 이미 오래전부터 경고되던 문제라는 의견
- 사각지대가 아니고 수년째 지적돼 왔지만 아무도 신경 쓰지 않는다는 댓글이 있었다.
- git 자체도 같은 위험이 있다는 지적
- AI 에이전트 없이도 git이 post-checkout 훅을 실행할 수 있어 clone만으로 당할 수 있다는 의견이 있었다.
- 열기 전에 settings.json을 grep해 본다는 경험
- .vscode/settings.json에서 terminal.integrated를 먼저 확인하고 새 저장소를 연다는 댓글이 있었다.
- MS Word 매크로와 같다는 의견
- 신입 개발자 교육 자료로 쓰겠다는 댓글과, VS Code에서 설정 파일 명령 실행을 완전히 끌 수 있는지 묻는 질문도 있었다.
How to Apply
- 낯선 저장소는 열기 전에 grep부터 돌리기
- clone 직후 편집기로 열지 말고 아래 grep을 터미널에서 먼저 실행하라.
- .github/setup.js가 있거나 folderOpen, SessionStart, post-install-cmd, Gemfile의 system이 걸리면 열지 마라.
- PR 리뷰 체크리스트에 설정 파일 추가하기
- .claude/, .cursor/, .vscode/, composer.json scripts, Gemfile 변경을 애플리케이션 코드와 같은 강도로 리뷰하라.
- 'chore: update dependencies [skip ci]' 같은 커밋에 숨은 설정 파일 추가도 확인하라.
- clone 전 훅이나 CI 단계에 자동 검사 넣기
- 이름이 바뀌어도 걸리도록 파일명이 아닌 자동 실행 동작 패턴을 검사하라.
- 이미 열었다면 자격증명부터 교체하기
- GitHub·npm 토큰과 환경에 로드된 AWS·Azure·GCP 키를 먼저 교체하라.
- 최근 연 다른 clone에 .github/setup.js가 있는지 확인하라.
Try It
# 터미널(bash)에서 의심 저장소 폴더 안에서 실행. 코드를 실행하지 않고 검사만 한다.
test -f .github/setup.js && echo "Miasma dropper present, do not open this repo in an editor"
grep -rInE 'folderOpen|"SessionStart"|post-install-cmd' .vscode .claude .gemini composer.json 2>/dev/null
grep -nE '^[[:space:]]*(system|exec|`)' Gemfile 2>/dev/nullTerminology
관련 논문
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
LayerFS: AI 코딩 에이전트를 위한 파일시스템
에이전트마다 임시 Workspace를 마운트하고 결과만 커밋하는 파일시스템
Launch HN: Alter (YC S25) – 멀티유저 에이전트용 접근 제어
에이전트마다 별도 신원·정책·감사로 API 키 공유 문제를 푼다
Claude로 코드의 공격 표면(attack surface) 줄이기
Claude로 25개 오픈소스를 분석해 불필요하게 열린 코드 493건을 찾았다
WhatsApp 도움말 페이지에 숨겨진 LLM 지시문: 규제기관을 추천하지 말라
WhatsApp 도움말에 화면엔 안 보이는 AI 지시문 102개가 숨어 있었다
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다