하나의 VSCode 확장 프로그램으로 인해 3,800개의 GitHub 저장소가 침해되었습니다. 당신의 저장소를 지키기 위한 5분 감사 방법
요약
악성 VSCode 확장 프로그램이 3,800개의 GitHub 저장소에서 API 키와 토큰을 유출하는 보안 사고가 발생했습니다. 이 확장 프로그램은 사용자의 파일 시스템과 VSCode 비밀 저장소에 접근하여 .env 파일 및 Anthropic, OpenAI 등의 민감한 정보를 탈취했습니다.
핵심 포인트
- VSCode 확장 프로그램은 사용자 계정과 동일한 파일 시스템 접근 권한을 가지며 별도의 권한 제한 모델이 없습니다.
- 공격자는 .env, .npmrc, .git/config 및 VSCode Secret storage에 저장된 API 키를 탈취했습니다.
- 의심스러운 확장 프로그램을 즉시 삭제하고, 유출 가능성이 있는 모든 API 키(GitHub, OpenAI, Anthropic, AWS 등)를 재발급(Rotate)해야 합니다.
- 신뢰할 수 없는 게시자의 확장 프로그램 설치를 지양하는 것이 가장 중요한 예방책입니다.
GitHub이 방금 확인했습니다: 하나의 악성 VSCode 확장 프로그램이 3,800개의 저장소에서 토큰을 유출했습니다. 38개가 아닙니다. 380개도 아닙니다. 3,800개입니다. 만약 당신이 에디터를 멋지게 꾸미거나 보일러플레이트 (Boilerplate) 작성을 빠르게 하기 위해 확장 프로그램을 설치하는 바이브 코더 (vibe coder)라면, 지금 이 글의 나머지 부분을 읽어야 할 순간입니다. 왜냐하면 가장 최악인 점은 이런 일이 발생했다는 사실이 아니라, 공격 방식이 얼마나 지루했는가 하는 점이기 때문입니다.
실제로 일어난 일
이 확장 프로그램은 일반적인 생산성 도구로 배포되어 마켓플레이스 (Marketplace) 검토를 통과하고 설치 수를 쌓아갔습니다. 그러고 나서 조용한 업데이트를 배포했습니다. 그 업데이트는 세 가지 일을 수행했습니다:
- 사용자의 파일 시스템 (Filesystem)을 탐색하며 .env, .npmrc, .git/config, ~/.aws/credentials 파일을 찾았습니다.
- VSCode 자체의 비밀 저장소 (Secret storage)를 읽었습니다 (여기에 GITHUB_TOKEN, OPENAI_API_KEY 등이 주로 저장됩니다).
- 모든 정보를 공격자가 제어하는 서버로 POST 요청을 보냈습니다.
제로데이 (Zero-day)도 없었습니다. 익스플로잇 체인 (Exploit chain)도 없었습니다. CVE도 없었습니다. 그저 게시된 확장 프로그램이 확장 프로그램이 허용된 대로—즉, 당신의 파일을 읽는—행위를 정확히 수행했을 뿐입니다. 당신이 '설치 (Install)'를 클릭할 때 아무도 말해주지 않는 사실이 바로 이것입니다: VSCode 확장 프로그램은 당신과 동일한 파일 시스템 권한을 가집니다.
이것이 왜 바이브 코더들에게 다른 누구보다 더 치명적인가
만약 당신이 AI로 무언가를 만들고 있다면, 당신의 노트북은 보물 상자와 같습니다:
- Anthropic API key
- OpenAI API key
- Supabase service role key
- 저장소 범위 (Repo scope)를 가진 GitHub PAT
- 만약 배포를 했다면 Stripe secret
이 모든 것이 .env 파일에 들어 있으며
5초 안에 정당성을 설명할 수 없는 것은 모두 삭제하세요: code --uninstall-extension some.suspicious-extension
-
확장 프로그램이 무엇을 볼 수 있는지 확인하세요
VSCode 확장 프로그램에는 권한 모델 (Permission model)이 없습니다. 확장 프로그램은 사용자 계정이 접근할 수 있는 모든 것에 접근할 수 있습니다. 어떤 폴더를 읽을 수 있는지 나열하는manifest.json파일도 없습니다. 모든 폴더를 읽을 수 있습니다. 이것은 버그가 아니라 설계 (Design)입니다. 유일한 완화 방법은 다음과 같습니다: 필요하지 않은 확장 프로그램, 모르는 게시자(Publisher)의 확장 프로그램은 설치하지 마세요. -
이 머신에 있는 모든
.env파일 내의 모든 비밀 정보(Secret)를 교체(Rotate)하세요
find ~/Desktop ~/Projects ~/code -name ".env*" -not -path "*/node_modules/*" 2>/dev/null
검색 결과로 나오는 모든 파일에 대해, 그 내용이 유출되었다고 가정하세요. 각 서비스 제공업체의 대시보드에 접속하여 다음을 교체(Rotate)하세요:
- GitHub: Settings → Developer settings → Personal access tokens → revoke + reissue (취소 및 재발급)
- Anthropic / OpenAI: 키를 취소(Revoke)하고, 새 키를 생성한 뒤,
.env를 업데이트하세요. - Supabase: 서비스 역할 키(Service role key)를 교체하세요 (이 키는 매우 위험합니다 — RLS를 우회합니다).
- AWS: IAM 액세스 키를 교체하고, 지난 30일간의 CloudTrail을 감사(Audit)하세요.
이 과정이 번거로운가요? 네. 하지만 암호화폐 채굴기로 인해 4만 달러의 OpenAI 청구서를 받으며 깨어나는 것보다 저렴한가요? 네, 그렇습니다.
-
실제 침해 흔적(Breach signature)이 있는지 GitHub를 감사(Audit)하세요
gh auth status
gh api /user/repos --paginate -q '.[] | select(.pushed_at > "2026-05-01") | .full_name'
최근에 푸시(Push)된 모든 저장소를 확인하세요. 커밋(Commit)을 확인하세요. 기억나지 않는 본인의 커밋이 있나요? 새로운 협업자(Collaborator)가 있나요? Settings → Deploy keys 아래에 새로운 배포 키(Deploy keys)가 있나요? 이것이 실제 침해 흔적입니다. 탈취된 토큰은 비공개 저장소에 백도어(Backdoor)를 추가하는 데 사용되며, 이후 해당 백도어가 운영 환경(Production)에서 데이터를 빼돌립니다. -
이런 일이 다시 발생하지 않도록 가드레일(Guardrail)을 설정하세요
비밀 정보(Secrets)를.env에서 꺼내 비밀 관리자(Secret manager)로 옮기세요 — 무료 도구라도 괜찮습니다.
direnv + 1Password CLI 조합은 디스크에 평문(plaintext)을 남기지 않는 가장 저렴한 설정입니다:
.envrc (커밋해도 되며, 내부에 비밀 정보가 없음)
export ANTHROPIC_API_KEY = $( op read "op://Personal/Anthropic/credential" )
export GITHUB_TOKEN = $( op read "op://Personal/GitHub PAT/credential" )
이제 .env 파일을 읽는 악성 확장 프로그램은 유용한 정보를 아무것도 찾을 수 없습니다. 비밀 정보는 당신의 Vault(금고) 내에 암호화된 상태로 존재하며, 오직 셸 세션(shell session) 내에서만 복호화됩니다.
간과하기 쉬운 교훈
VSCode 마켓플레이스는 iOS App Store처럼 엄격하게 관리되지 않습니다. 게시를 위한 문턱은 무료 Microsoft 계정일 뿐입니다. 검토(Review) 과정은 대부분 자동화되어 있습니다. 신뢰 모델은 "결국에는 나쁜 것들을 잡아낼 것이다"라는 식이며, 이번 사례에서 그 "결국"은 무려 3,800개의 저장소가 침해된 후에야 찾아온 것으로 보입니다.
당신이 설치하는 모든 확장 프로그램은 당신의 머신에 대한 전체 읽기 권한을 가진 공급망 의존성(supply-chain dependency)입니다. 유지 관리자가 한 명뿐인 무작위 npm 패키지를 대하듯 확장 프로그램을 대하십시오. 필요한 것만 설치하고, 이름을 알 수 있는 게시자가 제공하며 수백만 회의 다운로드 수를 기록한 것을 선호하며, 주기적으로 감사(audit)하십시오.
"AI 만능주의" 골드러시는 상황을 개선하기는커녕 악화시키고 있습니다. 매주 Claude나 GPT 기반의 마법으로 코딩 능력을 10배 향상시켜 준다고 약속하는 새로운 확장 프로그램이 등장합니다. 대부분은 괜찮습니다. 하지만 일부는 그렇지 않습니다. 당신은 청구서가 날아오기 전까지는 그 차이를 구분할 수 없을 것입니다.
오늘 밤 해야 할 일
위에서 언급한 감사를 실행하세요. 5단계 모두 수행하십시오. 3단계를 건너뛰지 마세요. 프로젝트 하나를 골라 .env에서 op, aws-vault 또는 doppler로 옮기세요. 딱 하나만이라도 좋습니다. 30일 후에 이 감사를 다시 수행하도록 캘린더 알림을 설정하세요.
LayerZero를 팔로우하세요 — 우리는 AI 제품이 침해되지 않고 출시될 수 있도록 인프라를 분석합니다. 다음 편: .env가 왜 프로덕션 비밀 정보(production secrets)용으로 설계되지 않았는지, 그리고 '바이브 코더(vibe coders)'를 위해 이를 해결하는 3줄 설정법에 대해 다룹니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기