Chuỗi cung ứng phần mềm: vì sao một gói nhỏ làm sập cả hệ thống
Ảnh: tl;dr sec

Chuỗi cung ứng phần mềm: vì sao một gói nhỏ làm sập cả hệ thống

Cài một dự án web mới, đếm số gói tải về: thường vượt một nghìn. Bạn đọc mã bao nhiêu? Vì sao một gói nhỏ ở tầng sâu làm sập cả hệ thống, và cách phòng thủ theo mức công sức.

Chạy lệnh cài đặt cho một dự án web mới rồi đếm số gói được tải về: con số thường vượt một nghìn. Bây giờ hãy tự hỏi một câu thật thà — bạn đã đọc mã của bao nhiêu gói trong số đó? Với hầu hết mọi người, câu trả lời là gần bằng không. Và chính khoảng cách giữa "một nghìn gói đang chạy trong sản phẩm của tôi" với "không gói nào tôi thật sự đọc" là toàn bộ vấn đề của an ninh chuỗi cung ứng phần mềm.

Vì sao một gói nhỏ có thể làm sập cả hệ thống

Bạn chủ động cài khoảng chục gói, nhưng chúng kéo theo hàng trăm, rồi hàng nghìn ở các tầng sâu hơn mà gần như không ai đọc.
Bạn chủ động cài khoảng chục gói, nhưng chúng kéo theo hàng trăm, rồi hàng nghìn ở các tầng sâu hơn mà gần như không ai đọc.

Thứ bạn chủ động cài chỉ là phần nổi của tảng băng — thường chỉ khoảng một chục gói. Nhưng mỗi gói đó lại phụ thuộc vào hàng chục gói khác, và những gói ấy lại kéo theo nữa, tầng này chồng tầng kia. Một dự án tưởng chừng dùng mười thư viện thực chất đang chạy hơn một nghìn, và phần lớn chúng nằm ở những tầng sâu mà bạn thậm chí không biết tên. Kẻ tấn công hiểu rõ cấu trúc này và khai thác đúng nó: chèn mã độc vào một gói nhỏ vô danh nằm dưới ba tầng phụ thuộc còn hiệu quả hơn tấn công thẳng vào thứ bạn cài, đơn giản vì không ai nhìn xuống tới đó. Ánh mắt của con người dừng lại ở tầng trên; mối nguy sống ở tầng dưới.

Ba kiểu tấn công thường gặp

Chiếm tài khoản tác giả, nhầm tên gói, và nuôi lòng tin lâu rồi phản — kiểu thứ ba tinh vi và nguy hiểm nhất.
Chiếm tài khoản tác giả, nhầm tên gói, và nuôi lòng tin lâu rồi phản — kiểu thứ ba tinh vi và nguy hiểm nhất.

Chiếm tài khoản tác giả. Kẻ tấn công lấy được quyền phát hành của một gói phổ biến — qua mật khẩu rò rỉ hay lừa đảo — rồi đẩy lên một phiên bản có mã độc. Người dùng nâng cấp như thường lệ, tin rằng bản mới an toàn như bản cũ, và dính bẫy mà không làm gì sai.

Nhầm tên gói. Kẻ tấn công đăng ký một cái tên gần giống một gói nổi tiếng — sai một chữ, thiếu một dấu gạch — rồi ngồi chờ ai đó gõ sai. Đây là kiểu tấn công rẻ tiền nhưng bắt được vô số nạn nhân nhờ tính vô ý của việc gõ tên gói.

Nuôi lâu rồi phản. Kiểu tinh vi và đáng sợ nhất. Kẻ tấn công đóng góp tử tế cho một dự án suốt nhiều tháng, sửa lỗi thật, được cộng đồng tin tưởng, rồi được trao quyền bảo trì — và sau đó mới lặng lẽ cài một cửa hậu. Kiểu này nguy hiểm hơn hai kiểu trước vì mã độc được đưa vào từ từ và thường ẩn trong tệp dựng hoặc dữ liệu kiểm thử — những nơi ít ai soi — chứ không nằm trong mã nguồn chính dễ đọc. Khi bị phát hiện, nó đã chạy trong hàng nghìn hệ thống từ lâu.

Phòng thủ theo mức công sức

Rẻ và nên làm ngay: khoá phiên bản chính xác bằng một tệp lock và cam kết nó vào kho, để mọi máy dựng ra đúng cùng một tập gói chứ không âm thầm nhận bản mới; bật quét lỗ hổng tự động; và không cho phép script cài đặt của gói chạy tuỳ tiện với toàn quyền — nhiều cuộc tấn công thực thi ngay trong bước cài, trước cả khi mã của bạn chạy.

Trung bình: giữ một kho trung gian trong nội bộ thay vì để mỗi máy tải thẳng từ Internet — vừa kiểm soát được vừa không sập khi kho công cộng có sự cố. Và đặt một độ trễ vài ngày trước khi nhận bản mới, vì phần lớn gói độc bị cộng đồng phát hiện và gỡ trong 48 giờ đầu; chỉ cần không phải là người dùng đầu tiên, bạn đã tránh được đa số.

Đắt nhưng đáng cho hệ thống quan trọng: dựng lại được từ mã nguồn và đối chiếu để chắc gói bạn nhận đúng là thứ được công bố, kiểm tra chữ ký, và quan trọng nhất — giảm hẳn số phụ thuộc. Mỗi thư viện bỏ đi được là một cửa vào ít hơn.

Có một câu hỏi đơn giản đáng hỏi mỗi lần định thêm một thư viện mới, và nó cắt qua mọi phân tích phức tạp: nếu tác giả của gói này trở nên thù địch vào ngày mai, hệ thống của tôi mất gì? Nếu câu trả lời là "rất nhiều", thì gói đó xứng đáng được soi kỹ hơn nhiều so với một dòng lệnh cài đặt vô tư.

Chia sẻ

Thảo luận