RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: một dự án giả mạo mã nguồn npm tích hợp trình cắt mã nguồn 40 chuỗi hoạt động như một "Trợ lý thời gian chạy hệ thống" đa hệ điều hành.

TL; DR

Vào ngày 21/05/2026, nhà xuất bản npm jaggle đã phát hành chín phiên bản (1.0.0 thông qua 1.0.8) của @jaggle/resizeobserves trong khoảng thời gian xấp xỉ hai tiếng đồng hồ.

Gói hàng này là một lỗi chính tả so sánh với gói hàng hợp pháp. @juggle/resize-observer polyfill — một gói được sử dụng rộng rãi với hàng triệu lượt tải xuống mỗi tuần — nhưng không bao gồm bất kỳ triển khai ResizeObserver thực tế nào.

Thay vào đó, gói hàng hook postinstall Nó cài đặt một payload Python đi kèm, đăng ký khả năng duy trì hoạt động như một trình môi giới thời gian chạy có giao diện giống với hệ điều hành gốc, và triển khai một công cụ chiếm quyền điều khiển clipboard đa nền tảng nhắm mục tiêu vào các giao dịch tiền điện tử.

Linux sự kiên trì xuất hiện như python3-dbus-helper, macOS as com.apple.python.runtimeCửa sổ as PyRuntimeBroker.

Phần mềm độc hại liên tục giám sát clipboard để tìm địa chỉ ví trên khắp các hệ thống. hơn 40 chuỗi khối và âm thầm thay thế các địa chỉ đã sao chép bằng ví do kẻ tấn công kiểm soát.

Phần mềm độc hại hoạt động hoàn toàn cục bộ mà không có cơ sở hạ tầng C2 hướng ra ngoài, do đó việc thay thế dữ liệu trong clipboard chính là cơ chế đánh cắp thông tin.

Chỉ số IOC chính là tên gói phần mềm: @jaggle/resizeobserves — Lưu ý nguyên âm bị lược bỏ trong “jaggle” và chữ “s” được thêm vào trong “resizeobserves”.

Mức độ nghiêm trọng: cao.

Cuộc tấn công: Cơ chế hoạt động

npm:@jaggle/resizeobserves Thoạt nhìn, nó không giống như phần mềm độc hại. lượt xem npm. của nó README.md Đây là nội dung README nguyên văn của npm:@juggle/resize-observer — Các ví dụ mã giống nhau, hướng dẫn sử dụng giống nhau, không có gì thay đổi. import { ResizeObserver } from '@juggle/resize-observer' Các nguồn tham khảo được trích dẫn xuyên suốt. Việc đạo văn hoàn toàn đến mức bất kỳ ai nhìn thoáng qua tài liệu cũng sẽ cho rằng họ đang đọc tài liệu của gói phần mềm hợp pháp.

package.jsonNgược lại, nó rất thưa thớt: không có kho lĩnh vực, một bin lối vào chỉ vào bin/clipboard-guardian.jssau khi cài đặt kịch bản chạy node npm-install.jsCác ví dụ "Cách sử dụng cơ bản" trong tệp README đề cập đến một đoạn mã JavaScript không hề tồn tại trong tệp nén. Đoạn mã JavaScript duy nhất trong gói là tập lệnh cài đặt.

Giai đoạn 1 — npm postinstall khởi tạo gói tin Python

npm-install.js Nó nhận biết nền tảng. Nó định vị một đánh rớt có thể thực thi dọc theo một đường dẫn tìm kiếm cố định (/ usr / bin / pip3, / usr / local / bin / pip, rơi trở lại python3 -m pip), cài đặt gói Python đi kèm từ thư mục tarball, và — trên Linux — tải xuống xclip or xsell thông qua apt-get, pacman, hoặc là dnf nếu cả hai đều không có sẵn:

Việc sử dụng –break-system-packages Đây là hành động có chủ ý: các bản phân phối Linux hiện đại tích hợp Python với tùy chọn môi trường được quản lý bên ngoài theo PEP 668 được bật, điều này mặc định chặn việc cài đặt pip trên toàn hệ thống. Tập lệnh cài đặt buộc quá trình cài đặt phải diễn ra.

Tập lệnh này cũng nhận biết được lệnh sudo. Khi uid đang chạy là kết quả của một lệnh nào đó... sudo npm install, kịch bản viết SUDO_USER và chi trả cho getentpasswd để tìm thực thư mục chính của người dùng, sau đó ghi các tệp lưu trữ của nó vào đó thay vì vào /nguồn gốcViệc lưu trữ dữ liệu chỉ áp dụng cho từng người dùng, không phải toàn hệ thống.

Giai đoạn 2 — Duy trì tính nhất quán giữa các hệ điều hành dưới tên runtime-broker

Sau khi gói Python được cài đặt, tập lệnh sẽ đăng ký một mục tự khởi động với tên khác nhau trên mỗi hệ điều hành:

  • Linux — một đơn vị người dùng systemd tại ~/.config/systemd/user/python3-dbus-helper.service. Đơn vị của Mô tả Chi tiết is Trợ giúp thời gian chạy D-Bus PythonĐoạn mã cũng cố gắng kích hoạt nó thông qua... systemctl –user enable, quay trở lại sử dụng liên kết tượng trưng thủ công dưới default.target.wants/ khi systemctl thất bại. Nếu chạy với quyền sudo, tập lệnh sẽ chuyển sang sudo -u systemctl –user, với XDG_RUNTIME_DIR Thiết lập để cuộc gọi bus người dùng hoạt động.
  • macOS — một tệp plist của LaunchAgent tại ~/Library/LaunchAgents/com.apple.python.runtime.plist với RunAtLoad=trueGiữ kết nối = đúngsau đó được tải qua launchctl load.
  • Cửa sổ — Một tác vụ theo lịch trình có tên PyRuntimeBroker, được kích hoạt khi đăng nhập (AtLogOn), với giới hạn thời gian thực thi bằng không (tức là không có thời gian chờ), được đăng ký thông qua PowerShell.

Thoạt nhìn, cả ba cái tên đều nghe có vẻ đáng tin cậy. python3-dbus-helper Tuân theo quy ước đặt tên của việc tích hợp Python-D-Bus hợp lệ trên máy tính để bàn Linux. com.apple.python.runtime Mô phỏng cách Apple gán nhãn DNS ngược cho các dịch vụ của riêng mình. PyRuntimeBroker Tương tự như Windows RuntimeBroker.exe — một dịch vụ thực sự, có chữ ký của Microsoft, đóng vai trò trung gian xử lý yêu cầu cấp quyền cho các ứng dụng UWP. Trong ngữ cảnh này, không dịch vụ nào trong số này là dịch vụ thực sự của Apple/Microsoft/Python, mà chỉ là một công cụ giám sát đang thực hiện quét nhanh bằng mắt thường. systemctl –user list-units or Nhận nhiệm vụ theo lịch trình Khó có khả năng nao núng.

Giai đoạn 3 — Kẻ chiếm quyền điều khiển bảng nhớ tạm

Phần mềm độc hại Python, được cài đặt tại clipboard_guardian/guardian.pyChương trình chạy một vòng lặp vô hạn, liên tục kiểm tra nội dung clipboard của hệ thống cứ sau 400 mili giây. Mỗi lần kiểm tra, nó sẽ lấy nội dung clipboard hiện tại thông qua... pyperclip.paste() và so sánh chúng với danh sách hơn bốn mươi biểu thức chính quy được biên dịch sẵn, bao gồm các định dạng địa chỉ ví cho Ethereum, Bitcoin, Monero, Solana, TRON, TON, Ripple, Litecoin, Dogecoin, Polkadot, NEAR, Cosmos, Algorand, Stellar, Cardano, Bitcoin Cash, Dash, Zcash, Aptos, Sui, Tezos, MultiversX, Harmony, Terra, Injective, Osmosis, Kava, Celestia, Nano, Filecoin, Ronin, Ergo, DigiByte, Hedera, BNB Smart Chain và một số loại khác được đánh dấu nhưng trống trong cấu hình mặc định (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).

Khi tìm thấy kết quả khớp, đoạn mã sẽ đọc địa chỉ của kẻ tấn công cho chuỗi đó từ ~/.config/clipboard-guardian/config.json (hoặc các phiên bản tương đương trên cùng một nền tảng) và ghi đè nội dung bảng nhớ tạm bằng văn bản đã thay thế:

Không có tín hiệu mạng nào được phát đi. Phần mềm độc hại không gửi dữ liệu về máy chủ, không đăng ký các máy chủ bị nhiễm, không đánh cắp bất cứ thứ gì. Việc đánh cắp dữ liệu chính là thao tác thay thế: khi người dùng sao chép địa chỉ người nhận từ giao diện ví của họ và dán vào hộp thoại gửi tiền, địa chỉ được dán thuộc về kẻ điều hành. Tiền bị mất ngay trong quá trình giao dịch, mà người dùng không hề hay biết.

Có gì mới ở đây

Một vài chi tiết nổi bật hơn so với mẫu crypto-clipper thông thường:

1. Sự giao thoa giữa npm và Python. Hầu hết các công cụ cắt mã nguồn mà chúng ta thấy trên npm đều được viết bằng JavaScript thuần túy, thường được làm mờ bằng cách sử dụng _0x xoay mảng hoặc eval(atob(…)) các ngăn xếp. Ví dụ này sử dụng gói tarball npm như một trình bao bọc phân phối cho gói Python — Python thuần túy — và để pip xử lý việc cài đặt các phụ thuộc (pyperclip, bột bả, không bắt buộc đặt tiêu đề) được khai báo trong gói pyproject.tomlKhông cần phải vượt qua bất kỳ kỹ thuật làm mờ mã JavaScript nào. Bản thân công cụ cắt xén mã là mã Python đơn giản, dễ đọc.

2. Các nhãn duy trì Tri-OS được lựa chọn dựa trên tính hợp lý. Nhiều trình cài đặt đa nền tảng đăng ký tính năng duy trì hoạt động dưới các tên chung (updater.service, helper.plistMẫu này đã rất cẩn thận chọn các nhãn giống với các trình môi giới thời gian chạy gốc của nền tảng trên mỗi hệ điều hành. Việc đặt tên là nỗ lực duy nhất để che giấu — không có rootkit, không có che giấu người dùng, không có làm mờ đường dẫn. Mục đích là các nhà bảo mật hiếm khi kiểm tra. ~/.config/systemd/user/ và một dịch vụ có tên là python3-dbus-helper Sẽ không gây ấn tượng trong một bài đánh giá sơ lược.

3. Việc ngụy trang bằng tiêu đề quy trình là có thật, nhưng việc chống phân tích thì đang tiềm ẩn. Đoạn mã Python định nghĩa một _disguise_process() hàm thiết lập tiêu đề quy trình thông qua đặt tiêu đề (Linux/macOS) hoặc SetConsoleTitleW (Windows) — và chủ yếu() gọi nó như vậy. Vậy nên ps aux sẽ hiển thị python3-dbus-helper thay vì python3 …/guardian.pyTuy nhiên, cùng một mô-đun đó định nghĩa một is_monitor_running() hàm liệt kê các công cụ giám sát quy trình đã biết (htop, btop(ví dụ: Trình quản lý tác vụ, Trình giám sát hoạt động, Process Hacker, Trình giám sát tài nguyên, trình giám sát hệ thống GNOME/KDE/Xfce/MATE, v.v.) — và chủ yếu() Hàm đó không bao giờ được gọi. Vòng lặp thay thế chạy vô điều kiện, bất kể người dùng có mở trình giám sát tiến trình hay không. Hàm này là mã chết trong phiên bản đã phát hành. Nó rất có thể là phần còn sót lại từ một phiên bản trước đó, hoặc là khung sườn cho một tính năng chưa được kết nối. Dù sao đi nữa, bề mặt chống phân tích của payload được công bố chỉ là một thao tác đổi tên tiêu đề tiến trình, chứ không phải là né tránh trình giám sát chủ động.

4. Hành vi hợp nhất cấu hình được đóng gói. npm-install.js ghi danh sách ví mặc định vào ~/.config/clipboard-guardian/config.json Và nếu tệp cấu hình đã tồn tại, nó sẽ hợp nhất bất kỳ khóa nào có giá trị hiện tại trống. Điều đó có nghĩa là người dùng đã từng bị nhiễm virus và đã dọn dẹp một phần tệp cấu hình — ví dụ, bằng cách làm trống tệp cấu hình… ethereum Giá trị này sẽ được điền lại bởi mỗi lần cài đặt gói phần mềm độc hại tiếp theo. Không có bất kỳ thao tác dọn dẹp nào đối với tệp lưu trữ dữ liệu trong bất kỳ đường dẫn mã nào.

Ngày/Giờ (UTC) Sự kiện
2026-05-21 18:50:32 @jaggle/resizeobserves@1.0.0 được phát hành.
2026-05-21 19:55:55 1.0.1 Đã xuất bản — phiên bản đầu tiên được gắn cờ bởi quá trình quét bên ngoài.
2026-05-21 19:58:10 1.0.2 được phát hành.
2026-05-21 20:05:03 1.0.3 được phát hành.
2026-05-21 20:09:24 1.0.4 được phát hành.
2026-05-21 20:13:48 1.0.5 được phát hành.
2026-05-21 20:41:52 1.0.6 được phát hành.
2026-05-21 20:43:56 1.0.7 đã xuất bản — bổ sung thêm try/catch lớp bao bọc xung quanh bước ghi cấu hình ví trong npm-install.js.
2026-05-21 20:46:15 1.0.8 đã xuất bản — trình cài đặt được đổi tên npm-install.jsnpm-install.cjs (Nội dung giống hệt nhau từng byte).
2026-05-22 Các phán quyết và IOC đã được công bố. Các phiên bản vẫn còn tồn tại trong hệ thống đăng ký tại thời điểm công bố (đang tiếp diễn).

Chín phiên bản trong một giờ năm mươi sáu phút là tốc độ nhanh ngay cả đối với một người chuyên sửa lỗi chính tả. Mô hình này phù hợp với... chiến dịch xuất bản và đốt — Ghi đè lên registry dưới một handle duy nhất, để quá trình phát hiện diễn ra tự nhiên, và chuyển sang handle mới sau khi một phiên bản duy nhất bị xóa. Sự khác biệt có thể nhìn thấy trong suốt quá trình chỉ mang tính hình thức: phiên bản 1.0.1 đã thêm thông tin rõ ràng. / usr / bin / pip3- Các đường dẫn kiểu đến danh sách tìm kiếm pip (tương thích giả), phiên bản 1.0.7 đã bao bọc việc ghi cấu hình ví trong khối try/catch, và phiên bản 1.0.8 đã đổi tên trình cài đặt từ . Js đến .cjs trong khi vẫn giữ nguyên nội dung từng byte. .cjs Đổi tên các track với cảnh báo npm về việc phân giải mô-đun không rõ ràng trong các gói không có chỉ định rõ ràng. "kiểu" trường này có thể là một nỗ lực nhằm ngăn chặn tiếng ồn trong quá trình cài đặt có thể thu hút sự chú ý. Phần mã Python — phần duy nhất thực sự đánh cắp dữ liệu — không thay đổi trong cả chín phiên bản.

Các chỉ số về sự thỏa hiệp

Gói

Hệ sinh thái Bưu kiện Các phiên bản Trạng thái
NPM @jaggle/resizeobserves 1.0.0 thông qua 1.0.8 Đang phát trực tiếp tại thời điểm đăng tải; đã yêu cầu gỡ bỏ.

Tệp & Mã băm

Đường dẫn Ghi Chú
clipboard_guardian/guardian.py
(md5 f7935c2c82bc881288611ab6cd634f17)
Giống hệt nhau trong cả chín phiên bản đã xuất bản (1.0.0 thông qua 1.0.8). Phần tải trọng của thiết bị cắt.
npm-install.js (1.0.0 – 1.0.7)
npm-install.cjs (1.0.8)
Trình cài đặt duy trì; hoạt động đồng nhất từ ​​đầu đến cuối. 1.0.7's .js1.0.8's .cjs Chúng giống hệt nhau về mặt byte.
~/.config/clipboard-guardian/config.json Cấu hình lưu trữ dữ liệu Linux và gói ví.
~/Library/Application Support/clipboard-guardian/config.json Cấu hình lưu trữ dữ liệu và gói ví macOS.
%APPDATA%\clipboard-guardian\config.json Cấu hình lưu trữ dữ liệu Windows và gói ví.
~/.config/systemd/user/python3-dbus-helper.service Tính năng tự khởi động và duy trì trạng thái hoạt động của Linux.
~/Library/LaunchAgents/com.apple.python.runtime.plist Tính năng duy trì trạng thái LaunchAgent trên macOS.
~/Library/Logs/com.apple.python.runtime.log Nhật ký stdout/stderr của macOS dành cho tác nhân.
Scheduled Task PyRuntimeBroker Tác vụ tự khởi động của Windows (AtLogOn(không có thời gian chờ).

Chỉ số hành vi

Tín hiệu Mô tả Chi tiết
pip install --break-system-packages from npm postinstall Buộc cài đặt Python trên toàn hệ thống, bỏ qua các biện pháp bảo vệ của PEP 668.
apt-get install -y xclip (hoặc pacman/dnf) Cài đặt các tiện ích clipboard trên Linux trong quá trình cài đặt gói phần mềm.
python3-dbus-helper.service đơn vị người dùng systemd Quá trình lưu trữ được đăng ký dưới một tên hỗ trợ thời gian chạy có vẻ hợp lý.
com.apple.python.runtime Đại lý Launch Nhãn lưu trữ nằm ngoài các đường dẫn hệ thống hợp lệ của Apple.
PyRuntimeBroker Công việc đã lên lịch Giả mạo hệ thống duy trì hoạt động của Windows runtime broker mà không có nguồn cài đặt hợp lệ.
Tiến trình Python có tiêu đề python3-dbus-helper nhập khẩu pyperclippsutil Lỗi không khớp hành vi giữa tên tiến trình được hiển thị và các thư viện đã nhập.
Các thay đổi trong clipboard diễn ra khoảng 0.4 giây sau khi sao chép địa chỉ ví. Đặc điểm nhận dạng của việc thay thế địa chỉ tiền điện tử.

Bộ ví của kẻ tấn công (danh sách săn lùng của người phòng thủ)

Danh sách ví được mã hóa cứng trong file. npm-install.jsclipboard_guardian/guardian.pyCác chuyên gia phòng thủ có thể sử dụng danh sách này như một danh sách chặn (coi bất kỳ giao dịch chuyển tiền nào đến các địa chỉ này từ ví doanh nghiệp là đáng ngờ) và một khóa truy tìm (coi sự hiện diện của bất kỳ chuỗi ký tự nào trong số này trong tệp cấu hình chưa được xác thực, sản phẩm xây dựng hoặc máy của nhà phát triển là dấu hiệu lây nhiễm).

Gói ví tấn công

Chuỗi Địa Chỉ
Ethereum / BSC 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Ronin (EVM) ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
giá BTC, bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
Tiền mặt Bitcoin bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
Litecoin ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
dogecoin DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
Dash XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcash t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByte DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
Monero 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
Solana DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
TRON TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
TON UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
Ripple r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
Polkadot 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
NEAR 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
Vu trụ cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
thẩm thấu osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
thiên thần celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
Tiêm inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
Kava kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
Hòa điệu one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
Trái đất terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
Algorand XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
Sao GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
Cardano addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
Đa năngX erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
đúng cách 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
Tùy 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
Nano nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoin f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
Tezos tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
Vậy thì 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
Hedera 0.0.10488092

Các chuỗi có phạm vi bao phủ regex nhưng có các ô ví trống trong cấu hình mặc định — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — không được thay thế chủ động trong bản dựng này nhưng vẫn được phát hiện. Hãy coi chúng thuộc phạm vi giám sát hơn là phạm vi thay thế.

Sự quy kết và động lực

Chiến dịch này cung cấp thông tin về nguồn gốc khá hạn chế. Chúng tôi chưa thể xác nhận danh tính của nhà điều hành. Những gì chúng tôi có thể ghi nhận:

  • Siêu dữ liệu của nhà xuất bản. Tài khoản npm jaggle liệt kê email của nó là olgascarlet@deltajohnsons.com. Lĩnh vực deltajohnsons.com Không thể xác định được danh tính doanh nghiệp mà chúng tôi có thể xác minh. Tài khoản npm không hiển thị xác minh email và không có thông tin nào khác. SCM Xác minh. Không có sự hiện diện công khai nào trên GitHub liên quan.
  • Trường kho lưu trữ. package.json không mang theo kho lĩnh vực. Tính hợp pháp npm:@juggle/resize-observer Điểm này trỏ đến một kho lưu trữ GitHub thực sự với hàng nghìn lượt đánh dấu sao và các vấn đề đang hoạt động. Việc thiếu liên kết đến kho lưu trữ là dấu hiệu trực quan nhanh nhất trên giao diện người dùng của npm.
  • Đạo văn trong file README. Tệp README của gói là tệp hợp lệ. @juggle/resize-observer README từng byte một, bao gồm nhập khẩu ví dụ tham khảo @juggle/resize-observer Bản thân nó (không phải gói xuất bản). Người vận hành thậm chí còn không buồn viết lại các câu lệnh import — một dấu hiệu phổ biến cho thấy tệp readme được sao chép nguyên văn chứ không phải được chỉnh sửa cho phù hợp.
  • Không có cơ sở hạ tầng để chuyển hướng. Không có điểm cuối C2, không có tra cứu DNS, không có địa chỉ IP. Hành vi độc hại được gói gọn hoàn toàn trong trình cắt cục bộ cộng với gói ví được mã hóa cứng. Điều này khiến việc chuyển hướng dựa trên tên miền hoặc ASN trở nên bất khả thi. Những người phòng thủ chuyển hướng giữa các chiến dịch nên đối chiếu mã băm của ví với bất kỳ trình cắt nào trước đó mà họ đã lưu trữ; việc tái sử dụng ví giữa các gói là liên kết xuyên chiến dịch dễ theo dõi nhất.
  • Lựa chọn tên gọi. @jaggle/resizeobserves thiếu một ký tự @juggle và chỉ khác một chút so với cái tên quen thuộc. người quan sát thay đổi kích thướcKhoảng cách chỉnh sửa kết hợp là hai ký tự. Đây là một sự va chạm trực quan có chủ ý, chứ không phải là một thao tác thu nhỏ ngẫu nhiên.

Động cơ, bắt nguồn từ hành vi của phần mềm độc hại: kiếm tiền thuần túy thông qua việc thay thế dữ liệu sao chép một cách cơ hội. Không có việc thu thập thông tin đăng nhập, không có việc nhận dạng máy chủ, không có việc đọc biến môi trường. Kẻ tấn công không quan tâm nạn nhân là ai — họ chỉ quan tâm đến việc giao dịch tiếp theo của nạn nhân sẽ trỏ đến một trong những địa chỉ được liệt kê. Phạm vi bao phủ 40 chuỗi là mô hình xổ số đang hoạt động: tung xúc xắc rộng, hy vọng một đoạn mã sao chép có giá trị cao sẽ trúng đích một lần sau mỗi N lần cài đặt.

Người điều hành dường như không quan tâm đến việc gỡ bỏ. Việc phát hành chín phiên bản trong vòng hai giờ với cùng phạm vi cho thấy đây là một chiến lược "phát hành rồi xóa": tối đa hóa dung lượng lưu trữ trên registry trước khi độ trễ gỡ bỏ bắt kịp, rồi tiếp tục. Chúng tôi chưa quan sát thấy @jaggle Tái bản với phạm vi mới tại thời điểm viết bài này, nhưng chúng tôi kỳ vọng sẽ có các phạm vi tương tự (@jaggie, @juggle-, @joggle(Thông báo này sẽ xuất hiện trong những ngày tới nếu nhà mạng vẫn còn hoạt động.)

Tác động, xu hướng và những điều mà các hậu vệ nên làm

 Va chạm

Hiện tại, việc định lượng tác động bằng tiền thật là không thể. Công cụ cắt không ghi lại bất kỳ dữ liệu đo từ xa nào và các ví chưa được ghi nhận nhận được các giao dịch chuyển khoản thay thế tính đến thời điểm kết thúc phân tích (việc quét tiếp theo các chuỗi được liệt kê nằm trong kế hoạch của chúng tôi). Tính hợp pháp npm:@juggle/resize-observer Trung bình mỗi tuần có hàng triệu lượt tải xuống — một mục tiêu tấn công chiếm đoạt tên miền có lưu lượng truy cập cao — và gói phần mềm độc hại này chỉ hoạt động trong chưa đầy 24 giờ tại thời điểm công bố, điều này hạn chế số lượng người bị ảnh hưởng nhưng không loại bỏ hoàn toàn nguy cơ.

Phạm vi ảnh hưởng của vụ nổ cần theo dõi không phải là các lượt tải xuống trực tiếp. @jaggle/resizeobserves — những trường hợp đó có thể nhỏ. Đó là **cài đặt gián tiếp**: một nhà phát triển thêm gói vào dự án thử nghiệm, rồi chạy. NPM cài đặtvà sau đó quên mất rằng hook cài đặt đã từng chạy. Mỗi máy đã xử lý postinstall giờ đây đều có một phần mềm chiếm quyền điều khiển clipboard cho mỗi người dùng khi tự động khởi động, bất kể dự án còn trên ổ đĩa hay không. Xóa thư mục gói khỏi nút_mô-đun Không loại bỏ được tính bền vững.

Các mẫu mới nổi

Chiến dịch này thể hiện hai xu hướng điển hình.

npm như một trình bao bọc để phân phối dữ liệu Python. Tệp nén npm là trình cài đặt gồm 4 dòng lệnh; phần mềm độc hại thực sự là Python, được cài đặt trên toàn hệ thống bởi đánh rớt từ thư mục được đóng gói. Điều này không phải là mới — chúng ta đã từng thấy các gói npm loại bỏ Python trước đây — nhưng nó đang trở nên phổ biến hơn đáng kể trong các chiến dịch cắt mã bí mật. Lợi thế đối với kẻ tấn công là gấp đôi: thư viện clipboard Python (pyperclip (đầu tiên trong số đó) sạch hơn và tương thích đa nền tảng hơn so với các phiên bản JavaScript tương đương, và Hầu hết các công cụ quét npm tự động đều ưu tiên xử lý các tệp JavaScript và Python. .py bó nhẹ. Nhược điểm là thiết bị lắp đặt này ồn hơn nhiều — một thiết bị mới cài đặt pip Khó có thể che giấu điều này trên máy tính của nhà phát triển, vốn thường không... cài đặt pip suốt trong NPM cài đặt.

Chỉ sử dụng tên gốc của nền tảng làm phương thức ẩn danh duy nhất. Một số phần mềm cắt xén và phần mềm đánh cắp dữ liệu nhỏ gần đây đã loại bỏ hoàn toàn việc che giấu mã nguồn, thay vào đó sử dụng các nhãn duy trì trông có vẻ hợp pháp. python3-dbus-helper, com.apple.python.runtimePyRuntimeBroker Đây là những ví dụ điển hình trong sách giáo khoa — những cái tên mà con mắt của người bảo vệ sẽ bỏ qua trong danh sách bốn mươi dịch vụ người dùng. Đây là một hình thức ẩn danh rẻ tiền và bền vững: việc gỡ bỏ được thực hiện trên từng gói, nhưng các tệp lưu trữ vẫn tồn tại sau khi gỡ bỏ, và một dịch vụ được đặt tên theo một thành phần nền tảng trông có vẻ thật sẽ không bị xóa bỏ bởi bất kỳ thứ gì ngoại trừ một cuộc kiểm tra rõ ràng.

Những điều mà các hậu vệ nên làm

  • Kiểm tra nhật ký hệ thống ~/.config/systemd/user/, ~/Library/LaunchAgents/ và Get-ScheduledTask. đầu ra Trên máy của nhà phát triển, các mục được liệt kê trong IOC vẫn còn. Việc gỡ bỏ gói npm sẽ không xóa chúng; cần phải gỡ bỏ thủ công.
  • Thực hiện chuyển khoản khối đến các địa chỉ ví được liệt kê. tại ranh giới giữa kho bạc doanh nghiệp và ví DeFi, nơi cho phép liệt kê địa chỉ.
  • Tìm tệp ~/.config/clipboard-guardian/config.json (và các phiên bản tương đương trên nhiều nền tảng) trên toàn bộ hệ thống máy tính của nhà phát triển. Sự hiện diện của tập tin này là dấu hiệu lây nhiễm với độ tin cậy cao, bất kể phiên bản gói phần mềm nào đã phân phối nó.
  • Tìm kiếm tệp clipboard_guardian/guardian.py trong thư mục node_modules/ trong các bản chụp nhanh bộ nhớ cache bản dựng có thể có trước khi gỡ bỏ. Mã MD5 của tệp ổn định trên tất cả các phiên bản đã được xem xét.
  • Lockfile-pin @juggle/resize-observer (gói hợp lệ) để các lần cài đặt trong tương lai không thể chuyển sang bất kỳ thứ gì khác chỉ vì lỗi đánh máy một ký tự, đặc biệt là trong các quy trình làm việc không có tệp khóa như npx.
  • Hãy coi bất kỳ lệnh npm postinstall nào gọi pip install mức độ nghiêm trọng cao trong quá trình xây dựng-pipeline chính sách. Không có lý do chính đáng nào để một gói npm cần pip khi cài đặt — công cụ Python phân phối công cụ Python.
  • Tìm kiếm dữ liệu giám sát tương đương với process_iter() cho các tiến trình có tên python3-dbus-helper nhập pyperclip — Sự không khớp về ngụy trang (trình trợ giúp D-Bus đang giữ thư viện clipboard) là dấu hiệu hành vi rõ ràng nhất mà chúng ta có.
  • Xoay vòng địa chỉ ví được dán từ các máy bị nhiễm virus. Phần mềm chiếm quyền điều khiển clipboard làm gián đoạn đường dẫn giữa giao diện người dùng ví và đích sao chép; các địa chỉ được sao chép trong khi bị nhiễm có thể bị thay đổi một cách âm thầm. Bất cứ thứ gì được gửi trong thời gian nhiễm bệnh đều nên được coi là có khả năng bị gửi sai địa chỉ.

Tóm lại: sự kiên trì sẽ tồn tại lâu hơn cả việc bị gỡ bỏ. Hệ thống đăng ký cuối cùng sẽ xóa bỏ thông tin đó. @jaggle/resizeobserves Trong cả chín phiên bản, đơn vị systemd, LaunchAgent và Scheduled Task sẽ không tự xóa.

dự án

sca-tools-software-composition-analysis-tools
Ưu tiên, khắc phục và bảo mật các rủi ro phần mềm của bạn
Đăng ký tài khoản miễn phí ngay.
Không cần thẻ tín dụng.

Bảo mật quá trình phát triển và phân phối phần mềm của bạn.

với bộ sản phẩm Xygeni