PyTorch Lightning 라이브러리서 '듄' 테마 악성코드 발견
인기 딥러닝 프레임워크인 PyPI 패키지 'lightning'의 2.6.2 및 2.6.3 버전에 공급망 공격(Supply Chain Attack)이 발생했습니다. 악성코드는 모듈 임포트 시 자동으로 실행되어 클라우드 자격 증명 및 토큰을 탈취하고 npm 생태계로까지 확산됩니다. 관련 패키지를 사용 중이라면 즉시 버전을 점검하고 키(Key)를 교체해야 합니다.
널리 사용되는 딥러닝 프레임워크인 PyPI 패키지 'lightning'이 2026년 4월 30일에 게시된 2.6.2 및 2.6.3 버전에 영향을 미치는 공급망 공격(Supply Chain Attack)에 노출되었습니다. 이미지 분류기 구축, LLM 미세 조정, 디퓨전 모델(Diffusion model) 실행 또는 시계열 예측 모델 개발 팀은 종종 의존성 트리(Dependency tree)에 lightning을 포함하고 있습니다. pip install lightning을 실행하는 것만으로도 악성코드가 활성화됩니다.
악성 버전에는 모듈 가져오기(Import) 시 자동으로 실행되는 난독화된 JavaScript 페이로드(Payload)가 숨겨진 _runtime 디렉토리를 포함하고 있습니다. 이 공격은 자격 증명, 인증 토큰, 환경 변수 및 클라우드 비밀(Cloud secrets)을 탈취할 뿐만 아니라 GitHub 리포지토리를 감염시키려 시도합니다. 영화 '듄(Dune)'의 새다카(Hulud, 모래벌레)를 테마로 삼고 있으며, EveryBoiWeBuildIsaWormBoi라는 이름의 퍼블릭 리포지토리를 생성하는 특징이 있습니다. 우리는 이 공격이 과거 'mini Shai-Hulud' 캠페인 배후의 위협 행위자(Threat actor)가 저지른 것으로 보고 있습니다. IOC(침해 지표) 구조가 해당 작전과 일치합니다. 악성 커밋 메시지가 동일한 '듄' 테마의 명명 규칙을 따르며, 이번 캠페인에서는 기존의 Mini Shai-Hulud 공격과 구별하기 위해 EveryBoiWeBuildIsAWormyBoi라는 접두사를 사용합니다.
영향을 받는 패키지
- lightning 버전 2.6.2
- lightning 버전 2.6.3
Semgrep 고객을 위한 안내 Semgrep은 이 문제를 다루는 자문(Advisory)과 규칙(Rule)을 제공하므로 프로젝트를 확인할 수 있습니다. 최근 프로젝트 스캔을 실행하지 않았다면 새 스캔을 실행하십시오. 프로젝트에서 이러한 패키지 버전이 최근에 설치되었는지 확인하려면 자문 페이지(https://semgrep.dev/orgs/-/advisories)를 확인하고 일치하는 종속성(Dependency)이 있는지 필터를 점검하세요. "일치하는 종속성 없음(No matching dependencies)"으로 표시되면 프로젝트에서 악성 종속성을 적극적으로 사용하고 있지 않은 것입니다. 일치하는 항목이 있다면 복구 및 침해 지표에 대한 추가 조언은 아래에 나와 있습니다.
일치하는 경우 조치 사항:
아래 IOC에 나열된 주입된 파일(예기치 않은 내용이 포함된 .claude/ 및 .vscode/ 디렉토리)이 있는지 리포지토리를 감사(Audit)하고, 영향을 받은 환경에 있었을 수 있는 모든 GitHub 토큰, 클라우드 자격 증명(Cloud credentials) 또는 API 키를 교체(Rotate)하십시오.
생태계 간 확산: PyPI에서 npm으로
npm을 직접 공격했던 기존의 mini Shai-Hulud와 달리, 이번 공격의 진입점은 PyPI입니다. 멀웨어 페이로드는 여전히 JavaScript이며, 웜 전파는 npm을 통해 이루어집니다. 실행되면 멀웨어는 npm publish 자격 증명을 찾아 해당 토큰으로 게시할 수 있는 모든 패키지에 setup.mjs 드롭퍼(Dropper)와 router_runtime.js를 주입하고, scripts.preinstall이 드롭퍼를 실행하도록 설정한 뒤 패치 버전을 올려 다시 게시합니다. 이 패키지들을 설치하는 모든 다운스트림(Downstream) 개발자는 자신의 컴퓨터에서 전체 멀웨어를 실행하게 되어 토큰을 도난당하고 패키지가 감염됩니다.
작동 방식 데이터 유출 구성 요소는 지난 캠페인의 "Mini Shai-Hulud" 메커니즘과 설계를 공유합니다. 개별 경로가 차단되더라도 탈취된 데이터가 빠져나갈 수 있도록 4개의 병렬 채널을 사용합니다.
- C2 서버로의 HTTPS POST: 탈취된 데이터는 포트 443을 통해 공격자가 제어하는 서버로 즉시 POST됩니다. 도메인과 경로는 페이로드 내에 암호화된 문자열로 저장되어 정적 분석(Static analysis)을 더욱 어렵게 만듭니다.
- GitHub 커밋 검색 데드드롭(Dead-drop): 멀웨어는 GitHub 커밋 검색 API를 폴링하여
EveryBoiWeBuildIsAWormyBoi접두사가 붙은 커밋 메시지를 찾습니다. 해당 메시지는EveryBoiWeBuildIsAWormyBoi:<base64(base64(token))>형식으로 이중 Base64 인코딩된 토큰을 포함하고 있습니다. 디코딩된 토큰은 추가 작업을 위해 Octokit 클라이언트를 인증하는 데 사용됩니다. - 공격자 제어의 공개 GitHub 리포지토리: 무작위로 선택된 '듄' 단어로 이름이 지정된 새로운 퍼블릭 리포지토리가 생성되며, "A Mini Shai-Hulud has Appeared"라는 설명이 추가되어 GitHub에서 직접 검색할 수 있습니다. 탈취된 자격 증명은
results/results-<timestamp>-<n>.json(API를 통해 Base64로 인코딩되며 내부는 일반 JSON)으로 커밋되며, 30MB가 넘는 파일은 번호가 매겨진 청크(Chunk)로 분할됩니다. 커밋 메시지는chore: update dependencies를 위장용으로 사용합니다. - 피해자 자체 리포지토리로 푸시: 멀웨어가 GitHub 서버 토큰인
ghs_를 획득하면, 탈취한 데이터를 피해자의 모든 브랜치에 직접 푸시합니다.