SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

'Miasma' 공급망 공격: @redhat-cloud-services 96개 버전 침해

EQST Now | 2026.06.04

NOW Briefing

Brief 1 2026년 6월 1일 Wiz Research가 @redhat-cloud-services npm 네임스페이스의 패키지 32개·96개 버전에 자격증명 탈취 웜(worm, 스스로 복제·확산하는 악성코드)이 심어졌다는 사실을 공개했습니다. 캠페인명은 "Miasma"이며, 알려진 (Mini) Shai-Hulud 웜의 변종으로 분석됐습니다.
Brief 2 공격자는 Red Hat 직원의 GitHub 계정을 탈취한 뒤, GitHub Actions 워크플로에 악성 코드를 심었습니다. 이 워크플로가 자동으로 발급받은 인증(OIDC 토큰)으로 npm의 정식 자동 배포 경로를 그대로 타면서, 빌드 출처를 보증하는 증명(SLSA provenance)이 붙은 정상처럼 보이는 패키지가 게시됐습니다.
Brief 3 영향 패키지를 직접·전이 의존하는 조직은 락파일과 빌드 로그를 즉시 감사하고, 빌드 환경의 모든 클라우드·CI 자격증명을 폐기하고 재발급해야 합니다. Red Hat은 자사 제품에는 영향이 없다고 확인했지만, 해당 버전을 설치한 모든 환경은 자격증명이 유출된 것으로 간주해야 합니다.

'Miasma' 공급망 공격: @redhat-cloud-services 96개 버전 침해

■ 개요

@redhat-cloud-services는 Red Hat Hybrid Cloud Console의 프런트엔드 컴포넌트와 API 클라이언트를 제공하며, 주간 약 8만 회 다운로드되는 모듈입니다. Wiz Research는 2026년 6월 1일 이 모듈에서 32개 패키지·96개 버전이 원본 저장소와 일치하지 않는 무단 변경본으로 npm에 게시됐다고 공개했습니다. frontend-components, rbac-client, host-inventory-client 등이 포함됐고, 기본 설치 버전을 가리키는 latest 태그에 악성 버전이 노출돼 자동 업데이트 환경이 즉시 영향권에 들어갔습니다.

이 악성 버전은 package.jsonpreinstall 훅으로 4.2 MB짜리 난독화 index.js를 설치 즉시 실행합니다. 페이로드는 GitHub·SSH·AWS·GCP·Azure·Vault·Kubernetes·npm·Docker·GPG·.env 자격증명을 탈취해 외부로 전송하고, 감염된 메인테이너의 신뢰 발행 권한을 이용해 다른 패키지로 자가 확산을 노립니다. CI/CD 러너에서는 마스킹된 자격증명을 실행 프로세스 메모리에서 평문으로 회수하는 기능까지 확인돼, 로그 노출 여부와 무관하게 자격증명 유출로 간주해야 합니다.

탐지 측면에서도 Miasma는 발행 자체가 정상 OIDC 토큰과 SLSA provenance(빌드 출처 증명)로 서명돼 탐지 공백을 만듭니다. 공급망 검증 도구가 침해 버전을 합법적인 릴리스와 동일하게 판정하기 때문입니다. 게다가 CVE/GHSA 식별자도 부여되지 않아 취약점 스캐너 기반의 자동 감지가 어렵습니다. Red Hat은 자사 제품·고객 환경에는 영향이 없다고 확인했지만, 6월 1일 전후 해당 버전을 설치한 사내 도구·SaaS·번들러 환경은 모두 침해를 전제로 대응해야 합니다.

■ 요약

항목 내용
캠페인·기법명 Miasma — @redhat-cloud-services 공급망 침해(Mini Shai-Hulud 변종)
위협 수준 높음(정상 OIDC 신뢰 발행 + SLSA provenance 위장으로 탐지 우회)
취약점 유형 npm 공급망 침해, preinstall 훅 자동 실행, OIDC→npm 신뢰 발행 악용
영향/위험 - 32개 패키지·96개 버전 트로이목마화(주간 ~8만 다운로드)
- GitHub·SSH·AWS·GCP·Azure·Vault·K8s·npm·.env 자격증명 일괄 탈취
- 감염 환경의 발행 권한으로 타 패키지에 자가 확산
표적 산업·지역 @redhat-cloud-services 직·간접 의존 SaaS·CI/CD 환경
관측 기간 2026-06-01 공개(Wiz Research 최초 발견, 동일자 Aikido·Microsoft·다수 매체 보도)

■ 공격 흐름

공격은 Red Hat 직원의 GitHub 계정 탈취에서 시작했습니다. 공격자는 RedHatInsights 조직 저장소에 코드 리뷰를 우회하는 고아 커밋(orphan commit)으로 악성 ci.yaml 워크플로를 푸시했고, 모든 브랜치 이벤트에서 실행되도록 트리거를 설정했습니다. 해당 워크플로는 id-token: write 권한으로 GitHub OIDC 토큰을 발급받은 뒤 npm의 신뢰 발행(Trusted Publishing) 엔드포인트와 토큰을 교환해 정식 게시 권한을 획득합니다.

# 공격자가 RedHatInsights 저장소에 푸시한 워크플로 발췌 (Wiz 인용)
name: release
on:
  push:
    branches: ['*']
jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      id-token: write          # OIDC 토큰 발급용 권한
      contents: read
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
      - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
      - name: prepare
        run: bun run _index.js
        env:
          OIDC_PACKAGES: "@redhat-cloud-services/frontend-components, ..."
          # ... 자격증명 탈취·신뢰 발행 교환 로직 생략 ...

이후 공격자는 이 토큰으로 메인테이너 신원 그대로 트로이목마 버전을 게시했고, npm은 정상 CI에서 발행된 릴리스로 인식해 SLSA provenance를 부여했습니다. 락파일 검증·서명 검증·메인테이너 평판 같은 통상의 공급망 통제를 모두 통과한 채로 악성 버전이 latest 태그에 노출됐습니다. Wiz는 동일 패턴의 침해 커밋이 두 차례에 걸쳐 발생했다고 밝혔습니다.

이 공격이 반복 가능한 이유는 OIDC 신뢰 발행이 메인테이너가 장기 npm 토큰을 보관하지 않고도 패키지를 게시할 수 있도록 설계된 합법 기능이기 때문입니다. 공격자는 "저장소 푸시 권한 = 발행 권한"으로 같아지는 신뢰 경계를 악용했으며, 동일 메커니즘은 향후에도 단일 GitHub 계정 탈취만으로 npm 게시 자격을 직접 만들어내는 경로로 재사용될 수 있습니다.

■ 페이로드 분석

이렇게 확보한 발행 경로로 게시된 침해 버전에는 정상 패키지에는 없던 preinstall 스크립트가 package.json에 추가됐고, 같은 디렉터리에 4.29 MB짜리 난독화 index.js가 드롭됐습니다. npm은 기본적으로 preinstall을 자동 실행하기 때문에 npm install 한 번으로 페이로드가 즉시 트리거됩니다. Wiz 분석에 따르면 이 코드는 eval()과 ROT 기반 디코딩을 다중으로 사용하며, 감염 환경마다 고유 키로 재암호화돼 해시 기반 탐지로는 동일 검체를 식별할 수 없는 구조입니다.

// 침해 버전 @redhat-cloud-services/* package.json 발췌
{
  "scripts": {
    "preinstall": "node index.js"
  }
}

페이로드는 실행 후 빌드·개발 환경 전반에서 자격증명을 수집합니다. 확인된 대상에는 GITHUB_TOKEN·ACTIONS_RUNTIME_TOKEN 같은 CI 시크릿, AWS 액세스 키·세션 토큰, GCP·Azure 자격증명, Vault 토큰, Kubernetes kubeconfig, npm·PyPI 게시 토큰, SSH·GPG 키, Docker 인증 정보, .env 파일이 포함됐습니다. CI 환경에서는 러너 프로세스 메모리에서 마스킹된 자격증명까지 평문으로 회수하는 기능이 확인돼, 로그에 노출되지 않은 자격증명도 동일하게 유출 대상으로 봐야 합니다.

수집한 자격증명은 공격자가 사전에 만든 무작위 공개 GitHub 저장소(설명 Miasma: The Spreading Blight)로 송출되고, 감염 메인테이너의 발행 권한으로 추가 패키지에 감염시키는 곳에 사용됩니다. Microsoft 분석에서는 sudoers 바인드 마운트로 NOPASSWD 권한 상승, Bun 런타임으로 2차 페이로드 상주, 토큰 회수 시 rm -rf ~/를 트리거하는 데드맨 스위치 와이퍼까지 관측됐습니다.

⚠️ WARN

영향 버전을 설치한 환경의 자격증명은 로그·터미널 출력 노출 여부와 무관하게 유출된 것으로 간주해야 합니다.

회전 우선순위는 npm 발행 토큰·GitHub PAT·클라우드 키이며, npm install --ignore-scripts로 추가 감염을 즉시 차단한 뒤 자격증명 회전을 진행해야 합니다.

■ 탐지 및 IoC

이처럼 provenance 검증을 통과한 침해에서는 페이로드 자체가 감염마다 재암호화돼 해시 기반 탐지가 어려운 반면, 발행 인프라와 실행 행위 IoC는 Wiz·Microsoft 분석에서 공개됐습니다. 정상 OIDC 발행 경로를 거쳤기 때문에 npm 서명 검증만으로는 침해 버전을 가릴 수 없고, 락파일·실행 행위·외부 통신에서 직접 탐지해야 합니다.

• 락파일·SBOM에서 @redhat-cloud-services/* 의존성을 식별하고 frontend-components 7.7.2/7.7.3/7.7.5, rbac-client 9.0.3/9.0.4/9.0.6 등 Wiz가 공개한 96개 침해 버전 목록과 대조합니다.

• 빌드 호스트에서 npm install 직후 node → sh → bun 프로세스 체인이나 /tmp/b-[a-z0-9]+/bun 경로 실행 흔적이 있는지 확인합니다.

• GitHub Audit Log에서 Miasma: The Spreading Blight 설명 또는 <형용사>-<신화생물>-<숫자> 패턴의 공개 저장소가 조직 계정에서 생성됐는지 검색합니다.

• 외부 통신 로그에서 python-requests/2.31.0이나 google-api-nodejs-client/7.0.0 gl-node/20.11.0 gccl/7.0.0로 위장한 트래픽을 헌팅합니다.

• Microsoft Defender XDR 환경에서는 다음 KQL로 CI 러너 메모리 스크래핑 시도를 탐지합니다.

DeviceProcessEvents
| where FileName == "grep"
| where ProcessCommandLine has_all ("value", "isSecret\":true")

■ 대응 방안

• 헌팅과 동시에 npm install --ignore-scripts를 즉시 적용해 모든 preinstall·postinstall 훅의 자동 실행을 차단합니다.

• 6월 1일 전후 영향 버전을 설치한 모든 빌드 러너·개발자 워크스테이션의 GitHub PAT, npm 토큰, AWS·GCP·Azure·Vault·Kubernetes 자격증명, SSH·GPG 키를 즉시 회전합니다.

@redhat-cloud-services/* 의존성은 침해 직전 기준 알려진 안전 버전(예: frontend-components 7.7.1)으로 고정하고 dist-tag 자동 업그레이드를 봉쇄합니다.

• 자체 GitHub Actions 워크플로 디렉터리에 브랜치 보호와 코드 오너 리뷰를 강제해 .github/workflows/* 추가·수정이 단일 푸시로 게시되는 경로를 차단합니다.

• 사내 npm 발행 파이프라인이 OIDC 신뢰 발행을 사용한다면 발행 가능 저장소·환경을 허용 목록으로 제한하고, 발행 직전 워크플로 무결성 검증 단계를 추가합니다.

💡 TIP

정리 후 의존성을 재설치할 때는 node_modules·~/.npm·~/.bun 캐시까지 비운 뒤 --ignore-scripts로 설치해 잔존 페이로드 실행을 막아야 합니다.

빌드 캐시에는 이미 실행된 페이로드와 드롭된 index.js가 남아 있을 수 있습니다.

[참고 자료]

Wiz Research, Miasma Supply Chain Attack Targeting RedHat npm Packages

Aikido, Red Hat npm Packages Compromised to Spread a Credential-Stealing Worm

Microsoft Security Blog, Preinstall to persistence: Inside the Red Hat npm Miasma credential-stealing campaign

Snyk, Miasma Attack Hits Red Hat npm Packages

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.