Để tránh các gói bị xâm nhập được đưa vào như một phần phụ thuộc trong các dự án lớn, các đội ngũ bảo mật cần cảnh giác và theo dõi sát sao các đoạn mã độc hại.

Các nhà nghiên cứu tại ReversingLabs đã theo dõi nhiều kho mã công khai trong vài năm qua. Gần đây, nhóm nghiên cứu đã mở rộng hoạt động săn lùng mối đe dọa sang nền tảng VSCode Marketplace và bắt đầu ghi nhận sự gia tăng đáng kể của các hành vi độc hại tại đây.
Trước đây, nhóm nghiên cứu của RL đã từng chứng kiến mức độ dễ dàng và nhanh chóng mà các cuộc tấn công chuỗi cung ứng có thể lan rộng từ cộng đồng npm sang VSCode Marketplace. Bằng cách sử dụng các gói npm, những kẻ tấn công có thể chèn mã độc vào môi trường phát triển VSCode IDE — một yếu tố thường bị bỏ qua trong đánh giá bảo mật.
Đáng chú ý, vào tháng 11 năm 2024, hướng lan truyền này đã đảo chiều. Một tháng sau đó, chiến dịch khởi phát từ nền tảng VSCode đã xuất hiện trong cộng đồng npm với gói độc hại có tên etherscancontracthandler, mang nhiều điểm tương đồng với các tiện ích mở rộng VSCode độc hại đã được ghi nhận trước đó.
So sánh giữa gói npm và tiện ích mở rộng VSCode
Các tiện ích mở rộng VSCode — vốn được phát triển bằng Node.js — thực chất là các gói npm được đóng gói thêm lớp kết nối với API của VSCode. Khi phát triển tiện ích, lập trình viên có thể sử dụng bất kỳ gói npm nào, điều này tạo ra kẽ hở cho mã độc được chèn thông qua các gói npm trông như hợp lệ. Như bài viết trên blog của nhóm RL từng đề cập, các tiện ích mở rộng VSCode thường không bị xem là nguồn rủi ro bảo mật vì “chúng chỉ là plugin cho môi trường phát triển, không can thiệp trực tiếp vào mã nguồn dự án”.
Tuy nhiên, chiến dịch được phát hiện trên nền tảng npm đã cho thấy quyết tâm của những kẻ tấn công trong việc làm ô nhiễm chu trình phát triển phần mềm. Mặc dù các tiện ích mở rộng độc hại đã nhanh chóng bị gỡ khỏi VSCode Marketplace, tác nhân độc hại vẫn chuyển hướng sang npm để tiếp tục phát tán các gói chứa mã độc. Do npm được sử dụng không chỉ trong quá trình phát triển ứng dụng Node.js mà còn trong các tiện ích VSCode, nên diện tấn công mở rộng đáng kể. Điều này khiến cả môi trường phát triển nội bộ cũng có thể bị xâm phạm nếu các gói npm độc hại được cài đặt gián tiếp.
Làn sóng tiện ích độc hại mới tấn công VSCode
Trong suốt tháng 10 năm 2024, nhóm nghiên cứu của RL đã phát hiện làn sóng tiện ích VSCode độc hại mới, tất cả đều chứa chức năng tải mã độc về máy nạn nhân — và đều thuộc cùng một chiến dịch. Cộng đồng đã được cảnh báo về chiến dịch này từ đầu tháng 10 và nhóm RL đã liên tục theo dõi diễn biến kể từ đó.
Tính đến hiện tại, tổng số gói được xác nhận thuộc chiến dịch này đã lên tới 18.
Ban đầu, chiến dịch nhắm vào cộng đồng tiền mã hóa, nhưng đến cuối tháng 10, các tiện ích độc hại chủ yếu giả mạo ứng dụng Zoom. Mỗi tiện ích mới được phát hành đều tinh vi hơn tiện ích trước, cho thấy kẻ tấn công đã đầu tư kỹ lưỡng hơn để làm cho các tiện ích trông hợp lệ. Hai tiện ích đáng chú ý là EVM.Blockchain-Toolkit và VoiceMod.VoiceMod có số lượt cài đặt bị thổi phồng không tương xứng với số lượt tải thực tế. Ngoài ra, chúng còn có nhiều đánh giá giả mạo, rõ ràng là do chính tác giả tạo ra nhằm đánh lừa người dùng.
Tất cả các tiện ích mở rộng đều rất giống nhau và có chức năng giống nhau. Tệp độc hại được tìm thấy trong chúng đã được mã hóa bằng Javascript Obfuscator, điều này là lý do tại sao những tiện ích này gây nghi ngờ và được điều tra.
Về chức năng, mã của các tiện ích mở rộng này rất đơn giản. Tất cả các tiện ích mở rộng đều tải về tệp payload giai đoạn hai từ nhiều miền khác nhau, trong đó một số miền được lặp lại nhiều lần hơn so với những miền khác.
Hầu hết các tiện ích mở rộng này được tiếp thị như một “Hỗ trợ ngôn ngữ Solidity cho Visual Studio Code,” và một số miền, chẳng hạn như hxxps[:]//microsoft-visualstudiocode[.]com hoặc thậm chí hxxps[:]//captchacdn[.]com, phản ánh điều này. Các tác nhân độc hại có thể đã tạo ra một số miền này để cố gắng lừa người dùng tin rằng chúng là các điểm tải phần mềm hợp pháp. Một số miền cũng thú vị vì TLD (miền cấp cao nhất) của chúng – .lat và .ru, là TLD dành cho cộng đồng và người dùng Latinh Mỹ và Nga tương ứng.
Các gói độc hại: Phần tiếp theo
Gói gốc xuất hiện trên npm tương tự như những gì nhóm nghiên cứu RL đã thấy trên VSCode Marketplace. Nó cũng nhắm mục tiêu vào cộng đồng tiền điện tử, với những điểm tương đồng rõ rệt, đến mức có thể kết luận rằng chúng được phát hành bởi cùng một tác nhân độc hại hoặc một nhóm các tác nhân độc hại.
Hiện tại, có năm phiên bản của gói etherscancontracthandler đã được công bố trên npm, và nó là gói duy nhất liên quan đến chiến dịch này. Chỉ ba phiên bản trong số năm phiên bản chứa payload độc hại đã được mã hóa bằng Javascript. Tất cả các phiên bản đều là tải xuống, tải về từ các điểm tải về giai đoạn hai giống như các tiện ích mở rộng VSCode đã tải về. Các miền là giống nhau, nhưng chuỗi tải về giai đoạn hai là giống nhau trong cả tiện ích mở rộng VSCode và gói npm.
Một đặc điểm tương tự nữa là cấu trúc mã giữa các payload độc hại được mã hóa. Sự khác biệt duy nhất là một cái được làm để là một tiện ích mở rộng VSCode, và cái còn lại được làm để là một gói npm.
Khi chúng tôi phát hiện gói npm, chúng tôi đã báo cáo cho các quản trị viên npm, và họ đã kịp thời gỡ bỏ nó. Gói này đã được tải xuống chỉ khoảng 350 lần, vì vậy may mắn là phạm vi của gói này không lớn lắm.
Đối phó với các lỗ hổng trong IDE
Khả năng cài đặt các plugin và mở rộng chức năng của IDE khiến chúng trở thành mục tiêu rất hấp dẫn cho các tác nhân độc hại. Các tiện ích mở rộng của VSCode thường bị bỏ qua như một rủi ro bảo mật khi cài đặt trong IDE, nhưng việc xâm nhập vào một IDE có thể trở thành điểm khởi đầu cho việc xâm nhập vào chu trình phát triển trong doanh nghiệp.
Như hướng dẫn của nhóm làm việc Enduring Security Framework trong tài liệu “Securing the Software Supply Chain” đã chỉ rõ:
“Để đảm bảo tính toàn vẹn của quá trình phát triển, tất cả các IDE và các plugin liên quan được sử dụng trong môi trường phát triển phải được phê duyệt trước, xác nhận và quét để tìm các lỗ hổng trước khi được tích hợp vào bất kỳ máy phát triển nào.”
Điều quan trọng là thực hiện các đánh giá bảo mật thường xuyên. Các phiên bản mới của các phụ thuộc hoặc sản phẩm hiện có có thể giới thiệu các lỗ hổng mới, rủi ro và các vấn đề khác mà có thể được phát hiện qua việc kiểm tra thường xuyên. Các đánh giá bảo mật cũng có thể hữu ích trong việc phát hiện các thư viện bị hijack hoặc nhiễm độc trước khi chúng được đưa vào sản xuất, hoặc đảm bảo rằng các pipeline xây dựng không bị xâm nhập.
Kết luận
Vào tháng 3 năm 2023, các nhà nghiên cứu của RL đã thảo luận về sự lây lan của các phụ thuộc độc hại được xuất bản trên npm qua một module npm bị xâm phạm vào hệ sinh thái VSCode. Họ đã giải thích cách thức dễ dàng mà việc này có thể xảy ra và làm thế nào mà một IDE có thể bị xâm nhập. Lần này, các nhà nghiên cứu RL đã xác định được cách các kho mã đã trao đổi vị trí cho nhau. Chiến dịch độc hại từ VSCode đã mở rộng sang npm, làm tăng diện tấn công, vì các gói npm có thể được tích hợp vào các tiện ích mở rộng VSCode, các gói npm khác và các ứng dụng Node.js.
Khi sử dụng các gói từ các kho công cộng, các nhà phát triển nên cảnh giác với khả năng mã độc có thể được tích hợp vào để tránh việc một gói độc hại bị đưa vào làm phụ thuộc trong một dự án lớn hơn. Cộng đồng RL Spectra Assure giúp quy trình này trở nên dễ dàng hơn rất nhiều.
Các tổ chức phát triển cũng nên xem xét kỹ lưỡng các tính năng và hành vi của mã nguồn mở, mã bên thứ ba và mã thương mại mà họ đang dựa vào, để theo dõi các phụ thuộc và phát hiện payload độc hại tiềm ẩn trong chúng. Nền tảng Spectra Assure của RL cung cấp khả năng hiển thị sâu sắc mà các đội ngũ cần để phát hiện malware.
Các chỉ số của sự xâm nhập (IOC)
Các chỉ số của sự xâm nhập (IoC) là những bằng chứng hoặc chứng cứ pháp lý liên quan đến một sự vi phạm bảo mật hoặc hoạt động trái phép trên mạng hoặc hệ thống máy tính. IoC đóng một vai trò quan trọng trong các cuộc điều tra an ninh mạng và các nỗ lực ứng phó sự cố, giúp các nhà phân tích và chuyên gia bảo mật nhận diện và phát hiện các sự cố bảo mật tiềm tàng.
Sau đây là các IoC đã được thu thập trong cuộc điều tra của ReversingLabs về chiến dịch chuỗi cung ứng phần mềm độc hại này.
npm packages
package_name | version | SHA1 |
---|---|---|
etherscancontracthandler | 1.0.0 | e950ead90af29948e1b0b19b4bdf65821648aeeb |
etherscancontracthandler | 2.0.0 | 5312be1dbf1b2dd2ba15d05b4e607c4bde533b4 |
etherscancontracthandler | 3.0.0 | 5e524e3f5b59b2ddd9072d63d60cc324d7bbfee1 |
etherscancontracthandler | 3.0.1 | b1f8c2cce43986b9a4bd04c19cb356cc93de930 |
etherscancontracthandler | 4.0.0 | 44c5170aba403943fa054432852f3c1a00178311 |
VSCode Extensions
unique_identifier | version | SHA1 |
---|---|---|
EVM.Blockchain-Toolkit | 1.0.0 | 5390a60adfd8dbf5aef4e132e8565659518ef995 |
VoiceMod.VoiceMod | 0.2.0 | b9544c0bd0a1da21f2048673c214795312c636c |
ZoomVideoCommunications.Zoom | 0.2.0 | f2c8e3fbaa7c398f8678ab5cfb26cb2d9124641e |
ZoomINC.Zoom-Workplace | 0.2.0 | 6da24384853e68cc80107f8ba87185b1cd45f93d |
Ethereum.SoliditySupport | 1.0.0 | 0d5710de0832f2cc3667536fdc3d808642e6593a27 |
ZoomWorkspace.Zoom | 0.2.0 | c7f67ff39917a8f22da34fdeb4a0c1915db2ad10 |
ZoomWorkspace.Zoom | 0.9.0 | 0289c2bc1c9e10bc053ef25d1517923e2a87f714 |
ZoomWorkspace.Zoom | 0.1.0 | 11d432d5d6d8792900e31371db4380aa9ac9eb984 |
ethereumorg.Solidity-Language-for-Ethereum | 1.0.0 | 025df45211ff310e328049f4f579c3429875175e |
VitalikButerin.Solidity-Ethereum | 1.0.0 | 53c4207325d46d0f8c5aee1f1f6cec79d0247f031 |
VitalikButerin.Solidity-Ethereum | 1.0.1 | cdc2389f6f240773fc196f26fbc73d7607ef71fd6 |
SolidityFoundation.Solidity-Ethereum | 1.0.0 | 6f2d90229f8d3a2a0af51fc7cd208bcc02342b3d3e |
EthereumFoundation.Solidity-Language-for-Ethereum | 1.0.1 | 53f7be3adec90f2645921d3d1d9fff8892d8c2fdd |
EthereumFoundation.Solidity-Language-for-Ethereum | 1.0.0 | 1f8ead255e26a76a8f5f4a4be11ac0e517378e5698 |
SOLIDITY.Solidity-Language | 1.0.0 | 8a08b4c52b66349ef2e9ed2ad49f6bb5bcf5b039e |
GavinWood.SolidityLang | 1.0.0 | 5ae998a23da7aacd4faf492e4db42d9b5e89bbddd |
GavinWood.SolidityLang | 1.0.1 | db0341d19ff907d2d254531139bdb52ff4cf6bbf |
EthereumFoundation.Solidity-for-Ethereum-Language | 1.0.0 | e114543341a47477f325098008a099ec688831e4 |