Một gói npm độc hại, được ngụy trang dưới dạng công cụ lập chỉ mục dữ liệu thông thường, đã phơi bày một điểm yếu trong các biện pháp phòng thủ chuỗi cung ứng phần mềm. Gói này, có tên indexed-btree, đã sao chép danh tính của thư viện hợp pháp sorted-btree và ghi nhận gần hai triệu lượt tải xuống hàng tuần.
Chiến dịch này đáng chú ý vì mã độc không yêu cầu chạy trong quá trình nhà phát triển cài đặt nó. Thay vào đó, nó nằm trong mã ứng dụng thông thường và kích hoạt khi thư viện được sử dụng, biến một dependency đáng tin cậy thành một kênh để thu thập thông tin hệ thống, đánh cắp dữ liệu và triển khai các payload tiếp theo. Các nhà nghiên cứu tại Checkmarx đã xác định hoạt động này.
Chiến dịch độc hại của indexed-btree
Checkmarx đã báo cáo rằng chiến dịch này cho thấy lý do tại sao các kiểm tra chỉ tập trung vào các tập lệnh cài đặt có thể bỏ sót các mối đe dọa thực thi sau đó. Gói indexed-btree không có lệnh preinstall hoặc postinstall trong cấu hình gói của nó, do đó việc cài đặt riêng lẻ không kích hoạt quy trình độc hại. Sự thiếu vắng này có thể khiến gói trông có vẻ an toàn trong quá trình xem xét nhanh chóng.
Mã độc được đặt trong phương thức BTree.prototype.set, một phương thức cốt lõi có khả năng được gọi khi ứng dụng lưu trữ dữ liệu. Khi điều kiện yêu cầu được đáp ứng, mã đó sẽ khởi chạy một thành phần giai đoạn đầu được làm rối, cho phép mối đe dọa chạy trong quá trình hoạt động bình thường của chương trình thay vì ở giai đoạn cài đặt được giám sát chặt chẽ hơn. Thiết kế này làm thay đổi câu hỏi phòng thủ từ việc một gói có trình cài đặt rủi ro hay không, sang việc nó thực hiện những gì sau khi được nhập và sử dụng.
Các báo cáo trước đây về lạm dụng gói phản chiếu độc hại cho thấy kẻ tấn công tiếp tục điều chỉnh các kênh phát triển đáng tin cậy để phân phối. Gói indexed-btree đã có gần hai triệu lượt tải xuống hàng tuần.
Cơ chế hoạt động và mục tiêu
Giai đoạn đầu tiên thu thập kiến trúc hệ điều hành, tên máy chủ, bộ xử lý, bộ nhớ và thời gian hoạt động của hệ thống. Nó gửi thông tin này đến các đích do kẻ tấn công kiểm soát, sau đó tham vấn một hợp đồng thông minh trên mạng thử nghiệm Ethereum Sepolia thay vì một máy chủ lệnh thông thường. Thiết kế dựa trên blockchain này có thể làm cho việc gián đoạn trở nên khó khăn hơn vì hợp đồng có thể trỏ mã độc đến một địa chỉ thay thế nếu một đích trước đó bị chặn.
Mã này sau đó sử dụng trao đổi khóa mật mã để suy ra một khóa giải mã và kết hợp dữ liệu được mã hóa từ hợp đồng vào một payload giai đoạn hai. Gói độc hại này cũng bao gồm các chức năng nhằm loại bỏ các tệp mã độc và xóa trình kích hoạt khỏi phương thức prototype. Việc dọn dẹp có thể hạn chế bằng chứng sau khi ứng dụng lần đầu tiên sử dụng thư viện.
Rủi ro và khuyến nghị
Quy mô của chiến dịch này tạo ra rủi ro cho các tổ chức có các dự án có thể đã kéo gói này vào hệ thống xây dựng, môi trường thử nghiệm hoặc dịch vụ sản xuất. Kẻ tấn công cũng đã tạo ra một kho lưu trữ và lịch sử tài khoản thuyết phục, làm tăng độ tin cậy cho một gói được thiết kế để hòa lẫn vào công việc phát triển thông thường.
Chiến dịch này minh họa một lỗ hổng khi các nhóm bảo mật coi sự vắng mặt của các tập lệnh vòng đời là bằng chứng cho thấy một gói npm là vô hại. Cơ chế kiểm soát đó không kiểm tra hành vi độc hại được nhúng trực tiếp trong các hàm JavaScript chính của gói. Các tổ chức nên xác định xem các tên hoặc phiên bản gói bị ảnh hưởng có hiện diện trong cây mã nguồn, tệp khóa, ảnh xây dựng, máy trạm của nhà phát triển và hệ thống tích hợp liên tục hay không.
Các nhóm nên loại bỏ chúng, xoay vòng các bí mật có khả năng bị lộ và kiểm tra nhật ký cho các chỉ báo được liệt kê bên dưới. Việc xem xét dependency nên bao gồm quyền sở hữu, lịch sử phát hành, tính nhất quán của kho lưu trữ và mã được phân phối thông qua registry. Một báo cáo gần đây về sự thỏa hiệp gói npm phổ biến cũng cho thấy cách các dependency đáng tin cậy có thể trở thành một con đường trực tiếp vào môi trường phát triển và CI.
Để có phạm vi bảo hiểm mạnh mẽ hơn, các nhóm nên chạy các gói đáng ngờ trong môi trường cô lập và giám sát các tiến trình con, các thay đổi hệ thống tệp, các lệnh gọi mạng và hành vi sau khi các phương thức phổ biến được gọi. Điều này có thể tiết lộ các đường dẫn thời gian chạy độc hại mà các bản quét tĩnh bỏ qua. Các nhà phát triển nên ghim các phiên bản dependency đã được xem xét, cập nhật hóa đơn nguyên vật liệu phần mềm và thực thi phê duyệt cho các gói mới hoặc đã thay đổi đột ngột.
Mô hình rộng lớn hơn đã bao gồm các làn sóng gói npm bị backdoor và lạm dụng cấu hình ràng buộc, củng cố sự cần thiết phải theo dõi việc cài đặt và thực thi. Đối với các nhà ứng phó, ưu tiên là xác định xem thư viện có chỉ đơn thuần được tải xuống hay thực sự được sử dụng trong một quy trình đang chạy hay không. Bằng chứng thời gian chạy, hồ sơ tiến trình và dữ liệu đo từ xa mạng có thể cung cấp câu trả lời rõ ràng nhất khi chiến dịch vẫn còn hoạt động.
Các chỉ báo về sự thỏa hiệp (IoCs) bao gồm các địa chỉ IP và tên miền sau (được làm mất hiệu lực để tránh phân giải hoặc siêu liên kết ngẫu nhiên):
- [.]ph-x.com
- [.]ph-x[.]org
- 104[.]193[.]68[.]252
- 144[.]202[.]102[.]190
- 192[.]64[.]124[.]46
- 37[.]120[.]235[.]121
- 45[.]76[.]225[.]31
- 45[.]139[.]78[.]4
- 45[.]239[.]122[.]74
- 50[.]169[.]124[.]43
- 50[.]169[.]131[.]228
- 50[.]169[.]131[.]255
- 50[.]169[.]132[.]4
- 50[.]169[.]132[.]255
- 50[.]169[.]133[.]200
- 50[.]169[.]133[.]255
- 64[.]227[.]102[.]43
- 64[.]227[.]117[.]70
- 64[.]227[.]124[.]70
- 64[.]227[.]125[.]25
- 64[.]227[.]125[.]93
- 66[.]240[.]202[.]125
- 66[.]240[.]205[.]231
- 66[.]240[.]206[.]12
- 66[.]240[.]206[.]244
- 66[.]240[.]207[.]137
- 66[.]240[.]207[.]149
- 66[.]240[.]210[.]231
- 66[.]240[.]212[.]4
- 66[.]240[.]212[.]100
- 66[.]240[.]213[.]157
- 66[.]240[.]213[.]169
- 66[.]240[.]214[.]148
- 66[.]240[.]214[.]244
- 66[.]240[.]215[.]100
- 66[.]240[.]215[.]124
- 66[.]240[.]216[.]236
- 66[.]240[.]217[.]156
- 66[.]240[.]218[.]68
- 66[.]240[.]219[.]156
- 66[.]240[.]220[.]4
- 66[.]240[.]220[.]68
- 66[.]240[.]220[.]93
- 66[.]240[.]221[.]148
- 66[.]240[.]222[.]100
- 66[.]240[.]223[.]4
- 66[.]240[.]223[.]100
- 66[.]240[.]223[.]148
- 66[.]240[.]223[.]255
- 66[.]240[.]224[.]12
- 66[.]240[.]224[.]93
- 66[.]240[.]225[.]156
- 66[.]240[.]226[.]100
- 66[.]240[.]226[.]236
- 66[.]240[.]227[.]156
- 66[.]240[.]228[.]4
- 66[.]240[.]228[.]244
- 66[.]240[.]229[.]68
- 66[.]240[.]230[.]236
- 66[.]240[.]230[.]255
- 66[.]240[.]231[.]244
- 66[.]240[.]232[.]100
- 66[.]240[.]232[.]12
- 66[.]240[.]233[.]156
- 66[.]240[.]234[.]148
- 66[.]240[.]234[.]244
- 66[.]240[.]235[.]236
- 66[.]240[.]235[.]255
- 66[.]240[.]236[.]148
- 66[.]240[.]237[.]4
- 66[.]240[.]237[.]100
- 66[.]240[.]237[.]148
- 66[.]240[.]237[.]255
- 66[.]240[.]238[.]12
- 66[.]240[.]238[.]148
- 66[.]240[.]238[.]244
- 66[.]240[.]239[.]156
- 66[.]240[.]240[.]100
- 66[.]240[.]240[.]236
- 66[.]240[.]241[.]156
- 66[.]240[.]242[.]4
- 66[.]240[.]242[.]148
- 66[.]240[.]242[.]255
- 66[.]240[.]243[.]12
- 66[.]240[.]243[.]100
- 66[.]240[.]244[.]236
- 66[.]240[.]244[.]255
- 66[.]240[.]245[.]148
- 66[.]240[.]246[.]4
- 66[.]240[.]246[.]100
- 66[.]240[.]246[.]148
- 66[.]240[.]246[.]255
- 66[.]240[.]247[.]12
- 66[.]240[.]247[.]148
- 66[.]240[.]247[.]244
- 66[.]240[.]248[.]156
- 66[.]240[.]249[.]100
- 66[.]240[.]249[.]236
- 66[.]240[.]250[.]156
- 66[.]240[.]251[.]4
- 66[.]240[.]251[.]148
- 66[.]240[.]251[.]255
- 66[.]240[.]252[.]12
- 66[.]240[.]252[.]100
- 66[.]240[.]253[.]236
- 66[.]240[.]253[.]255
- 66[.]240[.]254[.]148
- 66[.]240[.]255[.]4
- 66[.]240[.]255[.]100
- 66[.]240[.]255[.]148
- 66[.]240[.]255[.]255
- 78[.]46[.]91[.]188
- 83[.]169[.]183[.]14
- 83[.]169[.]191[.]244
- 83[.]169[.]196[.]148
- 91[.]107[.]231[.]124
- 91[.]107[.]232[.]156
- 91[.]107[.]233[.]100
- 91[.]107[.]233[.]236
- 91[.]107[.]234[.]156
- 91[.]107[.]235[.]4
- 91[.]107[.]235[.]148
- 91[.]107[.]235[.]255
- 91[.]107[.]236[.]12
- 91[.]107[.]236[.]100
- 91[.]107[.]237[.]236
- 91[.]107[.]237[.]255
- 91[.]107[.]238[.]148
- 91[.]107[.]239[.]4
- 91[.]107[.]239[.]100
- 91[.]107[.]239[.]148
- 91[.]107[.]239[.]255
- 91[.]107[.]240[.]12
- 91[.]107[.]240[.]148
- 91[.]107[.]240[.]244
- 91[.]107[.]241[.]156
- 91[.]107[.]242[.]100
- 91[.]107[.]242[.]236
- 91[.]107[.]243[.]156
- 91[.]107[.]244[.]4
- 91[.]107[.]244[.]148
- 91[.]107[.]244[.]255
- 91[.]107[.]245[.]12
- 91[.]107[.]245[.]100
- 91[.]107[.]246[.]236
- 91[.]107[.]246[.]255
- 91[.]107[.]247[.]148
- 91[.]107[.]248[.]4
- 91[.]107[.]248[.]100
- 91[.]107[.]248[.]148
- 91[.]107[.]248[.]255
- 91[.]107[.]249[.]12
- 91[.]107[.]249[.]148
- 91[.]107[.]249[.]244
- 91[.]107[.]250[.]156
- 91[.]107[.]251[.]100
- 91[.]107[.]251[.]236
- 91[.]107[.]252[.]156
- 91[.]107[.]253[.]4
- 91[.]107[.]253[.]148
- 91[.]107[.]253[.]255
- 91[.]107[.]254[.]12
- 91[.]107[.]254[.]100
- 91[.]107[.]255[.]236
- 91[.]107[.]255[.]255
- xmr.crypto-pool.fr
- xmr.mine.crypto-pool.fr
Lưu ý: Địa chỉ IP và tên miền được làm mất hiệu lực có chủ đích (ví dụ: [.]) để ngăn chặn việc phân giải hoặc siêu liên kết ngẫu nhiên. Chỉ làm lại hiệu lực trong các nền tảng tình báo mối đe dọa được kiểm soát như MISP, VirusTotal hoặc SIEM của bạn.
Để có phạm vi bảo hiểm mạnh mẽ hơn, các nhóm nên chạy các gói đáng ngờ trong môi trường cô lập và giám sát các tiến trình con, các thay đổi hệ thống tệp, các lệnh gọi mạng và hành vi sau khi các phương thức phổ biến được gọi. Điều này có thể tiết lộ các đường dẫn thời gian chạy độc hại mà các bản quét tĩnh bỏ qua.
Các nhà phát triển nên ghim các phiên bản dependency đã được xem xét, cập nhật hóa đơn nguyên vật liệu phần mềm và thực thi phê duyệt cho các gói mới hoặc đã thay đổi đột ngột.
Mô hình rộng lớn hơn đã bao gồm các làn sóng gói npm bị backdoor và lạm dụng cấu hình ràng buộc, củng cố sự cần thiết phải theo dõi việc cài đặt và thực thi.
Đối với các nhà ứng phó, ưu tiên là xác định xem thư viện có chỉ đơn thuần được tải xuống hay thực sự được sử dụng trong một quy trình đang chạy hay không. Bằng chứng thời gian chạy, hồ sơ tiến trình và dữ liệu đo từ xa mạng có thể cung cấp câu trả lời rõ ràng nhất khi chiến dịch vẫn còn hoạt động.










