Backdoor XZ: “Không phải vượt qua xác thực mà là RCE, có cổng kiểm soát và không thể phát lại”
(bsky.app)- Theo phân tích sơ bộ bằng kỹ thuật dịch ngược về backdoor xz, hành vi này không đơn thuần là vượt qua xác thực mà gần với thực thi mã từ xa (RCE)
- Trọng tâm là luồng trong đó
RSA_public_decryptbị hook xác minh chữ ký của host key máy chủ bằng một khóaEd448cố định - Nếu vượt qua bước xác minh chữ ký, payload có thể được chuyển cho
system()để thực thi - Phân tích là kết quả sơ bộ được chia sẻ sau khi được cho phép; bài đăng Bluesky có bao gồm bài đăng được trích dẫn hoặc nội dung nhúng
- Backdoor được tóm tắt là có dạng có cổng kiểm soát và không thể phát lại, nên cần được nhìn nhận khác với các cuộc tấn công chỉ đơn giản tái sử dụng cùng một đầu vào
Luồng thực thi của backdoor xz
- Phân tích sơ bộ bằng kỹ thuật dịch ngược được chia sẻ sau khi được cho phép tập trung vào
RSA_public_decryptbị hook- Xác minh chữ ký đối với host key của máy chủ bằng một khóa
Ed448cố định - Sau khi xác minh, chuyển payload cho
system()
- Xác minh chữ ký đối với host key của máy chủ bằng một khóa
Phân loại và hạn chế
- Hành vi này được phân loại là thực thi mã từ xa (RCE) chứ không phải vượt qua xác thực
- Backdoor được tóm tắt là có đặc tính gated/unreplayable
- Bài đăng Bluesky gốc có bao gồm bài đăng được trích dẫn hoặc nội dung nhúng khác
1 bình luận
Ý kiến trên Hacker News
Có kết quả reverse engineering bổ sung về vụ này. Nó chứa thông tin ánh xạ lại symbol được trích xuất từ prefix trie mà backdoor dùng để che giấu chuỗi, và có vẻ bản thân phần reverse engineering/phân tích cũng là thứ mà nó cố né tránh
https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9...
Danh sách đầy đủ các chuỗi đã giải mã nằm ở đây
https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
Nhìn từ góc độ không rành nội bộ OpenSSL, giá trị N dường như được lấy từ trường
ncủarsa_sthttps://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
Giá trị này là
BIGNUM, và có vẻ là kiểu có độ dài biến thiênhttps://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
Backdoor lấy giá trị này từ chứng chỉ nhận từ kẻ tấn công từ xa, thử giải mã bằng ChaCha20, và nếu thành công thì chuyển cho
system().system()gần như chỉ là một wrapper đơn giản chạy một dòng script shell với quyền của người dùng mà tiến trình hiện tại đang chạyNếu tôi hiểu đúng, chuyện này còn tệ hơn việc vượt qua khóa công khai. Nếu là vượt qua khóa công khai, về lý thuyết chỉ lấy được quyền của người dùng đang cố đăng nhập, và trong các cấu hình SSH được gia cố, rất có khả năng đăng nhập root đã bị chặn
Nhưng đây là thực thi mã từ xa trong chính ngữ cảnh của tiến trình
sshd, nên nếusshdđang chạy dưới root thì payload cũng có thể chạy dưới root. Với một vụ thực thi mã từ xa lan rộng, trên thực tế gần như đây là kịch bản tệ nhấtTôi tò mò nếu backdoor này không bị phát hiện vì vấn đề hiệu năng thì về sau khả năng bị phát hiện sẽ là bao nhiêu. Tôi hiểu vấn đề hiệu năng là một sai sót/lỗi có thể sửa trong mã, nên việc liệu có công cụ nào bắt được nó hay không cũng rất quan trọng
Câu hỏi kiểu này liên quan nhiều đến việc hiểu đây có phải là backdoor đầu tiên thuộc loại này hay chỉ là cái đầu tiên bị lộ
Chỉ một sai lầm nhỏ cũng có thể làm mọi thứ sụp đổ, và đôi khi chỉ một câu thôi cũng đủ khởi động phản ứng dây chuyền, làm lộ một kế hoạch được sắp xếp tinh vi
Điều tra tội phạm diễn ra như vậy hằng ngày. Công việc cảnh sát có hạn chế về nguồn lực, nhưng phần mềm thì mỗi ngày đều được những người phân tích vì sở thích, các chuyên gia liên tục phân tích như một thú vui, và các chuyên gia phân tích chuyên nghiệp soi xét
Rốt cuộc rất có khả năng đến một lúc nào đó nó sẽ bị phát hiện
Cuộc tấn công XZ được thực hiện rất tốt, gần như là một kiệt tác. Sẽ không ngạc nhiên nếu có cơ quan nhà nước tham gia. Nhưng đồng thời nó cũng cực kỳ may mắn. Nếu bất kỳ điểm nào trong số những thứ hiện đang bị đánh dấu là vấn đề được phát hiện, không chỉ tôi mà nhiều đồng nghiệp hẳn đã bắt đầu một cuộc truy vết dài
Một kết luận có thể rút ra là nếu xz/liblzma không phải mã nguồn mở thì việc tìm ra vấn đề như vậy đã là bất khả thi. Tất nhiên cũng chính vì nó là mã nguồn mở nên chuyện này mới có thể xảy ra ngay từ đầu, nhưng hãy thử tưởng tượng nếu thứ này nằm bên trong Windows hay MacOS
Tuy nhiên nếu không dùng thì không đạt được mục đích. Càng dùng nhiều, khả năng bị phát hiện về sau càng tăng. Có thể so sánh với SolarWinds
Cá nhân tôi thấy lệnh gọi
system()hơi cẩu thả, và một trình quét chức năng nhị phân có lẽ đã có thể tìm ra đường dẫn đósshddiễn ra ở thời điểm linking, một giai đoạn có thể chấp nhận được, và nếu phân tích này đúng thì nó cũng không phải backdoor kiểu master key, nên không có dấu vết audit đăng nhập thông thường. Hơn nữa việcsshdkhởi động tiến trình khác tự nó đương nhiên có thể được cho phépMột policy SELinux cực kỳ chặt có thể bắt việc
sshdthực thi thứ gì đó không phải shell, nhưng mức gia cố như vậy hẳn rất hiếmVấn đề phát hiện từ bên ngoài mục tiêu thực ra cũng đã được thử nghiệm. Nhiều người đã xem payload bằng
valgrindvà các công cụ tương tự nhưng không thấy. Nó cũng được bảo vệ khá tốt để không bị phát hiện trong môi trường debug. Lý do là hạ tầng lộ ra bên dưới payload không tương thích với các công cụ như ASanNgay cả khi được liên kết, mã chạy từ rất lâu trước
main(), nên dù dò quanhliblzmabằng debugger, thông thường bạn cũng không quan sát được cảnh nó chạyVới
stracethì có thể thấy mọi syscall sau khi tiến trình được tạo và hoạt động của linker. Nhưng theo những gì đã nắm được tới nay, payload dường như không thực hiện syscall ở giai đoạn đó để quyết định có kích hoạt hay không, mà có vẻ nó xemargv,environvà các thứ tương tự[0] https://en.wikipedia.org/wiki/PWB/UNIX
[1] https://news.ycombinator.com/item?id=38020792
Có vẻ có một chuỗi được mã hóa bên trong payload nhị phân
https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01...
Chuỗi này hoạt động như một kill switch
https://piaille.fr/@zeno/112185928685603910
Nếu thật vậy, một biện pháp giảm thiểu có thể là như sau
-a. Nếu không, bạn có thể xóa sạch file môi trường. Và thông thường, cách đúng là nâng cấp lên phiên bản không có mã độc rồi khởi động lạiCó thể giải thích ngắn gọn backdoor này chính xác làm gì không? Hiện đã biết chưa? Có vẻ bản thân backdoor không phải là payload; tôi thắc mắc liệu có cần một file nén độc hại, hay nó hook vào tiến trình
sshdđể lắng nghe các gói độc hại từ kẻ tấn công từ xaBài gốc nghe như thể kẻ tấn công có thể gửi payload độc hại ở giai đoạn trước xác thực của phiên SSH, nhưng tôi cũng không hiểu vì sao lại nói exploit có thể sẽ không bao giờ xuất hiện. Nếu có thể reverse engineer mã thì chẳng phải cũng có thể viết proof of concept sao?
Rốt cuộc kẻ tấn công điều khiển máy có backdoor này bằng cách nào?
Tình huống ở đây cũng tương tự. Trước khi làm điều đáng ngờ, xz cố gắng giải mã một số dữ liệu. Vì là cơ chế bất đối xứng, nó có thể xác minh việc giải mã mà không cần cung cấp khóa mã hóa bí mật, do nó có khóa công khai tương ứng
Việc tìm ra khóa bí mật trên thực tế là bất khả thi, và nếu giải mã payload thất bại thì nó không có hành vi khác biệt dễ thấy, nên mã exploit có thể sẽ không bao giờ được công bố. Cách duy nhất để tạo mã exploit là bằng cách nào đó phát hiện được khóa bí mật, và trên thực tế gần như chỉ khi nhà phát triển backdoor làm rò rỉ nó
sshdkhởi động, nó tảilibsystemd, và thư viện này tải thư viện XZ có chứa mã bị hackThư viện XZ chèn các phiên bản riêng của nó cho các hàm OpenSSL dùng để xác minh chữ ký RSA
Khi ai đó đăng nhập SSH và trình ra một chứng chỉ SSH đã ký để xác thực, các hàm bị sửa đổi đó được gọi
Chứng chỉ có thể chứa các thông tin khẳng định như tên người dùng hoặc vai trò trong quy trình đăng nhập bình thường, và thông tin này được dùng để xác định chứng chỉ có hợp lệ cho đăng nhập của một người dùng cụ thể hay không. Nhưng nếu hàm bị sửa đổi phát hiện chứng chỉ được ký bằng một khóa tấn công cụ thể, nó sẽ lấy một số trường con trong chứng chỉ và thực thi chúng như lệnh hệ thống. Ngữ cảnh thực thi là
sshd, tức người dùng rootĐáng tiếc là ta không biết khóa ký của kẻ tấn công, chỉ biết khóa công khai mà mã bị hack dùng để xác minh. Về cơ bản, kẻ tấn công có thể thực thi lệnh tùy ý với quyền root trên hệ thống bị nhiễm, và dấu vết nhiều lắm cũng chỉ là một lần đăng nhập thất bại. Với hệ thống lộ ra Internet, những lần thử như vậy vốn đã rất nhiều
Điểm then chốt là cần chữ ký bằng khóa của kẻ tấn công. Chừng nào khóa đó không bị rò rỉ hoặc thuật toán RSA không bị phá, các nhà nghiên cứu khác hay bên thứ ba không thể lợi dụng backdoor này. Nếu RSA bị phá thì sẽ có vấn đề lớn hơn chuyện này rất nhiều
Hiện tại chỉ kẻ tấn công mới có thể chạy exploit, nên cũng không thể scan. Ngoại trừ các hiệu ứng phụ như suy giảm hiệu năng, nó khó bị phát hiện; thực tế nó cũng đã được phát hiện theo cách đó
Thật khó hiểu khi một gói quan trọng mà rất nhiều máy chủ Linux dùng hằng ngày lại không thể được tác giả gốc bảo trì vì thiếu kinh phí. Mã nguồn mở cần có điều gì đó thay đổi
Một giải pháp có thể là một giấy phép buộc các công ty hoặc tổ chức kinh doanh từ một quy mô nhất định trở lên phải trả chi phí bảo trì
Vì vậy nhà cung cấp sẽ có động lực giữ cho mã nguồn mở an toàn. Chẳng hạn trả tiền cho maintainer, thuê audit mã, hoặc tuyển nhân viên toàn thời gian để đóng góp
Hiện nếu vào kho xz thì nó đã bị vô hiệu hóa vì vi phạm điều khoản sử dụng của GitHub. Việc vô hiệu hóa là đương nhiên, nhưng tôi mong GitHub giữ lại mã và lịch sử, hiển thị banner, rồi chỉ chặn các chức năng có thể bị lạm dụng
Như vậy các nhà nghiên cứu và những người khác có thể học về exploit. Trong những tình huống nhỏ hơn, nếu một thư viện đang lưu trữ mã độc rồi kho bị gỡ xuống, người ta có thể chỉ bỏ qua và coi như không có gì đáng kể
Nếu quan tâm đến mã nguồn thì dễ tìm thôi. Mã này và kho Git được liên kết trong nhiều kho Git trên khắp thế giới, và mã nguồn cũng đã được đóng gói nhiều lần trong các bản phát hành
Với tư cách là người trên thực tế đang bảo trì một game mã nguồn mở không mấy nổi tiếng, tôi đã chứng kiến các lập trình viên đến rồi đi. Đóng góp nào có giá trị thì tôi cứ merge hết
Một số cộng tác viên đào khá sâu vào tính năng trong tình trạng C và C++ trộn lẫn với đủ kiểu phong cách viết code. Không phải lúc nào tôi cũng nắm hết mọi chi tiết triển khai, nhưng trong thâm tâm vẫn có suy nghĩ rằng nếu ai đó cài một backdoor thật sự xấu xa vào thì dự án sẽ tiêu đời
May là game này quá obscure và bề mặt tấn công cũng rất nhỏ. Dù vậy, chuyện này đã khiến tôi thôi bị cám dỗ bởi ý định ký các binary Windows chỉ vì thiện chí
Backdoor xz này thật sự là một cơn ác mộng khổng lồ, và tôi thấy tiếc cho các nhà phát triển ban đầu cũng như tất cả những ai bị cuốn vào chuyện này
Khi đang đi bộ trên đường rừng, một chiếc xe chạy ngang qua có thể cứ thế tông bạn. Tài xế nhiều khả năng sẽ không bị bắt, bạn không có cách nào ngăn lại, và cũng chẳng có cảnh sát bên cạnh. Kịch bản này đáng sợ hơn backdoor phần mềm nhiều, nhưng thực ra đó là mức rủi ro tối thiểu mà ta phải chấp nhận để sống và làm điều gì đó. Trên thực tế những chuyện như vậy cũng xảy ra
Nhưng rốt cuộc, đại đa số con người không chủ động tìm cách hại người khác. Mọi việc con người làm xưa nay đều luôn dựa trên giả định đó, và hiện giờ vẫn vậy
Ảo tưởng rằng chỉ cần review code nghiêm ngặt hơn một chút, dùng nhiều linter, CI và khớp mẫu hơn, phổ biến ký code hơn, xác minh danh tính mọi người thì sẽ ngăn được những chuyện này mới là vấn đề thật sự. Đó là triệu chứng của kiểu hoang tưởng Silicon Valley rằng thế giới có thể và nên được quản lý, kiểm soát ở mọi cấp độ chi tiết. Những “phương thuốc” như vậy có thể còn tệ hơn rất nhiều so với bất kỳ căn bệnh nào mà chúng muốn ngăn chặn
[1]: http://hintjens.com/blog:106
Tôi hiểu lợi ích của việc tạo ra một cộng đồng nơi người đóng góp thấy vui khi tham gia dự án. Nhưng tôi có cảm giác cách này khiến dự án phình to mà không có tầm nhìn hay hướng đi rõ ràng, và cuối cùng đặt gánh nặng quá mức lên maintainer để đưa đóng góp của người khác về một tiêu chuẩn chung
Việc review code thực sự bị đẩy sang một thời điểm không xác định trong tương lai, khi đó cũng không biết review có kỹ lưỡng hay không, ai sẽ chịu trách nhiệm thực hiện hoặc sửa vấn đề. Rốt cuộc nghe như một công thức cho sự hỗn loạn, nơi không thể kiểm soát thứ gì được phát hành đến người dùng
Cũng có vấn đề phát tán mã độc. Vấn đề này cũng xuất hiện trong phần bình luận của bài blog đó, và Pieter mô tả đúng kịch bản giống hệt vụ xz
“Giả sử Mallory kiên nhẫn, gian dối và đủ lâu để hành xử như một người đóng góp hợp lệ nhằm giành quyền kiểm soát dự án, rồi từ từ cài backdoor. Khi đó code review cẩn thận cũng không giúp được gì. Mallory chỉ cần giành đủ niềm tin để trở thành maintainer; đó không phải là câu hỏi có thể hay không, mà là bằng cách nào.”
Ông kết luận rằng “phòng thủ tốt nhất là quy mô và sự đa dạng của cộng đồng”
Nhưng tôi cho rằng code review cẩn thận thực sự có thể làm giảm khả năng chuyện như vậy xảy ra. Nếu review kỹ mọi đóng góp, dù từ người đóng góp được tin cậy hay người bên ngoài, thì khả năng phát hiện sớm các hành vi lạ hoặc các commit nói là “làm A” nhưng thực tế lại làm B sẽ cao hơn
Việc Optimistic Merging có dẫn đến một cộng đồng lớn hơn và đa dạng hơn hay không cũng còn gây tranh cãi. Có rất nhiều dự án vẫn có cộng đồng sôi động dù có hướng dẫn đóng góp nghiêm ngặt. Và nó không trả lời được sẽ bắt các patch độc hại khi nào và bằng cách nào
Vấn đề của xz không phải là cộng đồng nhỏ, mà là không có cộng đồng. Một tác nhân độc hại duy nhất đã giành được quyền kiểm soát dự án, và gần như không có sự giám sát của bất kỳ ai khác. Hướng dẫn đóng góp không phải là yếu tố quyết định quy mô cộng đồng, và dù có dùng Optimistic Merging hay không thì chuyện này vẫn sẽ xảy ra
[2]: http://hintjens.com/blog:106/comments/show#post-2409627
brew install caskhoặc cài extension cho vi/emacs/vscodeRust có thể được xem là ngôn ngữ/cộng đồng lập trình an toàn nhất theo mặc định, với thiết kế ưu tiên bảo mật đến mức gần như không cho nghịch pointer. Vậy mà đường dẫn cài đặt phổ biến và được khuyến nghị nhất lại như thế này, và chính tôi cũng là kẻ đạo đức giả hoàn toàn vì thường xuyên làm vậy
https://www.rust-lang.org/tools/install
Đây chỉ là một ví dụ. Thói quen tự mở cửa cho thực thi mã từ xa theo kiểu “hãy
curlcái này rồi pipe vàosh”, trong khi đồng thời tranh cãi về blockunsafecủa ai đó, đã trở thành phản xạ cơ bắp của quá nhiều ngườiThật đáng tiếc khi chuyện này xảy ra, nhưng không đáng ngạc nhiên. Tôi hy vọng sẽ có những công cụ tốt hơn để đối phó với các tác nhân độc hại kiểu này, và cũng là mã nguồn mở
Có những câu hỏi mà backdoor này đặt ra. Còn những backdoor nào khác do cùng nhóm hoặc nhóm tương tự cài vào? Có bao nhiêu nhóm như vậy đang hoạt động? Có bao nhiêu dependency dễ bị tổn thương trước kiểu tấn công xâm nhập này? Bề mặt tấn công cho các chiến dịch bí mật kiểu này trong ngành của chúng ta lớn đến mức nào?
Việc lập đồ thị cho các dịch vụ mạng chủ chốt như
apache httpd,postgres,mysql,nginx,openssh,dropbear ssh,haproxy,varnish,caddy,squid,postfix, toàn bộ dependency của chúng, và toàn bộ đồ thị committer của các dependency đó có thể là bước đầu để xác định nơi nào có giá trị cao nhất nhưng ít bị giám sát nhất.Không thể nào đây là lần đầu tiên có ai đó thử làm việc như vậy. Đây chỉ là trường hợp đầu tiên bị lộ vì thất bại. Chúng ta biết từng có backdoor được thử đưa vào kernel Linux rồi bị phát hiện, nhưng đây là tấn công từ xa và có tính chất hoàn toàn khác.
Tại sao không phát tán thứ gì đó trông vô hại, nếu bị phát hiện thì có thể giống như bug, mà lại triển khai một backdoor đầy đủ chức năng và còn cố che giấu cả cách phát tán?
Đây hẳn là một quyết định có chủ ý. Lý do có thể cho manh mối về mục tiêu của họ là gì.
Điều này có vẻ nghĩa là để quét exploit từ xa, chúng ta cần khóa riêng của kẻ tấn công, thứ mà chúng ta không có. Lựa chọn còn lại chỉ là chạy script phát hiện cục bộ.
Trừ khi phát hiện ra vấn đề này đã lan rộng trên các hệ thống thực tế, cách đó còn có vẻ tệ hơn chuyện những “chuyên gia” tương tự trước đây từng yêu cầu đổi mật khẩu hằng năm, khiến bảo mật thực tế kém đi nhưng bảo mật trên giấy tờ trông tốt hơn.
Việc kiểm tra chữ ký của backdoor sẽ mất khoảng 100µs, nên key có fingerprint khớp sẽ cần thời gian xử lý lâu hơn key không khớp đúng bằng khoảng đó. Chênh lệch thời gian này ít nhất là có thể phát hiện được trên LAN, và cũng có thể phát hiện qua Internet nếu scanner chạy ở vị trí gần mục tiêu.
Những hệ thống chặn IP client sau nhiều lần xác thực thất bại sẽ khiến việc quét khó hơn.
(https://bench.cr.yp.to/results-sign.html ghi xác minh Ed448 mất khoảng 400 nghìn chu kỳ, tương đương 100µs ở 4GHz)
sshdcó backdoor đưa ra một challenge nào đó rồi kẻ tấn công phải ký lên nó không?Có thể là ý kiến không được ưa chuộng, nhưng tôi không thể không thán phục toàn bộ chiến dịch này. Tất nhiên là tôi lên án, nhưng vẫn phải thán phục. Từ ý tưởng đến thực thi, nó thật sự giống một tác phẩm nghệ thuật, và việc nó bị bắt sớm như vậy là một may mắn cực lớn.
Lần sau, có khả năng kẻ tấn công sẽ tạo payload không gây ra những đợt tăng độ trễ kỳ lạ trong các tác vụ có người đang chờ.
Không hiểu sao tôi lại nhớ đến chuyện Kim Dotcom phát hiện mình là mục tiêu nghe lén trái phép. Lý do là ping của ông ấy trong MW3 đột nhiên tăng mạnh. Điều tra ra thì chỉ riêng packet của ông ấy bị định tuyến vòng qua văn phòng GCSB ở một nơi rất xa về mặt vật lý. GCSB không có quyền nghe lén thường trú nhân New Zealand. Cuối cùng ông ấy nhận được lời xin lỗi cá nhân từ Thủ tướng New Zealand.
Tôi nghĩ phần tài tình nhất là lựa chọn dự án để xâm nhập. Khi đọc lại muộn màng cuộc thảo luận pull request IFUNC của “Hans”, thật đau lòng, nhưng nó cho thấy rất rõ vì sao dự án này được chọn.
Tôi muốn biết phía sau “Jia” và “Hans” có bao nhiêu người, và họ đã phân tích, xây dựng chiến lược cho giao tiếp cũng như đóng góp code như thế nào. Một số khía cạnh như các nhân cách thứ ba giả vờ gây áp lực trên mailing list trông có vẻ được dựng hơi vụng.
Vì vậy vẫn có khả năng đây là một nhóm nhỏ tinh vi, thậm chí là một cá nhân đơn độc. Nếu là tác nhân nhà nước, tôi nghĩ họ sẽ có những người làm việc cả ngày để tạo và duy trì các nhân cách giả cho kiểu chiến dịch này.
Nếu ai đó nghĩ rằng “ba người dùng này thúc ép hơi thô lỗ một cách kỳ lạ, họ là ai vậy? Các tài khoản đều được tạo cùng thời điểm. Đáng ngờ. Tại sao ai đó lại cố dùng tài khoản giả để thúc ép mạnh chuyện này như thế? Phải điều tra mới được”, thì họ đã gặp rắc rối. So với toàn bộ công sức bỏ ra, phần đó là bất cẩn, hoặc kế hoạch kém, hoặc thiếu ngân sách.
Thêm một giả thuyết kịch tính: có thể kẻ tấn công đã sợ “quả bom hạt nhân thông tin” mà mình sắp kích nổ nên cố tình làm hỏng.
Có thể vừa ghê tởm kết quả cuối cùng, vừa công nhận độ phức tạp của cuộc tấn công.