
Detection & remediation toolkit for the Miasma / Shai-Hulud worm and CVE-2026-35603 (AI-agent/IDE config injection)
Miasma 웜(Mini Shai-Hulud 변종)에 대한 사고 분석 + 탐지/복구 도구입니다. 이 웜은 AI 에이전트/IDE 설정 및 npm/GitHub 리포지토리에 자동 실행 페이로드를 주입합니다.
⚠️ 면책 조항 — 보증 없음. 이 도구는 "있는 그대로" 제공되는 커뮤니티 방어용 툴킷으로, 어떠한 종류의 보증도 없습니다(
LICENSE참조). 스캐너와 YARA 규칙은 읽기 전용이지만,purge-history.sh는 git 기록을 다시 쓰고.claude/훅은 파일을 격리로 이동하므로 둘 다 리포지토리를 변경할 수 있습니다. 먼저 백업하고, 각 도구가 무엇을 하는지 검토한 후, 자신의 책임 하에 실행하십시오. 깨끗한 스캔 결과가 안전을 보장하지는 않습니다. 지표는 진화하고 새로운 변종이 나타납니다. 권한이 있는 시스템 및 계정에서만 사용하십시오. 누락된 부분이나 버그를 발견하셨나요?SECURITY.md및CONTRIBUTING.md를 참조하세요.
YARA 설치 (Windows): winget install VirusTotal.YARA — 또는 choco install yara / scoop install yara.
Linux/macOS: apt install yara / brew install yara. yara --version으로 확인합니다.
참고:
-Mode Local은 기본적으로$env:USERPROFILE만 스캔합니다. 다른 곳의 리포지토리를 포함하려면-CodeRoots를 전달하세요(예:-CodeRoots E:\Sources,D:\work).
# 로컬 시스템 + 로컬 리포지토리 스캔 (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# 원격 GitHub 리포지토리 스캔 (비공개 리포지토리/비밀 키를 위해 대상 계정에 먼저 인증)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners your-org,your-user -OutReport report.md
# 모든 항목 + JSON + Markdown 보고서
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
INFECTED 발견 시 종료 코드 1 (CI 친화적).
# 감염된 리포지토리의 기록 제거 (스크립트에서 PATHS 검토 후)
./purge-history.sh /path/to/repo
# 그런 다음 검증 후:
git push origin --force --all && git push origin --force --tags
# YARA 스캔
yara -r setup-js.yar /path/to/scan
# Linux/macOS: 로컬 스캔 (bash 포트 — 기본값은 $HOME; 확장하려면 루트 전달)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# 캡처된 드로퍼를 정적으로 디난독화 (읽기 전용 — 절대 실행하지 않음)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # layers + iocs.txt를 <Path>.deob/에 씁니다
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # 디코드/복호화 엔진 확인
디난독화 도구는 p,a,c,k,e,d 패커 웨이브를 풀고, 문자 코드 웨이브를 디코딩하며, 시저 시프트를 자동 감지 및 역변환하고(-Shift로 재정의 가능), 모든 내장 AES-128-GCM 블롭(_b 부트스트래퍼, _p 스틸러)을 복호화한 후 복구된 코드에서 URL, IP 및 데드 드롭 계정을 스캔합니다.
# 제거 후: 우선 순위가 지정된 비밀 키 순환 체크리스트 생성 (아무것도 해지하지 않음)
pwsh -File Invoke-MiasmaRotation.ps1 # 여기서 접근 가능한 자격 증명 감지
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
번들된 복합 액션을 모든 워크플로의 첫 번째 단계로 사용하세요:
# 다른 리포지토리에서 (공급망 안전을 위해 태그/SHA로 고정):
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # Scan-Miasma.ps1 -Mode Local도 실행 (pwsh 필요)
이 툴킷은 .github/workflows/miasma-ci.yml을 통해 자체적으로 동일한 가드를 실행합니다(상대 경로로 액션 참조). 가드는 웨이브에 구애받지 않으며 웜의 실행기 설정 파일에 한정되므로, IOC 문자열을 언급하는 문서에서 오탐을 발생시키지 않습니다.
.claude/)이 리포지토리에서 Claude Code를 실행하는 시스템을 위한 실시간 보호입니다. 훅은 iocs.psd1을 재사용하며(중복 지표 없음), .claude/settings.json에 연결됩니다:
.miasma-quarantine/<timestamp>/…로 이동되고(git-ignore 됨) .miasma-quarantine/quarantine.log에 기록됩니다 — Move-Item으로 복원하세요. 하드 삭제는 없습니다.Miasma.Common.ps1의 Test-MiasmaExcluded): 툴킷 자체 파일은 합법적으로 IOC 문자열을 포함하며(iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar, content/, .claude/hooks|commands, , ) 차단/격리되지 않습니다.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (순환 인벤토리), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq 오류 본문을 stdout으로 덤프 → 출력 진위를 신뢰하지 말 것;
$LASTEXITCODE 확인 + 형식 검증(숫자 크기, 정확한 브랜치 이름).master→main 리디렉션을 유지 → branches/master가 200 반환;
반환된 이름 == 요청한 이름인 경우에만 브랜치를 수락.--package-lock-only**를 유지해야 함(npm install 없음, 스크립트 실행 없음).원래 백로그(bash 포트, 심각도 배지, 패커 웨이브 디난독화, 순환 도우미)는 완료되었습니다. 향후 아이디어:
scan-miasma.sh: 원격/GitHub 모드 추가(현재 로컬 전용).--revoke 모드(게이트, 확인 포함) (gh/npm/aws용).| 파일 | 설명 |
|---|
content/incident-report.fr.md / content/incident-report.en.md | 전체 보고서: 작동 방식, 페이로드 디난독화, IOCs, 제거 |
Scan-Miasma.ps1 | 통합 스캐너(로컬 + 원격), 구조화된 JSON + 리포지토리별 Markdown 보고서 — 이것을 사용하세요 |
iocs.psd1 | 스캐너가 로드하는 공유 지표(해시, 서명, 악성 패키지, 설정) — IOC를 여기서 편집하세요 |
Expand-MiasmaPayload.ps1 | setup.js용 정적 디난독화 도구 — 패커/문자 코드 → 시저 → AES-128-GCM을 벗겨내고 C2/IOC를 추출합니다(페이로드를 실행하지 않음) |
Invoke-MiasmaRotation.ps1 | 비밀 키 순환 체크리스트 — 여기서 접근 가능한 자격 증명을 감지하고 해지 명령을 출력합니다(읽기 전용, 아무것도 해지하지 않음) |
scan-miasma.sh | Linux/macOS용 로컬 스캔 Bash 포트(크로스 플랫폼 하위 집합) |
purge-history.sh | 모든 git 기록에서 악성 파일 제거(filter-repo → filter-branch) + 백업 |
setup-js.yar | 드로퍼 + 실행기 설정에 대한 YARA 규칙 |
.github/actions/miasma-guard/ | 재사용 가능한 GitHub Actions 복합 액션 — 드로퍼/실행기가 있으면 빌드를 거부합니다 |
.claude/ | Claude Code 훅 — 실시간 보호/격리 + /miasma-scan 명령(아래 참조) |
| 도구 | 필요 용도 | 필수 여부 |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | 필수 (해당 도구) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | bash 포트만 해당 |
| git | 로컬 리포지토리 기록 확인, purge-history.sh | 필수 |
GitHub CLI (gh, 인증됨) | Scan-Miasma.ps1 -Mode Remote | 원격 스캔만 해당 |
| npm | 원격 npm audit (잠금 파일 전용) | 선택 사항 (없으면 자동 건너뜀) |
| git-filter-repo | 선호하는 기록 재작성(내장 git filter-branch로 대체) | 선택 사항 |
YARA (yara) | setup-js.yar 스캔 | 선택 사항 |
| 훅 | 이벤트 | 동작 |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | 웜 IOC를 주입하는 쓰기를 차단(도구 호출 취소) |
Guard-Bash.ps1 | PreToolUse (Bash) | 웜 실행 차단 — node .github/setup.js, bun/bunx, 파이프된 bun.sh 설치 프로그램 |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | 파일이 작성된 후 감염 시 경고 + 격리 |
Session-Sweep.ps1 | SessionStart | 빠른 리포지토리 스윕; 기존 감염을 컨텍스트에 보고 |
/miasma-scan | 명령 | Scan-Miasma.ps1의 주문형 래퍼 |
.github/actions/miasma-guard/.github/workflows/Guard-Bash는 실행을 대상으로 하며, 언급은 대상이 아닙니다: 패턴(iocs.psd1 → CmdSigs)은 명령 위치에 고정되므로, IOC를 단순히 명명하는 트라이지 명령(grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js)은 차단되지 않습니다 — 실제로 node …/setup.js / bun / bun.sh 설치 파이프를 실행하는 경우만 차단됩니다. 참고: bun/bunx 호출은 완전히 차단됩니다(웜의 런타임); 실제로 Bun이 필요하면 CmdSigs를 통해 허용 목록에 추가하세요.Scan-Miasma.ps1(읽기 전용)과 달리, 이 훅은 트리를 수정(격리)합니다. 옵트인 방식입니다: Claude Code가 .claude/settings.json을 처음 로드할 때 훅 승인을 요청합니다.