VietTechiesHIỂU CÔNG NGHỆ. MỞ GÓC NHÌN.
☰ Chuyên mục

Andres Freund thấy đăng nhập SSH thất bại mà vẫn ngốn CPU. Manh mối ấy dẫn anh tới cửa hậu xz

14/10/2026 · VietTechies · Biên tập

Những dãy tủ máy chủ dưới ánh sáng xanh lam mờ, bên cạnh một ô nền tối có đường biểu đồ mức dùng CPU màu hổ phách vọt lên thành ba đỉnh cao, cùng dòng chữ “The xz backdoor” và “Andres Freund · 2024”.


Đầu năm 2024, Andres Freund nhận thấy rằng trên các máy chạy Debian của anh, những lần đăng nhập thất bại qua SSH (Secure Shell, giao thức đăng nhập từ xa) lại tốn nhiều thời gian của bộ xử lý (CPU) hơn mức đáng có, và lần theo dấu vết ấy, anh tìm ra một cửa hậu (backdoor) giấu trong xz Utils, gói phần mềm nén mã nguồn mở được dùng rộng rãi.

Freund là lập trình viên phát triển hệ cơ sở dữ liệu PostgreSQL, làm việc tại Microsoft. Lúc ấy anh đang đo hiệu năng của những đoạn code nhỏ (micro-benchmark), và như sau này anh viết, anh “cần làm cho hệ thống yên ắng để giảm nhiễu”. Khi cỗ máy đã yên, một chi tiết lộ rõ: các tiến trình sshd — chương trình tiếp nhận những lượt đăng nhập SSH — “dùng nhiều CPU đến mức đáng ngạc nhiên, dù thất bại ngay lập tức vì sai tên người dùng, v.v.”

Anh dùng profiler (công cụ đo xem chương trình tốn thời gian ở đâu) để soi sshd. Một phần lớn thời gian CPU ấy rơi vào liblzma, thư viện nén nằm trong gói xz, và profiler không quy được khoảng thời gian đó cho bất kỳ hàm nào có tên. Freund bắt đầu sinh nghi. Anh còn nhớ ra “một cảnh báo lạ của valgrind” xuất hiện trong các lượt kiểm thử tự động của PostgreSQL vài tuần trước đó. Valgrind là công cụ bắt lỗi bộ nhớ trong các chương trình đang chạy.

Một lần đăng nhập bằng tên người dùng không tồn tại lẽ ra phải bị từ chối gần như ngay lập tức. Trong phép thử của Freund, một lần đăng nhập như thế mất 0,299 giây khi không có thư viện bị cài cửa hậu và 0,807 giây khi có thư viện ấy, tức lâu hơn khoảng nửa giây.

Ban đầu, Freund tưởng chỉ có gói xz của Debian bị xâm nhập. Ngày 28 tháng 3, anh báo cho Debian, rồi báo tiếp cho một danh sách thư kín, nơi các bản phân phối Linux phối hợp vá lỗi bảo mật. Hôm sau, anh viết trên danh sách thư công khai oss-security: “Kho mã gốc và các gói mã nguồn nén (tarball) của xz đều đã bị cài cửa hậu.”

Đằng sau câu ấy là một chiến dịch kéo dài hơn hai năm.

Hai năm kiên nhẫn

Kẻ tấn công dùng cái tên “Jia Tan”. Theo dòng thời gian do lập trình viên Russ Cox tổng hợp, Jia Tan gửi bản patch đầu tiên, vốn vô hại, lên danh sách thư của xz vào ngày 29 tháng 10 năm 2021. Tháng 4 năm 2022, một tài khoản tên “Jigar Kumar” bắt đầu phàn nàn trên danh sách thư rằng một bản patch của Jia Tan chưa được merge; sang tháng 5, một tài khoản khác tên “Dennis Ens” hỏi liệu một phần của dự án có còn được bảo trì hay không. Cox viết rằng “có vẻ nhiều khả năng đó là những tài khoản giả, được tạo ra để ép Lasse trao thêm quyền kiểm soát cho Jia”.

Lasse Collin, người bảo trì (maintainer) xz, gọi xz là “một dự án làm vì sở thích, không được trả công”. Ngày 8 tháng 6 năm 2022, Collin trả lời những lời phàn nàn: “Tôi chưa mất hứng thú, nhưng khả năng quan tâm của tôi khá hạn chế, phần lớn là do những vấn đề sức khỏe tâm thần kéo dài, ngoài ra còn do một vài chuyện khác.” Ba tuần sau, Collin viết rằng Jia Tan “gần như đã là người đồng bảo trì rồi”.

Tháng 3 năm 2023, Jia Tan đóng gói bản phát hành đầu tiên của mình: phiên bản 5.4.2. Tháng 1 năm 2024, Jia Tan thêm logo XZ vào tài liệu của dự án, kèm một dòng chân trang trên mọi trang, mở đầu bằng “XZ logo © 2023 by Jia Tan”. Ngày 23 tháng 2, kẻ tấn công merge các file kiểm thử nhị phân có giấu cửa hậu bên trong. Hôm sau, phiên bản 5.6.0 ra mắt; bản 5.6.1 tiếp nối vào ngày 9 tháng 3.

Giấu ở nơi người duyệt code ít khi nhìn tới

Cửa hậu được thiết kế để những phần nguy hiểm không nằm trong code mà người ta đọc. Phần mã độc (payload) nằm trong các file kiểm thử nhị phân, đội lốt dữ liệu thử nghiệm. Khâu kích hoạt mã độc nằm ở build-to-host.m4, một tập lệnh build đã bị chỉnh sửa. Tập lệnh này chỉ có trong các tarball phát hành — những gói mã nguồn nén để tải về, do Jia Tan chuẩn bị — chứ không có trong kho Git của dự án. Khi một bản phân phối đóng gói xz từ tarball như vậy, tập lệnh ấy lấy một đoạn mã biên dịch sẵn ra khỏi các file kiểm thử, rồi sửa các hàm bên trong liblzma.

Bản thân OpenSSH, dự án làm ra sshd, không dùng liblzma. Nhưng Debian và một số bản phân phối khác đã thêm một bản patch để OpenSSH gửi thông báo cho systemd, trình quản lý dịch vụ trên nhiều hệ thống Linux. Bản patch ấy liên kết thêm libsystemd, thư viện của systemd, và khi đó libsystemd lại phụ thuộc vào liblzma. Chuỗi phụ thuộc này đã đưa thư viện bị cài cửa hậu vào server SSH. Red Hat tóm tắt hậu quả: bản build độc hại “can thiệp vào quá trình xác thực trong sshd thông qua systemd”. Theo các nhà phân tích đã mổ xẻ mã độc, cửa hậu này cho phép bất kỳ ai nắm giữ khóa bí mật của kẻ tấn công chạy lệnh trên server bị ảnh hưởng mà không cần đăng nhập.

Bị phát hiện trước khi lọt vào bản ổn định

Các phiên bản có cửa hậu chủ yếu mới lọt vào các bản thử nghiệm và các bản phân phối cập nhật liên tục (rolling release): các nhánh testing, unstable và experimental của Debian, Fedora Rawhide và bản beta của Fedora 40, openSUSE Tumbleweed và Kali Linux. Debian cho biết chưa ghi nhận phiên bản ổn định nào bị ảnh hưởng, còn theo Red Hat, không phiên bản Red Hat Enterprise Linux nào bị ảnh hưởng.

Danh mục lỗ hổng công khai CVE ghi nhận cửa hậu này với mã CVE-2024-3094 và điểm mức độ nghiêm trọng 10,0, mức cao nhất. Ngày 29 tháng 3, Cơ quan An ninh mạng và An ninh Cơ sở hạ tầng Mỹ (CISA) khuyến cáo lập trình viên và người dùng hạ cấp xuống một phiên bản chưa bị xâm nhập, “chẳng hạn như XZ Utils 5.4.6 Stable”.

Hãng tin Reuters không xác định được ai đứng sau Jia Tan. Hãng tin này cho biết nhiều người từng xem xét các bản cập nhật của Jia Tan tin rằng cái tên này là bí danh của một hacker lão luyện hoặc một nhóm hacker, “nhiều khả năng đang làm việc cho một cơ quan tình báo hùng mạnh”.

Những điểm các bản kể lại phổ biến hiểu sai

Khi được kể lại, phát hiện này thường bị rút gọn thành một con số. Một tiêu đề tiếng Tây Ban Nha trên blog công nghệ của Telefónica gọi độ trễ 500 mili giây là chìa khóa để phát hiện ra hacker, còn phòng nghiên cứu bảo mật của Elastic đặt tên bài phân tích là “500ms to midnight” (tạm dịch: “500 mili giây trước nửa đêm”). Nửa giây ấy có thật, và Freund đã đo được. Nhưng theo lời chính Freund kể, điều khiến anh bắt đầu truy tìm là mức dùng CPU lộ rõ trên cỗ máy anh đã làm cho yên ắng để đo hiệu năng; sau đó profiler chỉ tới liblzma, và anh nhớ ra một lỗi Valgrind từ vài tuần trước đó. Đó là một chuỗi quan sát nhỏ, chứ không phải việc anh cảm thấy đăng nhập bị chậm.

Một cách kể khác lại ghi công cho chính mã nguồn mở. Công ty email mã hóa Tuta viết rằng “mã nguồn mở bảo đảm có nhiều con mắt hơn nhìn vào code”. Sau manh mối đầu tiên, tính công khai quả thật đã giúp ích: Freund có thể đối chiếu tarball phát hành với kho Git công khai và tìm ra dòng mã chỉ có trong gói phát hành. Thế nhưng, cửa hậu không bị phát hiện nhờ có người đọc code, mà vì một kỹ sư để ý thấy hành vi của nó khi chạy. Freund nói thẳng: “Thật sự là phải có rất nhiều sự trùng hợp.” Trong một bài đăng khác mà Reuters trích lại, anh viết: “Lần này chúng ta đã may mắn đến mức vô lý.”

Bài học từ lần phát hiện này

  • Lòng tin là một bề mặt tấn công. Jia Tan đã dành hơn hai năm làm một người đóng góp đắc lực trước khi cửa hậu được cài vào, và nhiều khả năng sức ép lên một người bảo trì vốn sức lực có hạn đã góp phần biến lòng tin ấy thành quyền kiểm soát.
  • Hãy kiểm tra thứ bạn phát hành, không chỉ thứ bạn duyệt. Phần kích hoạt cuộc tấn công chỉ nằm trong tarball, ở khe hở giữa kho mã nguồn và gói phát hành tương ứng.
  • Bạn thừa hưởng cả những thư viện phụ thuộc (dependency) mà mình chưa từng chọn. OpenSSH chưa bao giờ đòi dùng liblzma; một patch do bản phân phối thêm vào để gửi thông báo cho systemd đã kéo thư viện này vào.
  • Hệ thống yên ắng làm lộ ra điều bất thường. Freund thấy được lượng CPU dôi ra vì anh đã loại bỏ nhiễu từ trước.

Freund làm cho cỗ máy của mình yên ắng là để đo một thứ khác. Giữa sự tĩnh lặng ấy, một lần đăng nhập lẽ ra phải thất bại trong chớp mắt lại khiến bộ xử lý bận rộn, và công sức nhẫn nại suốt hơn hai năm của kẻ tấn công đổ bể. Lần tới, khi một con số trong hệ thống của bạn hơi lệch, hãy hỏi xem chương trình đang làm gì mà không ai bảo nó làm.

Bài liên quan

Đọc bằng ngôn ngữ khác: English

Nguồn