Loading
Bảo mật chuỗi cung ứng phần mềm đề cập đến việc bảo vệ toàn bộ quy trình phát triển, phân phối và triển khai phần mềm khỏi các hành vi xâm nhập hoặc sửa đổi trái phép. Thay vì tấn công trực tiếp vào sản phẩm cuối, kẻ tấn công có thể nhắm vào các thành phần trung gian – như thư viện mã nguồn mở, công cụ build, hoặc tài khoản của nhà phát triển – để chèn mã độc. Những cuộc tấn công kiểu này ngày càng gia tăng về quy mô và mức độ nghiêm trọng; theo dự báo của Gartner, 45% tổ chức toàn cầu có thể sẽ trải qua một cuộc tấn công chuỗi cung ứng phần mềm trước năm 2025, gấp ba lần so với năm 2021 [1]. Một ví dụ điển hình là vụ SolarWinds 2020, khi mã độc được cài vào bản cập nhật phần mềm quản trị mạng, lây nhiễm hàng chục nghìn khách hàng trên toàn cầu [2]. Mặc dù phần mềm nguồn mở thường được xem là an toàn hơn (do có nhiều người cùng xem xét mã), thực tế nhiều dự án nguồn mở thiếu nguồn lực để rà soát bảo mật một cách đầy đủ [2]. Điều này tạo kẽ hở cho kẻ xấu lợi dụng, biến các thành phần đáng tin cậy trong chuỗi cung ứng phần mềm thành “mắt xích yếu” để tấn công vào hệ thống của người dùng cuối.
XZ Utils là bộ công cụ nén/giải nén định dạng .xz (dựa trên thuật toán LZMA) và thư viện liblzma của nó được tích hợp sẵn trong hầu hết các bản phân phối Linux [4]. Tháng 2/2024, một đoạn mã backdoor độc hại đã bị cài cắm vào mã nguồn XZ Utils (cụ thể là trong thư viện liblzma phiên bản 5.6.0 và 5.6.1) bởi một tài khoản maintainer có tên “Jia Tan” [5]. Lỗ hổng này nhanh chóng được gán mã CVE-2024-3094 với điểm CVSS 10.0 tối đa, cho thấy mức độ nghiêm trọng tuyệt đối. Backdoor cho phép kẻ tấn công sở hữu một khóa Ed448 chuyên biệt có thể thực thi mã từ xa (RCE) thông qua dịch vụ OpenSSH trên hệ thống Linux bị ảnh hưởng [5]. Nói cách khác, nếu backdoor hoạt động, kẻ tấn công sẽ có “cửa hậu” đăng nhập SSH vào máy nạn nhân mà không cần mật khẩu.
Nguồn gốc & cơ chế tấn công: Cuộc điều tra sau đó hé lộ rằng vụ cài cắm backdoor này là đỉnh điểm của chiến dịch kéo dài gần 3 năm (11/2021 – 2/2024) của một đối tượng mang danh Jia Tan/JiaT75 [5]. Đối tượng này đã tham gia đóng góp mã cho dự án XZ từ cuối 2021, cần mẫn gửi các pull request sửa lỗi và cải tiến nhỏ để xây dựng uy tín. Bằng cách đó, y dần được trao quyền commit và cuối cùng là quyền tạo bản phát hành (release) cho XZ Utils [4]. Thậm chí, có dấu hiệu cho thấy JiaT75 đã sử dụng nhiều tài khoản giả (sockpuppet) để tạo áp lực công việc lên maintainer chính, buộc người này phải thêm mình làm đồng maintainer để chia sẻ gánh nặng [5]. Sau khi nắm quyền, Jia Tan đã ký phát hành phiên bản 5.6.0 (và sau đó 5.6.1) – đây chính là các phiên bản chứa backdoor được cài cắm một cách tinh vi [5].
Hình 1: Infographic tóm tắt cách kẻ tấn công “JiaT75” thâm nhập dự án XZ Utils và cơ chế nhiều tầng của backdoor CVE-2024-3094. Mã độc được chia nhỏ và ẩn bên trong các tệp kiểm thử nén cùng một tập lệnh M4 độc hại, nhằm vượt qua khâu rà soát mã nguồn. Khi build trên hệ thống Linux x86-64 (với GCC và glibc), tập lệnh này tự động giải nén payload ẩn và chèn một đoạn mã độc vào thư viện liblzma trong quá trình biên dịch [5]. Toàn bộ chuỗi cài cắm được thiết kế nhiều giai đoạn, kích hoạt có điều kiện để giảm thiểu khả năng bị phát hiện sớm.
Backdoor trong XZ Utils có cơ chế hoạt động phức tạp và đa tầng. Thoạt tiên, mã độc “ngủ đông” và không làm gì bất thường cho đến khi hội đủ điều kiện cần thiết. Cụ thể, payload lợi dụng một cơ chế của glibc gọi là IFUNC (Indirect Functions) để chiếm quyền điều khiển việc resolve hàm trong quá trình nạp thư viện [5]. Khi máy nạn nhân chạy bản OpenSSH có tích hợp thư viện systemd (một bản vá phổ biến trong các distro khiến sshd nạp libsystemd và kéo theo liblzma) [5], backdoor sẽ thay thế hàm RSA_public_decrypt của OpenSSH bằng phiên bản độc hại của mình [5]. Kết quả là quá trình xác thực khóa SSH bị chèn thêm “cửa sau”: nếu kẻ tấn công kết nối tới dịch vụ SSH bằng một chứng chỉ SSH đặc biệt (được ký bởi khóa Ed448 bí mật mà chỉ kẻ tấn công có), backdoor sẽ nhận diện và cho phép thực thi payload do kẻ tấn công gửi lên, ngay trước bước xác thực [6]. Ngược lại, nếu kết nối SSH bình thường (không mang dấu hiệu của kẻ tấn công), liblzma vẫn hoạt động như bình thường và không để lộ dấu vết gì. Chính cơ chế “kích hoạt có điều kiện” này khiến việc phát hiện backdoor trở nên khó khăn – mã độc chỉ kích hoạt cho đúng kẻ tấn công và lặng lẽ ẩn mình với mọi người khác [2].
Quá trình khai thác và phát hiện: Để lợi dụng backdoor này, kẻ tấn công cần có cặp khóa Ed448 phù hợp. Kẻ tấn công sẽ tạo một chứng chỉ SSH độc hại sử dụng khóa Ed448 của mình làm Certificate Authority (CA) và nhúng payload (lệnh tùy ý) vào một trường của chứng chỉ đó [2]. Khi kẻ tấn công cố gắng đăng nhập SSH vào máy nạn nhân (máy có cài liblzma 5.6.0/5.6.1) bằng chứng chỉ đặc biệt nói trên, backdoor trong liblzma sẽ kiểm tra khóa CA của chứng chỉ. Nếu khóa CA khớp với khóa của kẻ tấn công, backdoor sẽ giải mã payload ẩn trong chứng chỉ và gọi thực thi lệnh đó với quyền root trên máy nạn nhân [2]. Toàn bộ quá trình xảy ra trước khi bước xác thực SSH thông thường diễn ra, nghĩa là kẻ tấn công chiếm quyền điều khiển máy mà không cần thông tin đăng nhập hợp lệ. Ngược lại, nếu chứng chỉ không mang dấu hiệu “hợp lệ” của kẻ tấn công, backdoor sẽ trả quyền điều khiển lại cho quy trình SSH bình thường, khiến kết nối tuân theo cơ chế xác thực thông thường [2].
Rất may mắn, backdoor nguy hiểm này đã bị phát hiện trước khi kịp gây hậu quả trên diện rộng. Tháng 3/2024, kỹ sư Andres Freund (một nhân viên Microsoft và cũng là nhà phát triển PostgreSQL) khi điều tra lỗi hiệu năng trên Debian Sid đã nhận thấy hiện tượng bất thường: quá trình đăng nhập SSH tiêu tốn CPU bất thường và gây lỗi bộ nhớ trong công cụ Valgrind [5]. Điều này khiến anh nghi ngờ có vấn đề trong thư viện liblzma. Freund đã đào sâu và phát hiện mã độc ẩn trong XZ Utils, sau đó anh công bố phát hiện này trên danh sách thư điện tử bảo mật của Openwall (oss-security) vào ngày 29/3/2024 [5]. Ngay khi thông tin được công bố, cộng đồng mã nguồn mở cùng các nhà cung cấp Linux đã nhanh chóng vào cuộc.
Bảng 1. Dòng thời gian chính của sự cố XZ Utils CVE-2024-3094:
Thời điểm | Sự kiện chính |
2018–2021 | Khởi đầu dự án XZ Utils: Dự án do Lasse Collin sáng lập và duy trì. JiaT75 (Jia Tan) chưa tham gia. |
Cuối 2021 | JiaT75 tham gia: Tài khoản Jia Tan/JiaT75 bắt đầu đóng góp vào XZ Utils, gửi các bản vá nhỏ và cải tiến, dần tạo dựng uy tín[11][10]. |
2022–2023 | Xây dựng lòng tin: JiaT75 tiếp tục đóng góp thường xuyên. Có dấu hiệu dùng nhiều tài khoản giả để thúc ép maintainer chính do quá tải, nhằm được trao thêm quyền quản trị dự án[13]. |
07/2023 | Che giấu hành vi: Pull request từ JiaT75 nhằm vô hiệu hóa một số kiểm thử (fuzzing), có thể để tránh phát hiện lỗi bất thường do backdoor (nghi ngờ)[26]. |
16/02/2024 | Phát hành XZ 5.6.0: Jia Tan (với tư cách maintainer) ký release phiên bản 5.6.0, trong đó backdoor được cài cắm vào giai đoạn build (ẩn trong file nén kiểm thử và script M4 trong tarball)[16][27]. |
09/03/2024 | Phát hành XZ 5.6.1: Bản cập nhật nhỏ, được cho là chỉnh sửa một số hành vi bất thường có thể lộ ra khi test, nhằm tinh chỉnh backdoor hoạt động “êm” hơn[28]. |
27/03/2024 | Dấu hiệu bị phát hiện: Andres Freund quan sát thấy lỗi hiệu năng và lỗi bộ nhớ trên Debian Sid khi đăng nhập SSH, bắt đầu điều tra nguyên nhân[24]. |
29/03/2024 | Công bố lỗ hổng: Backdoor XZ Utils được Andres Freund xác nhận và thông báo trên oss-security. CVE-2024-3094 được gán, các nhà cung cấp Linux nhận cảnh báo[25]. Cùng ngày, maintainer XZ gỡ bỏ mã độc và phát hành lại phiên bản sạch (5.6.2 hoặc hồi quy về 5.4.x)[29][30]. |
30/03 – 04/2024 | Phản ứng cộng đồng: Nhiều bản phân phối Linux (Red Hat, Debian, Fedora, Alpine…) lập tức gỡ hoặc hạ cấp gói XZ về phiên bản an toàn[31][32]. Canonical hoãn phát hành Ubuntu 24.04 LTS Beta để rebuild toàn bộ hệ thống, đảm bảo sạch mã độc[33]. CISA (Mỹ) ra khuyến cáo an ninh, kêu gọi các hệ thống nhanh chóng quay về bản XZ không bị ảnh hưởng[34]. |
08/2025 | Dư âm sự cố: Nghiên cứu phát hiện một số image Docker (Debian) cũ trên Docker Hub vẫn còn chứa liblzma 5.6.x dính backdoor[35]. Dù đó chỉ là build phát triển, sự việc cho thấy dấu vết cuộc tấn công có thể còn tồn tại nếu người dùng không thận trọng cập nhật. |
Mức độ nguy hiểm: Giới chuyên gia nhận định sự cố XZ Utils có tiềm năng trở thành một trong những backdoor nghiêm trọng nhất lịch sử phần mềm nếu không được phát hiện kịp thời. Alex Stamos (cựu CSO Facebook) bình luận rằng, giả sử backdoor này lọt vào các bản phát hành ổn định, nó sẽ trao cho kẻ tấn công “chìa khóa vạn năng” để mở cửa hàng trăm triệu máy tính chạy SSH trên khắp thế giới [5]. Thật vậy, XZ Utils hiện diện mặc định trên hầu hết các hệ điều hành Linux; một khi bản XZ có backdoor được đưa vào distro và cập nhật cho người dùng, kẻ tấn công có thể truy cập từ xa gần như bất kỳ máy chủ Linux nào (bao gồm các máy chạy Fedora, Ubuntu, Debian…) chỉ trong nháy mắt [4]. So sánh với vụ SolarWinds (ảnh hưởng ~18.000 tổ chức), backdoor XZ còn có khả năng phủ rộng và âm thầm hơn nhiều, vì SSH là dịch vụ cốt lõi hiện diện ở mọi nơi.
May mắn, tác động thực tế của CVE-2024-3094 đã được kiểm soát ở mức tối thiểu nhờ phát hiện sớm. Vào thời điểm lộ diện, các phiên bản XZ 5.6.0/5.6.1 mới chỉ có trong các bản distro phát triển (dev/testing) chứ chưa kịp vào bản ổn định [5]. Nhờ quy trình phát hành thận trọng (đưa gói mới vào nhánh experimental trước khi vào stable), cộng đồng Linux đã “cách ly” được backdoor này trong phạm vi hẹp [7]. Thống kê cho thấy chỉ các nhánh Fedora Rawhide, Debian unstable/testing, Alpine Edge… bị ảnh hưởng; các phiên bản phát hành ổn định của đa số distro không tích hợp XZ độc hại [6]. Ngay sau khi nhận thông tin, các nhà cung cấp đã hành động quyết liệt: Red Hat, SUSE, Debian đồng loạt rút lại hoặc thay thế gói XZ bị lỗi bằng phiên bản cũ an toàn [5]; GitHub tạm khóa kho mã XZ để ngăn tải xuống bản có backdoor [5]. Canonical thậm chí trì hoãn lịch phát hành Ubuntu mới để biên dịch lại toàn bộ nhằm loại trừ rủi ro mã độc lan sang thành phần khác trong quá trình build [5]. Những động thái nhanh chóng này cho thấy sức mạnh của mô hình nguồn mở khi đối mặt sự cố: cộng đồng đã phát hiện, cảnh báo, và khắc phục lỗ hổng chỉ trong vài ngày, trước khi nó trở thành thảm họa an ninh diện rộng [7].
Tuy nhiên, vụ XZ Utils cũng dấy lên nhiều lo ngại và bài học quý giá. Thứ nhất, nó nhắc nhở rằng ngay cả các dự án lõi, được tin tưởng nhất cũng có thể bị tổn thương. Kẻ tấn công đã lợi dụng điểm yếu quy trình (quản lý quyền maintainer, phát hành tarball không khớp với nguồn git) để qua mặt hệ thống kiểm soát. Thứ hai, sự cố này đặt ra câu hỏi về mô hình duy trì phần mềm nguồn mở: liệu có bền vững không khi hạ tầng quan trọng của Internet lại phụ thuộc vào nỗ lực tình nguyện của vài cá nhân? [5]. Áp lực lên maintainer đơn lẻ có thể dẫn tới việc họ dễ mắc sai lầm hoặc bị thao túng, như trường hợp maintainer XZ bị sockpuppet gây sức ép. Cuối cùng, XZ backdoor cho thấy tầm quan trọng của việc giám sát hệ thống: chính các dấu hiệu bất thường ở thời gian chạy (runtime) đã phơi bày malware, gợi ý rằng tổ chức nên theo dõi những dị thường trong hành vi tiến trình (ví dụ: tiến trình sshd khởi chạy lệnh lạ) để phát hiện sớm các backdoor tương tự [4].
Sự cố XZ Utils là một hồi chuông cảnh tỉnh về rủi ro trong chuỗi cung ứng phần mềm. Để tăng cường bảo mật và phòng chống các cuộc tấn công tương tự, các tổ chức và cộng đồng phát triển có thể tham khảo một số giải pháp sau:
Tài liệu tham khảo: Các thông tin và phân tích trên được tổng hợp từ nhiều nguồn uy tín, bao gồm thông báo của các hãng bảo mật và các bài viết phân tích chuyên sâu về CVE-2024-3094 [4], [5], [7]. Sự cố XZ Utils backdoor tuy gây chấn động, nhưng phản ứng kịp thời của cộng đồng đã biến đây thành một case study quý giá. Nó nhắc nhở chúng ta rằng bảo mật chuỗi cung ứng phần mềm không chỉ là câu chuyện về công nghệ, mà còn về con người, quy trình và sự phối hợp trách nhiệm trong toàn bộ hệ sinh thái phát triển phần mềm. [7]
[1] https://blog.rad.security/blog/software-supply-chain-attacks-13-examples-of-cyber-security-threats
[2] https://www.cybereason.com/blog/threat-alert-the-xz-backdoor
[3] https://snyk.io/blog/npm-supply-chain-attack-via-open-source-maintainer-compromise/
[5] https://en.wikipedia.org/wiki/XZ_Utils_backdoor
[6] https://jfrog.com/blog/xz-backdoor-attack-cve-2024-3094-all-you-need-to-know/
[7] https://openssf.org/blog/2024/03/30/xz-backdoor-cve-2024-3094/
[8] https://harsim.ca/Unraveling-the-XZ-Backdoor-A-Close-Call-for-Open-Source-Security/