PyTorch Lightning에서 발견된 Shai-Hulud 테마 악성코드
Shai-Hulud Themed Malware Found in the PyTorch Lightning AI Training Library
TL;DR Highlight
lightning 2.6.2·2.6.3이 import만 해도 자격증명을 훔치는 악성코드로 오염됐다
Who Should Read
PyTorch Lightning으로 학습·파인튜닝 파이프라인을 돌리며 pip로 의존성을 설치하는 ML·백엔드 개발자
Core Mechanics
- lightning 두 버전이 오염됐다
- PyPI 패키지 lightning의 2.6.2, 2.6.3이 2026년 4월 30일 공급망 공격을 받았다.
- pip install 후 import만 하면 숨겨진 _runtime 디렉터리의 난독화된 JavaScript 페이로드가 자동 실행된다.
- 훔치는 범위가 넓다
- 로컬 파일의 80개 이상 자격증명 경로, 환경 변수, GitHub Actions 시크릿을 노린다.
- AWS·Azure·GCP의 시크릿 저장소(Secrets Manager, Key Vault, Secret Manager)까지 열어 본다.
- 유출 경로가 4개다
- C2 서버로 HTTPS POST, GitHub 커밋 검색 dead-drop, 공격자 공개 저장소, 피해자 저장소 직접 push를 병행한다.
- 한 경로가 막혀도 데이터가 빠져나가도록 설계됐다.
- PyPI에서 시작해 npm으로 퍼진다
- npm publish 토큰을 찾으면 그 토큰으로 배포 가능한 모든 패키지에 dropper를 심고 preinstall 스크립트를 설정한다.
- 패치 버전을 올려 재배포해서 하위 개발자까지 감염시키는 웜 구조다.
- Claude Code·VS Code에 persistence를 심는다
- .claude/settings.json에 SessionStart 훅을, .vscode/tasks.json에 folderOpen 태스크를 써서 저장소를 열 때마다 setup.mjs를 실행한다.
- 원문은 Claude Code 훅 악용이 실제 공격에서 처음 문서화된 사례 중 하나일 수 있다고 쓴다.
- 악성 GitHub Actions 워크플로도 심는다
- 쓰기 권한 토큰이 있으면 Formatter 워크플로를 push한다.
- push마다 toJSON(secrets)로 전체 시크릿을 덤프해 format-results 아티팩트로 올린다.
Community Reactions
- 커뮤니티가 공급망 공격 빈도를 체감한다는 의견
- 최근 주요 패키지 공급망 공격이 연이어 보인다는 의견이 있었다.
- 해커·아마추어 코드가 많은 프로젝트의 의존성이 되는데 쉬운 방어 도구가 부족하다는 의견이다.
- pip 쿨다운 옵션을 알려 준 정보
- pip 26.1부터 쿨다운이 추가됐다는 댓글이 있었다.
- pip install --uploaded-prior-to=P1D 또는 PIP_UPLOADED_PRIOR_TO=P1D 환경 변수로 쓴다.
- lock 파일 고정이 효과 있었다는 경험
- 단일 uv.lock 모노레포에서 1년에 몇 번만 업데이트해서 lightning이 2.6.1에 고정돼 있었다는 경험이 올라왔다.
- 메인테이너는 2.6.4를 낼 때까지 2.6.1을 쓰라고 안내했다.
- AI가 제안한 pip install을 그냥 실행하는 위험이라는 의견
- Claude Code가 제안한 패키지를 엔터로 설치하는 경우가 많은데 모델은 몇 달 전 학습이라 이번 주 오염을 모른다는 의견이 있었다.
- 이슈 대응에 의문을 제기한 댓글
- 보안 이슈 4건이 봇 pl-ghost에 의해 자동 댓글 후 닫혔다는 지적이 있었다.
- 4월 20일에 2.6.2 릴리스가 내부 사유로 막혀 있다던 답변이 있어 사전 인지 여부를 궁금해하는 댓글이 있었다.
How to Apply
- 오늘 lightning 버전부터 확인하기
- pip show lightning과 lock 파일에서 2.6.2·2.6.3이 있는지 CI 이미지와 로컬 모두 확인하라.
- 있으면 2.6.1로 고정하고 2.6.4 공개 전까지 유지하라.
- 감염 흔적 파일 검색하기
- 저장소에서 .claude/settings.json, .claude/setup.mjs, .claude/router_runtime.js, .vscode/tasks.json, .vscode/setup.mjs를 찾아 낯선 내용이 있는지 보라.
- GitHub에서 커밋 메시지 EveryBoiWeBuildIsAWormyBoi와 설명 "A Mini Shai-Hulud has Appeared"도 검색하라.
- 해당 환경의 자격증명 전부 교체하기
- 오염 버전을 import한 머신은 완전히 감염된 것으로 보고 GitHub 토큰, 클라우드 자격증명, API 키, npm 토큰을 교체하라.
- 저장소 Actions에 Formatter 워크플로와 format-results 아티팩트가 있는지도 확인하라.
- pip 쿨다운 적용하기
- pip 26.1 이상에서 pip config set global.uploaded-prior-to P1D를 설정하라.
- 새로 올라온 버전을 하루 늦게 받아 오염 버전 설치를 줄여라.
Try It
# 셸에 그대로 붙여넣기: 현재 환경과 저장소에서 lightning 감염 여부 점검
pip show lightning | grep -i '^version'
pip list 2>/dev/null | grep -i '^lightning '
grep -rnE 'lightning[=@ ]*2\.6\.(2|3)' requirements*.txt poetry.lock uv.lock Pipfile.lock 2>/dev/null
for f in .claude/settings.json .claude/setup.mjs .claude/router_runtime.js .vscode/tasks.json .vscode/setup.mjs; do [ -e "$f" ] && echo "확인 필요: $f"; done
git log --all --oneline | grep -i 'EveryBoiWeBuildIsAWormyBoi'
python -c "import importlib.util,os;s=importlib.util.find_spec('lightning');print('_runtime 존재' if s and os.path.isdir(os.path.join(os.path.dirname(s.origin),'_runtime')) else '_runtime 없음')"
pip config set global.uploaded-prior-to P1DTerminology
관련 논문
Cursor Agent SDK 출시: 에이전트를 코드로 정의하고 한 줄로 배포
Cursor가 에이전트를 코드로 정의·배포하는 Agent SDK를 정식 공개했다
에이전트가 코드를 짜는 시대, 엔지니어가 여전히 알아야 할 것: 기초·폭넓은 지식·필요할 때 깊이 파기
에이전트가 짠 코드의 오너십은 기초, 폭넓은 지식, 즉시 깊이 파는 능력에 달렸다
AI가 일을 줄여준다더니, 이렇게 많이 일한 적이 없다
에이전트를 병렬로 돌렸더니 GitHub 활동이 엔지니어 시절 수준으로 돌아왔다
Corgi: 사람과 에이전트를 위한 터미널 멀티플렉서
여러 AI 에이전트의 상태를 한눈에 보는 tmux류 터미널 도구
모델이 그렇게 좋다면 OpenAI는 왜 회사 100개를 직접 안 차릴까
HN 댓글 답: 코드는 쉬워도 뭘 만들지 아는 건 별개라 토큰을 판다
OpenShell: 자율 AI 에이전트를 가두는 NVIDIA의 안전한 샌드박스 런타임
정책 파일로 에이전트의 파일·네트워크·자격증명 접근을 커널 수준에서 통제한다
Omnara: Claude Managed Agents의 오픈소스 대안 (셀프호스팅 가능)
어떤 모델·머신에서도 에이전트를 돌리는 오픈소스 managed agent 플랫폼
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
Related Resources
- https://semgrep.dev/blog/2026/malicious-dependency-in-pytorch-lightning-used-for-ai-training/
- https://socket.dev/blog/lightning-pypi-package-compromised
- https://news.ycombinator.com/item?id=47964003
- https://discuss.python.org/t/announcement-pip-26-1-release/107108
- https://ichard26.github.io/blog/2026/04/whats-new-in-pip-26.1/
- https://github.com/Lightning-AI/pytorch-lightning/security/a...