Tấn công chuỗi cung ứng và bản dựng tất định

·7 phút đọc·Bởi SSP Editorial Team
Ảnh bìa với biểu tượng ví, chìa khóa, khiên và chip bên cạnh tiêu đề Tấn công chuỗi cung ứng và bản dựng tất định

Phần lớn lời khuyên bảo mật cho người dùng crypto tập trung vào những bề mặt bạn nhìn thấy: cụm từ khôi phục của bạn, các liên kết bạn bấm vào, những trang bạn đăng nhập. Những điều đó quan trọng. Nhưng bên dưới tất cả còn có một rủi ro thầm lặng hơn — chính phần mềm, và mọi thứ tạo nên nó. Một chiếc ví có thể được viết hoàn hảo mà vẫn phát hành kèm một cửa hậu, bởi các ứng dụng hiện đại được lắp ráp từ hàng trăm khối dựng của bên thứ ba và từ một quy trình dựng biến mã nguồn thành tệp nhị phân bạn cài đặt. Hãy xâm phạm bất kỳ mắt xích nào trong chuỗi đó, bạn xâm phạm mọi người dùng ở hạ nguồn.

Đây chính là chuỗi cung ứng phần mềm, và kẻ tấn công đã học được rằng nó là một trong những mục tiêu có đòn bẩy cao nhất trong crypto. Bài viết này giải thích tấn công chuỗi cung ứng thực sự là gì, vì sao ví lại là mục tiêu hấp dẫn đến vậy, những biện pháp phòng thủ trụ vững trong thực tế, và bản dựng tất định mang lại điều gì cho bạn — bao gồm cách SSP áp dụng tất cả những điều này.

Tấn công chuỗi cung ứng là gì

Một cuộc tấn công chuỗi cung ứng không xâm nhập trực tiếp vào ứng dụng. Thay vào đó, nó xâm phạm thứ mà ứng dụng tin cậy: một phụ thuộc mà nó kéo về, tài khoản của một người bảo trì, hoặc quy trình dựng lắp ráp sản phẩm cuối. Mã độc len vào qua một bản cập nhật hợp lệ, được ký và phân phối qua các kênh thông thường, nên trông y hệt phần mềm bạn định cài.

Sự gián tiếp đó chính là toàn bộ vấn đề. Tấn công một thư viện được dùng rộng rãi — hay một máy chủ dựng — có thể chạm tới hàng nghìn dự án hạ nguồn và hàng triệu người dùng cùng lúc. Với một chiếc ví crypto, phần thưởng là trực tiếp: mã chạy bên trong ví của bạn đã có quyền truy cập vào khoảnh khắc quan trọng, khi một giao dịch được ký và các địa chỉ được hiển thị. Một phụ thuộc bị can thiệp có thể tráo địa chỉ nhận hoặc tuồn ra chất liệu khóa mà chẳng cần chạm tới bạn qua lừa đảo hay vệ sinh cụm từ khôi phục yếu kém. Đó là lý do loại tấn công này xứng đáng có một chỗ trong mô hình tư duy của bạn.

Hai vụ chạm rất gần

Hai sự cố có thật cho thấy điều này diễn ra thế nào — một nhắm thẳng vào crypto, một suýt giáng vào toàn bộ internet.

event-stream và ví Copay

Năm 2018, một gói npm phổ biến tên event-stream được trao lại cho một người bảo trì tình nguyện mới ngỏ lời giúp đỡ. Đó là một cuộc chuyển giao thường lệ, trông đầy thiện chí, thuộc loại liên tục xảy ra trong mã nguồn mở. Người bảo trì mới sau đó thêm một phụ thuộc mới, flatmap-stream, chứa mã độc đã bị làm rối.

Tải trọng nhắm mục tiêu một cách khác thường. Thay vì kích hoạt cho mọi người, nó chỉ hoạt động bên trong một dự án hạ nguồn cụ thể: ví Bitcoin Copay. Ở đó, nó được chế tạo để đánh cắp chất liệu cụm từ khôi phục và tiền của người dùng ứng dụng ấy. Phần lớn lập trình viên đã kéo event-stream về chưa bao giờ bị ảnh hưởng — mã biết chính xác nó đang tìm nạn nhân nào.

Đây là lời nhắc kinh điển rằng "tôi chỉ cài một thư viện nhỏ" không bao giờ là toàn bộ câu chuyện. Bạn cũng đã cài luôn mọi thứ mà thư viện đó tin cậy.

Cửa hậu XZ Utils

Sự cố XZ Utils năm 2024 (CVE-2024-3094) còn kiên nhẫn hơn nữa. XZ Utils là một thư viện nén hiện diện lặng lẽ trên hầu hết các hệ thống Linux. Trong nhiều năm, một kẻ tấn công đã gây dựng lòng tin với tư cách người đóng góp hữu ích, dần dần giành lấy trách nhiệm bảo trì, rồi cài vào một cửa hậu được thiết kế để can thiệp vào OpenSSH — phần mềm bảo vệ việc đăng nhập từ xa vào các máy chủ ở khắp nơi.

Nó bị phát hiện gần như tình cờ, nhờ một kỹ sư nhận ra độ trễ chỉ bằng một phần nhỏ của giây. Nếu được phát hành rộng rãi, nó có thể đã trao quyền truy cập từ xa cho vô số máy.

Bài học cho crypto thật tỉnh táo: cuộc tấn công không khai thác một lỗi tinh vi, nó khai thác chính mô hình tin cậy của mã nguồn mở, chơi một ván kỹ thuật xã hội kéo dài nhiều năm để trở thành người mà mọi người dựa vào.

Những phòng thủ thực sự hiệu quả

Không một biện pháp đơn lẻ nào chặn được tấn công chuỗi cung ứng. Cái hiệu quả là một chồng biện pháp, mỗi lớp thu hẹp lựa chọn của kẻ tấn công:

  • Phụ thuộc được ghim và tệp khóa. Ghim đúng phiên bản và đưa tệp khóa vào quản lý phiên bản nghĩa là một bản dựng không thể âm thầm kéo về một bản phát hành mới hơn, đã bị can thiệp. Các cập nhật trở thành sự kiện có chủ đích, có thể rà soát, thay vì tự động.
  • Phụ thuộc tối thiểu. Mỗi gói bạn thêm vào là một bên mà bạn tin cậy. Ít phụ thuộc hơn nghĩa là bề mặt tấn công nhỏ hơn và ít người bảo trì có thể bị xâm phạm hơn.
  • Cô lập phụ thuộc trong hộp cát. Những công cụ như LavaMoat giới hạn mỗi gói có thể làm gì lúc chạy, nên một phụ thuộc bị xâm phạm không thể tự do chạm tới mạng hay các API nhạy cảm.
  • Ký mã. Các bản phát hành đã ký cho phép người dùng xác minh rằng một tệp nhị phân đến từ nhà phát hành thật và không bị thay đổi trên đường truyền.
  • Kiểm toán bên thứ ba. Các công ty bảo mật độc lập rà soát mã và phụ thuộc bằng con mắt đối kháng, bắt được những gì đội nội bộ xem là bình thường.
  • Bản dựng tái lập được, tất định. Phòng thủ cấu trúc mạnh nhất, và là điều đáng hiểu cặn kẽ.

Bản dựng tất định, giải thích

Thông thường, dựng cùng một mã nguồn hai lần có thể cho ra hai tệp nhị phân hơi khác nhau — dấu thời gian, thứ tự tệp và chi tiết của máy dựng len lỏi vào. Sự biến thiên đó là một vấn đề, vì nó nghĩa là bạn không thể phân biệt một khác biệt vô hại với một khác biệt độc hại.

Một bản dựng tất định (hay tái lập được) loại bỏ sự biến thiên đó. Với cùng một mã nguồn, bất kỳ ai, ở bất kỳ đâu, trên bất kỳ máy nào, đều tạo ra một sản phẩm giống hệt nhau đến từng byte. Hệ quả rất mạnh mẽ: những người độc lập có thể dựng lại ví từ mã nguồn công khai của nó và xác nhận rằng tệp nhị phân bạn tải về khớp, từng bit một, với những gì mã nguồn tạo ra. Nếu kẻ tấn công đã can thiệp vào quy trình dựng hoặc nhét gì đó vào sau đó, các giá trị băm sẽ không khớp và sự can thiệp lập tức hiện ra.

Điều này lật ngược mô hình tin cậy. Bạn không còn phải tin lời nhà phát hành; việc xác minh trở thành điều mà cả cộng đồng có thể thực hiện và đối chiếu chéo. Dự án Reproducible Builds ghi chép thực hành này khắp hệ sinh thái, và các khung như SLSA định nghĩa các mức bảo đảm toàn vẹn bản dựng mà bạn có thể đòi hỏi ở một dự án.

SSP áp dụng điều này thế nào

SSP coi quy trình dựng là một phần trong mô hình mối đe dọa của mình, chứ không phải chuyện nghĩ tới sau. Ví được phát hành với một bản dựng tất định ưu tiên Dockerfile: cùng một môi trường do Docker định nghĩa tạo ra cùng một sản phẩm mỗi lần, nên một bản phát hành đã công bố có thể được dựng lại từ mã nguồn công khai và đối chiếu, từng bit một, với những gì bạn tải về. SSP cũng đã trải qua các đợt rà soát bảo mật độc lập bởi Halborn, với những cuộc kiểm toán xem xét cả mã lẫn các phụ thuộc mà nó dựa vào.

Còn một lớp nữa, đặc thù cho cách SSP được xây dựng, và ở đây nó quan trọng. SSP là một ví đa chữ ký 2-of-2: mỗi giao dịch đòi hỏi một phê duyệt độc lập từ một khóa thứ hai, SSP Key, trên một thiết bị riêng. Hãy chính xác về điều nó làm và không làm. Bản dựng tất định và kiểm toán giảm khả năng một bản dựng bị can thiệp được phát hành ngay từ đầu; chúng là tuyến đầu. Nhưng ngay cả trong trường hợp xấu nhất — một bản dựng bằng cách nào đó lọt qua — khóa thứ hai vẫn là một bề mặt phê duyệt riêng biệt, vẫn phải ký duyệt cho mọi giao dịch.

Nó không phải một tấm khiên thần kỳ, và không khiến một bản dựng bị xâm phạm trở nên chấp nhận được. Nó chỉ đơn giản nghĩa là một thành phần bị can thiệp đơn lẻ trên một thiết bị, tự nó, không thể chuyển tiền của bạn. Phòng thủ theo chiều sâu mới là điểm mấu chốt.

Những gì bạn có thể tự kiểm tra

Bạn không cần phải là kỹ sư bảo mật để hưởng lợi từ tất cả những điều này. Vài thói quen sẽ đi được rất xa:

  • Chỉ tải về từ nguồn chính thức. Hãy lấy ví từ trang chính thức hoặc trang niêm yết trên cửa hàng của nó, không bao giờ từ một liên kết trong tin nhắn hay một quảng cáo tìm kiếm. Đây là cùng một kỷ luật được đề cập trong vệ sinh tiện ích mở rộng trình duyệt.
  • Ưu tiên những dự án công bố bản dựng tất định và kiểm toán. Một dự án để cộng đồng xác minh các bản phát hành của mình — và trả tiền cho rà soát độc lập — đang nói cho bạn biết điều gì đó về cách nó tư duy.
  • Xác minh chữ ký và giá trị băm khi chúng được cung cấp. Nếu một bản phát hành kèm chữ ký hoặc tổng kiểm tra, hãy dành một phút để đối chiếu. Bản dựng tái lập được chỉ bảo vệ bạn nếu có ai đó thực sự làm việc so sánh.
  • Giữ opsec tổng thể của bạn chặt chẽ. Phòng thủ chuỗi cung ứng nằm trong một bức tranh lớn hơn; hãy rà lại danh sách opsec của bạn thường xuyên để không lớp nào phải gánh toàn bộ sức nặng.

Không điều nào trong số này đòi hỏi tin cậy vào một bên duy nhất. Đó chính xác là đặc tính bạn muốn ở phần mềm tự lưu ký.

Tiếp tục tiến bước

Một chiếc ví chỉ đáng tin tới mức của chuỗi đã dựng nên nó. Tin tốt là đây là một trong số ít vấn đề bảo mật có câu trả lời gọn gàng, mang tính cấu trúc: bản dựng tất định cộng với kiểm toán độc lập biến "hãy tin chúng tôi" thành "tự bạn xác minh".

Hãy tiếp tục xây dựng phòng thủ với nhận thức về lừa đảo, thực hành tốt nhất về cụm từ khôi phục, vệ sinh tiện ích mở rộng trình duyệt, và một danh sách opsec định kỳ. Mỗi thứ đóng lại một cánh cửa; hợp lại, chúng mới là dáng vẻ thật sự của bảo mật tự lưu ký.

Chia sẻ bài viết này

Bài viết liên quan