Vụ backdoor XZ: Kết quả phân tích ban đầu
(securelist.com)- Backdoor XZ Utils/liblzma được công bố trên mailing list Openwall OSS-security vào ngày 29/3/2024, và rất có khả năng mục tiêu cuối cùng của kẻ tấn công là cấy khả năng thực thi mã từ xa vào máy chủ OpenSSH sshd trên các bản phân phối dựa trên systemd
- Chuỗi lây nhiễm gồm quá trình chèn nhiều giai đoạn lợi dụng các tệp kiểm thử và hạ tầng build của kho XZ; thông qua
build-to-host.m4,bad-3-corrupt_lzma2.xz,good-large_compressed.lzma, một tệp object độc hại được liên kết vàoliblzmatrong quá trình build - XZ 5.6.0 và 5.6.1 có chứa backdoor đã được phân phối trong các bản build beta/thử nghiệm của một số nhà cung cấp lớn, và CVE-2024-3094 được gán mức độ nghiêm trọng 10 điểm
- Backdoor nhị phân được nạp bằng cách lạm dụng IFUNC của GLIBC và đường gọi
cpuid; sau đó nó cố gắng hook các hàm liên quan đến OpenSSL/libcrypto để giám sát các kết nối tới máy bị nhiễm - Mã độc kiểm tra việc
/usr/bin/sshdcó đang chạy hay không và biến môi trường kill switch; đồng thời dùng xử lý chuỗi dựa trên trie, phân giải symbol động và vá runtimertdl-auditđể gây khó khăn cho phân tích và phát hiện
Tổng quan sự việc và phạm vi ảnh hưởng
- Ngày 29/3/2024, việc phát hiện backdoor XZ được công bố qua một thông điệp trên mailing list Openwall OSS-security
- XZ là một tiện ích nén được tích hợp trong nhiều bản phân phối Linux lớn
- Trọng tâm rủi ro nằm ở chỗ
liblzmachứa backdoor có thể được liên kết với tiến trình máy chủ OpenSSHsshdtrên một số bản phân phối dựa trên systemd- Ubuntu, Debian, RedHat/Fedora Linux đã được vá để OpenSSH sử dụng các tính năng systemd, nên phụ thuộc vào thư viện này
- Arch Linux và Gentoo được tổng kết là không bị ảnh hưởng
- Rất có khả năng mục tiêu cuối cùng của kẻ tấn công là đưa vào khả năng thực thi mã từ xa qua sshd mà người khác không thể sử dụng
- Khác với các cuộc tấn công chuỗi cung ứng khác thường xoay quanh một bản vá độc hại đơn lẻ, gói giả hoặc gói typosquatting, sự việc này gần với một chiến dịch nhiều giai đoạn suýt thành công trong việc xâm phạm máy chủ SSH trên toàn thế giới
Cách backdoor được đưa vào
- Backdoor
liblzmađược chèn ở hai cấp độ bằng cách kết hợp quá trình build và các tệp kiểm thử- Mã nguồn hạ tầng build tạo gói cuối cùng bị sửa đổi bằng việc thêm
build-to-host.m4 - Các script và thành phần nhị phân ẩn trong tệp test case được trích xuất trong quá trình build
- Mã nguồn hạ tầng build tạo gói cuối cùng bị sửa đổi bằng việc thêm
- Luồng lây nhiễm xoay quanh ba tệp
build-to-host.m4: script build trích xuất script giai đoạn tiếp theobad-3-corrupt_lzma2.xz: tệp kiểm thử có ẩn shell scriptgood-large_compressed.lzma: tệp kiểm thử có ẩn object nhị phân độc hại
- Thành phần nhị phân độc hại được trích xuất có thể được liên kết với thư viện hợp lệ trong quá trình biên dịch rồi được đưa vào các kho Linux
- Các nhà cung cấp lớn đã phân phối thành phần độc hại này trong các bản build beta và thử nghiệm
- Vụ xâm phạm XZ Utils được gán CVE-2024-3094, với mức độ nghiêm trọng tối đa là 10 điểm
Dòng thời gian chính
- 19/1/2024: Maintainer mới
jiaT75chuyển website XZ sang GitHub Pages - 15/2/2024:
build-to-host.m4được thêm vào.gitignore - 23/2/2024: Hai “tệp kiểm thử” chứa giai đoạn script độc hại được thêm vào
- 24/2/2024: XZ 5.6.0 được phát hành
- 26/2/2024: Một commit cản trở tính năng bảo mật Landlock được đưa vào
CMakeLists.txt - 4/3/2024: Backdoor gây ra vấn đề liên quan đến Valgrind
- 9/3/2024: Hai tệp kiểm thử được cập nhật, hàm CRC được sửa đổi và vấn đề Valgrind được “khắc phục”
- 9/3/2024: XZ 5.6.1 được phát hành
- 28/3/2024: Lỗi được phát hiện và thông báo cho Debian cùng RedHat
- 28/3/2024: Debian rollback XZ 5.6.1 về phiên bản 5.4.5-0.2
- 29/3/2024: Email công khai được đăng lên mailing list OSS-security
- 29/3/2024: RedHat xác nhận XZ có chứa backdoor đã được phân phối trong Fedora Rawhide và Fedora Linux 40 beta
- 30/3/2024: Debian dừng build và bắt đầu quy trình rebuild
- 2/4/2024: Nhà phát triển chính của XZ thừa nhận sự cố backdoor
Ba giai đoạn của chuỗi lây nhiễm
-
Giai đoạn 1:
build-to-host.m4bị sửa đổi- Các bản phát hành trên kho GitHub chính thức của XZ có chứa tệp kiểm thử độc hại, nhưng ban đầu vô hại vì các tệp này không có cơ hội được thực thi
- Mã độc bootstrap quá trình lây nhiễm dường như nằm trong bản phát hành được cung cấp từ
xz[.]tukaani.org, dojiaT75kiểm soát - Hầu hết các bản phân phối dùng URL này, và bản phát hành tải về có chứa tệp
build-to-host.m4mang mã độc build-to-host.m4chạy trong quá trình build; nó dùngtrđể sửa dữ liệu “hỏng” trongbad-3-corrupt_lzma2.xz, rồi giải nén bằngxz -d- Kết quả giải nén chứa một shell script sẽ được thực thi sau đó bằng
/bin/bash
-
Giai đoạn 2: Shell script được chèn vào
- Script do tệp
.m4độc hại chèn vào kiểm tra xem nó có đang chạy trên máy Linux và trong đúng tiến trình build dự kiến hay không good-large_compressed.lzmađược dùng để chạy giai đoạn tiếp theo- Tệp này được nén hợp lệ bằng XZ, nhưng trong dữ liệu giải nén có chứa dữ liệu rác
- Script thực thi pipeline
headbằngevalđể trích xuất dữ liệu - Mỗi lệnh
headbỏ qua 1024 byte tiếp theo, hoặc trích xuất 2048 byte hoặc 724 byte tiếp theo - Tổng cộng 33.492 byte được trích xuất
tailgiữ lại 31.265 byte cuối của tệp và bỏ qua phần còn lại- Sau đó,
tráp dụng phép thay thế cơ bản để gỡ rối obfuscation, lệnh XZ thứ hai giải nén các byte đã chuyển đổi thành luồnglzmaraw, rồi chuyển kết quả cho shell
- Script do tệp
-
Giai đoạn 3: Trích xuất object backdoor
- Shell script ở giai đoạn cuối kiểm tra nhiều điều kiện để xác nhận nó đang chạy trong môi trường dự kiến
- Kiểm tra xem dự án có được cấu hình để sử dụng IFUNC hay không
- Kiểm tra xem có được biên dịch bằng GCC hay không
- Sau đó kiểm tra xem các tệp cụ thể mà script sẽ dùng có tồn tại trong dự án hay không
- Giai đoạn này trích xuất một tệp object ẩn ở một offset khác trong
good-large_compressed.lzma - Quy trình trích xuất chạy tuần tự nhiều lệnh, chuyển đầu ra của mỗi lệnh thành đầu vào cho lệnh tiếp theo
- Trích xuất
good-large_compressed.lzmabằng công cụ XZ - Sử dụng
eval $ivà nhiều lệnh gọihead - Giải mã dữ liệu nhị phân bằng một thuật toán tùy chỉnh giống RC4
- Trích xuất lại tệp nén đã giải mã bằng XZ
- Loại bỏ một số byte ở phần đầu rồi lưu kết quả thành
liblzma_la-crc64-fast.o - Cuối cùng, script sửa hàm
is_arch_extension_supportedtrong tệpcrc_x86_clmul.hcủaliblzma - Thay lệnh gọi
__get_cpuidbằng_get_cpuid, loại bỏ một dấu gạch dưới - Thay đổi này cho phép object backdoor được liên kết vào thư viện
Cách backdoor nhị phân được nạp
- Mã XZ gốc có các hàm đặc biệt
lzma_crc32vàlzma_crc64để tính CRC - Hai hàm này được lưu trong bảng symbol ELF dưới dạng kiểu IFUNC của GLIBC
- IFUNC cho phép dynamic linker chọn động hàm sẽ dùng khi nạp shared library
- XZ dùng tính năng này để kiểm tra các tính năng bộ xử lý hiện đại như CLMUL, SSSE3, SSE4.1 rồi quyết định có dùng hàm CRC đã tối ưu hay không
- Việc kiểm tra tính năng bộ xử lý cần lệnh
cpuid, và wrapper__get_cpuiddo GLIBC cung cấp được gọi - Khi script độc hại đổi
__get_cpuidthành_get_cpuid, lệnh gọi trong mã được liên kết tới symbol_get_cpuidtrong tệp object backdoor - Mã backdoor ban đầu được gọi hai lần vì
lzma_crc32vàlzma_crc64dùng cùng hàm đã sửa_get_cpuid- Nó dùng một bộ đếm đơn giản để kiểm tra xem đã chạy hay chưa
- Nếu IFUNC
lzma_crc64gọi_get_cpuidvà giá trị bộ đếm là 1, giai đoạn chuyển hướng tới entry point cuối cùng sẽ bắt đầu
Hành vi runtime và mục tiêu hook
- Backdoor khởi tạo các cấu trúc chứa thông tin cốt lõi về tiến trình đang chạy
- Nó dùng các offset hard-code để tìm địa chỉ Global Offset Table (GOT), rồi tìm con trỏ
cpuidbên trong - Sau đó, nó thay con trỏ bằng hàm độc hại chính, từ đó gọi hàm độc hại như thể đang gọi
cpuid - Mục tiêu chính là hook các hàm cụ thể để có thể giám sát các kết nối đi vào máy bị nhiễm
- Các hàm mục tiêu liên quan đến
libcryptoRSA_public_decrypt: được dùng khi giải mã bản mã đã được ký bằng khóa riêngEVP_PKEY_set1_RSA: được dùng khi thiết lập khóa RSA cho một context cụ thể- Không có trong các phiên bản máy chủ SSH mới, nhưng được dùng trong công cụ tạo khóa SSH độc lập
RSA_get0_key: được dùng khi lấy khóa RSA
- Quá trình hook cần truy cập nhiều cấu trúc nội bộ và thao tác cấu trúc theo từng tiến trình; mã độc cũng thực hiện các kiểm tra để né phân tích
Kiểm tra môi trường thực thi và kỹ thuật né phân tích
-
Kiểm tra
sshdvà kill switch- Backdoor trước tiên phân tích dynamic linker
ld-linux, nơi phân giải động địa chỉ symbol - Kiểm tra xem môi trường thực thi hiện tại có đáp ứng tiêu chí hay không
- Kiểm tra xem tiến trình hiện tại có phải
/usr/bin/sshdhay không - Kiểm tra xem kill switch có tồn tại hay không
- Tên tiến trình hiện tại được trích xuất từ
argv[0] - Nó phân tích toàn bộ biến môi trường của tiến trình để xem có khớp với giá trị trong bảng chuỗi nội bộ hay không
- Nếu có biến môi trường khớp hoặc tiến trình không phải
sshd, mã độc sẽ dừng thực thi - Biến duy nhất trong bảng nội bộ,
yolAbejyiejuvnup=Evjtgvsh5okmkAvj, trong ngữ cảnh này hoạt động như kill switch
- Backdoor trước tiên phân tích dynamic linker
-
Xử lý chuỗi dựa trên trie
- Một đặc điểm của backdoor là dùng một cấu trúc trie duy nhất cho các thao tác chuỗi
- Thay vì so sánh trực tiếp các hằng như tên hàm hoặc so sánh bằng hash chuỗi, nó kiểm tra xem kết quả tra cứu trie có bằng một giá trị hằng cụ thể hay không
- Magic value của header ELF trả về 0x300 từ trie
- Tên hàm
systemkhớp với giá trị trả về 0x9F8 - Trie không chỉ dùng để so sánh mà còn để tìm chuỗi trong binary host
- Ví dụ, với hàm dùng con trỏ chuỗi như
ssh-2.0, backdoor tìm chuỗi đó trong binary host để không để lại dữ liệu đáng ngờ trong phần thân backdoor - Cách triển khai dùng bitmask 16 byte
- Mỗi nửa tương ứng với dải byte đầu vào
0x00-0x3F,0x40-0x7F - Node lá của trie dài 2 byte; 3 bit được dùng làm cờ, phần còn lại dành cho giá trị hoặc vị trí node tiếp theo
Phân giải symbol và hook rtdl-audit
-
Routine phân giải symbol
- Backdoor có ít nhất 3 routine phân giải symbol để tìm cấu trúc ELF Symbol
- Tất cả hàm phân giải symbol đều nhận khóa cần tìm trong trie làm đầu vào
- Một hàm phân giải duyệt qua toàn bộ symbol để tìm symbol có khóa mong muốn, và nếu tìm thấy thì trả về cấu trúc
Elf64_Sym - Cấu trúc này sau đó được dùng để điền vào các cấu trúc nội bộ của backdoor, lưu trữ các con trỏ hàm cần thiết
- Quá trình này tương tự routine API hashing thường thấy trong các mối đe dọa trên Windows
- Sau đó backdoor tìm kiếm nhiều hàm OpenSSL
libcryptosẽ dùng trong routine mã hóa - Nó theo dõi số lượng hàm đã tìm và phân giải, rồi dùng giá trị này để quyết định có thực thi bình thường hay dừng lại
-
Allocator giả lạm dụng
lzma_alloc- Một trình phân giải symbol khác lạm dụng hàm
lzma_alloccủa chínhliblzma lzma_alloclà hàm giúp cấp phát bộ nhớ hiệu quả bằng allocator mặc định làmallochoặc allocator tùy chỉnh- Trong backdoor XZ, allocator giả khiến hàm này hoạt động như một trình phân giải symbol khác
- Tham số vốn dùng làm “kích thước cấp phát” thực tế được dùng làm khóa symbol trong trie
- Thủ thuật này nhằm làm cho việc phân tích backdoor khó hơn
- Backdoor phân giải động symbol trong khi chạy, không bị giới hạn ở cách phân giải toàn bộ symbol một lần hoặc chỉ phân giải khi cần
- Mục tiêu phân giải bao gồm từ các hàm OpenSSL hợp lệ cho đến các hàm như
systemdùng để thực thi lệnh trên máy
- Một trình phân giải symbol khác lạm dụng hàm
-
Vá runtime
rtdl-audit- Backdoor dùng tính năng rtdl-audit của dynamic linker để hook hàm
- Thông thường,
rtdl-auditlà tính năng cho phép nhà phát triển tạo shared library tùy chỉnh để nhận thông báo về các sự kiện linker như phân giải symbol - Backdoor XZ không tạo shared library riêng; thay vào đó, nó vá runtime giao diện mặc định đã được đăng ký trong bộ nhớ để chiếm quyền routine phân giải symbol
- Cấu trúc
audit_ifaceđộc hại được lưu trong biến toàn cụcdl_auditcủa vùng nhớ dynamic linker chứa địa chỉ callbacksymbind64 - Khi dynamic linker gọi callback này, toàn bộ thông tin symbol sẽ rơi vào quyền kiểm soát của backdoor; với các hàm mục tiêu, nó trả về địa chỉ độc hại để hoàn tất việc hook
- Địa chỉ
dl_auditvàdl_nauditđược lấy bằng cách disassemble các hàmdl_mainvàdl_audit_symbind_alt - Backdoor chứa một disassembler tối giản nội bộ để giải mã lệnh, được dùng rộng rãi khi tìm các giá trị cụ thể như địa chỉ
*audit
Các bản phân phối backdoor đã xác nhận và thông tin phát hiện
-
Bản phân phối mã nguồn có chứa backdoor
- xz-5.6.0
- MD5:
c518d573a716b2b2bc2413e6c9b5dbde - SHA1:
e7bbec6f99b6b06c46420d4b6e5b6daa86948d3b - SHA256:
0f5c81f14171b74fcc9777d302304d964e63ffc2d7b634ef023a7249d9b5d875
- MD5:
- xz-5.6.1
- MD5:
5aeddab53ee2cbd694f901a080f84bf1 - SHA1:
675fd58f48dba5eceaf8bfc259d0ea1aab7ad0a7 - SHA256:
2398f4a8e53345325f44bdd9f0cc7401bd9025d736c6d43b372f4dea77bf75b8
- MD5:
- xz-5.6.0
-
Artifact chính đã được phân tích
bad-3-corrupt_lzma2.xz:86fc2c94f8fa3938e3261d0b9eb4836be289f8aebuild-to-host.m4:b4dd2661a7c69e85f19216a6dbbb1664good-large_compressed.lzma:540c665dfcd4e5cfba5b72b4787fec4fliblzma_la-crc64-fast.o:212ffa0b24bb7d749532425a46764433
-
Thư viện đã biết có chứa backdoor
- Debian Sid
liblzma.so.5.6.0- MD5:
4f0cf1d2a2d44b75079b3ea5ed28fe54 - SHA1:
72e8163734d586b6360b24167a3aff2a3c961efb - SHA256:
319feb5a9cddd81955d915b5632b4a5f8f9080281fb46e2f6d69d53f693c23ae
- MD5:
- Debian Sid
liblzma.so.5.6.1- MD5:
53d82bb511b71a5d4794cf2d8a2072c1 - SHA1:
8a75968834fc11ba774d7bbdc566d272ff45476c - SHA256:
605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
- MD5:
- Debian Sid
-
Tên phát hiện
- Các sản phẩm Kaspersky phát hiện các đối tượng độc hại liên quan đến cuộc tấn công là HEUR:Trojan.Script.XZ và Trojan.Shell.XZ
- Kaspersky Endpoint Security for Linux phát hiện mã độc trong bộ nhớ tiến trình SSHD là MEM:Trojan.Linux.XZ như một phần của tác vụ Critical Areas Scan
- Quy tắc Yara được cung cấp là quy tắc
liblzma_get_cpuid_functionnhằm tìm hàmget_cpuidđộc hại liên quan đến CVE-2024-3094
1 bình luận
Các ý kiến trên Hacker News
Câu này có vẻ còn nói giảm đi so với những gì thực sự đã xảy ra
Điều đáng sợ hơn khía cạnh kỹ thuật của backdoor là quy mô và mức độ của social engineering. Backdoor là sản phẩm cuối cùng, và việc nó được đưa vào là vì tại thời điểm đó toàn bộ dự án xz về cơ bản đã bị các tác nhân độc hại, tức “Jia Tan” và những người xung quanh, kiểm soát trong thời gian dài. Họ đã tiến hành chiến tranh tâm lý với maintainer hơn một năm, mà maintainer hay bất kỳ ai khác đều không nhận ra
Chuyện như tiểu thuyết gián điệp, và nếu việc như thế này có thể xảy ra thì không khỏi tự hỏi hiện giờ ở các dự án khác còn đang diễn ra những gì
Bản thân mã backdoor cũng thể hiện cùng một lối tư duy. Nó không chỉ cố tỏ ra vô hại, mà còn chủ động tạo ra một câu chuyện về việc bề ngoài nó đang làm gì thông qua commit message, comment, tên biến, lựa chọn lệnh..., trong khi thực tế lại khiến nó làm một việc hoàn toàn khác. Cấu trúc này khiến người đầu tiên xem mã nghi ngờ cách hiểu của chính mình, rồi nghi ngờ là bug, và phải rất lâu sau mới nghi ngờ có ác ý
Hy vọng bất kỳ cơ quan tình báo nào cũng đang điều tra vụ này sâu hơn
Thật bực khi trong mọi thread HN về backdoor, khả năng này lại bị phủ nhận như thể đó là hoang tưởng hay đội mũ giấy bạc. Người ta đối xử với nó như chuyện không xảy ra, nhưng lần này chỉ là một trường hợp cụ thể bị bắt quả tang, còn những trường hợp chưa bị phát hiện thì nhiều vô kể
Vụ này là dự án open source nên việc phát hiện còn tương đối dễ hơn, vậy mà vẫn là may mắn. Giờ thử nghĩ đến các sản phẩm closed source: việc cài backdoor chỉ còn là bài toán xâm nhập hoặc gây sức ép lên một tổ chức. Những chuyện như vậy xảy ra thường xuyên. Không ai muốn tin, nhưng nó phổ biến. Ai từng làm ở công ty hạ tầng công nghệ hẳn đều có vài câu chuyện. Khó nói ra vì NDA hoặc những lý do còn nghiêm trọng hơn, nhưng nó thực sự xảy ra
Đây có thể là kết quả từ sự ám ảnh của một ai đó, hoặc là công việc của một công ty an ninh tư nhân hay tác nhân nhà nước làm những việc kiểu này với nhiều dự án như một công việc từ 9 giờ đến 5 giờ
Việc sự chú ý cho đến nay tập trung vào chuyện backdoor hoạt động thành công ra sao và đạt mục tiêu bằng cách nào là điều dễ hiểu
Dù vậy, tôi cũng muốn xem phân tích sâu hơn về các sai lầm và những phần bị thiết kế quá mức. Trong cuộc phỏng vấn của Bryan Cantril [1], Andrés nói thứ này giống như linh kiện backdoor có sẵn chứ không hẳn được làm ra với hiểu biết đầy đủ về cách nó sẽ được phân phối, nên có nhiều chỗ ngớ ngẩn. Ví dụ như tra cứu bảng symbol đã khiến anh ấy bắt đầu điều tra
Tương tự, tôi cũng tò mò vì sao lại cắt 48 byte bằng RC4 [2]
Tôi muốn nghe thêm về việc nếu có nhiều thời gian hơn hoặc đội ngũ tốt hơn thì họ có thể làm tốt hơn thế nào, hoặc họ đã sai nghiêm trọng hơn ở đâu
[1] https://youtu.be/jg5F9UupL6I?si=gvXsYFXgagkGOMd4
[2] https://twitter.com/matthew_d_green/status/17744729080201014...
Nếu tôi hiểu đúng, một biện pháp hardening hữu ích có lẽ là để mỗi thư viện liên kết động có GOT riêng, và sau khi liên kết động kết thúc thì đánh dấu bảng là chỉ đọc. Tức là ngăn việc patch các mục ifunc của bên kia vượt qua ranh giới động
Làm vậy có thể cải thiện bảo mật chuỗi cung ứng cho phần mã được liên kết vào đâu đó nhưng không được thực thi
Xa hơn nữa, có lẽ nên triển khai ifunc theo kiểu khai báo, để không gây ra thực thi mã tùy ý trong từng thư viện được liên kết. Vì tương thích ngược nên hiện tại việc triển khai sẽ khó, nhưng về dài hạn có vẻ có thể đưa vào theo từng lớp. Ví dụ, nếu một thư viện được build với bit tính năng “ifunc liên kết khai báo”, thì dynamic linker sẽ cho chạy thất bại khi không phải mọi thư viện được liên kết đều có cùng cờ tính năng đó
Hiện nay hầu hết các bản build thư viện chạy những script cực kỳ phức tạp và khó hiểu, đòi hỏi môi trường Turing-complete. Điều này trao cho kẻ tấn công một bề mặt tấn công vô tận, và nếu quá trình build bị chiếm đoạt thì cơ hội sẽ xuất hiện
Chuyển sang quy trình build khai báo, trong đó trình chạy chỉ là một máy trạng thái bị giới hạn, sẽ hữu ích. Yêu cầu mọi khối nguồn đều phải tái lập được cũng đáng cân nhắc
Từ thời điểm đó trở đi, mọi phòng thủ đều vô hiệu. Nếu muốn, họ có thể remap GOT thành ghi được, và dù hành vi đó có thể bị phát hiện là “đáng ngờ” hoặc hệ điều hành có thể chặn việc chuyển đổi, mã đã bị tiêm vẫn có thể đảo ngược luồng điều khiển bằng hàng trăm cách khác. Đọc/ghi tùy ý, thực thi mã, mọi thứ đều có thể. Không có biện pháp giảm thiểu bảo mật nào có thể ngăn một mức độ xâm phạm như thế này. Nếu muốn, nó có thể rò rỉ private key và gửi thẳng cho kẻ tấn công, hoặc bật shell. Cố thiết kế bảo vệ ở giai đoạn này là công cốc
Con trỏ hàm đúng được nạp khi nó được gọi lần đầu và được chèn vào bảng thay cho stub, và thời điểm đó có thể ở một tương lai xa tùy ý. Trên thực tế, trong các hệ sinh thái thư viện lớn như ứng dụng gtk, phần lớn các hàm được liên kết hoàn toàn không bao giờ được gọi
-march=nativelà phổ biến, và chỉ cần đặt-multiarchtrong USE flag của glibc là dễ dàng vô hiệu hóa ifunc. Tôi chưa thấy tác động tiêu cực nàoVề 3 giai đoạn đầu, bài này không bổ sung nhiều so với những gì đã được biết trong 2 tuần qua. Có thể xem là một bài tổng hợp tốt kèm sơ đồ luồng
Nhưng phần phân tích binary chi tiết đến mức đó thì có vẻ mới
Mã nguồn xuất hiện trong đó được tạo ra như thế nào? Họ chạy disassembler, hiểu mã đang làm gì rồi đổi toàn bộ tên thành các tên mang tính mô tả à? Nếu làm được trong 2 tuần thì có vẻ là một thành quả đáng kể
Global Research & Analysis Team, Kaspersky Lab
https://securelist.com/author/great/
Vì người viết có vẻ là đội phân tích malware của Kaspersky Lab, khả năng cao là họ khá giỏi reverse engineering binary
https://hex-rays.com/ida-pro/
Điều tôi thật sự tò mò là chính xác điều gì đã gây ra độ trễ ban đầu của SSH, thứ đã khơi mào cuộc điều tra xz. Ai đã tìm ra chưa?
Theo những người đã reverse engineering mã, thông điệp lệnh cũng phải được ràng buộc với SSH host key. Vì vậy nếu host key là khóa RSA, có thể nó cũng thực hiện thêm một phép giải mã RSA cho mỗi kết nối
Nếu vậy thì có lẽ đủ để là nguyên nhân gây trễ
Đây là một cách dễ để từ bên ngoài biết máy chủ có bị nhiễm hay không mà không cần thử chèn mã trước
Các tác giả hiểu rất sâu về cấu trúc nội bộ của glibc. Đây là loại nội dung chỉ có thể biết nếu đã vùi mình vào mã nguồn, và cũng có nhiều kỹ thuật mới
Custom ELF parser và disassembler phức tạp đến mức khó hình dung rằng mã đó chưa từng được dùng ở đâu khác trong quá khứ, hoặc sẽ không được dùng lại trong tương lai
Tôi tự hỏi liệu vụ này có nhận được cuộc điều tra nghiêm túc đúng mức hay không, nhưng có vẻ là không
Đã có ai phân tích lỗi của backdoor rốt cuộc đã gây ra lỗi Valgrind và làm SSH chậm đi, khiến vụ này bị lộ chưa?
Bản “sửa” cho Valgrind là vô hiệu hóa ifunc, và kết quả là backdoor bị vô hiệu hóa nên lỗi biến mất
Theo tôi biết, việc chậm đi bắt nguồn từ tất cả các thao tác tra cứu symbol và instruction mà backdoor thực hiện
Nhìn theo hướng bất ngờ, xét đến công sức kẻ tấn công đã bỏ ra trong script và code để tránh bị phát hiện, toàn bộ dự án này có thể chỉ là mồi đánh lạc hướng, hoặc là phương án dự phòng trong khi nhiều nỗ lực khác đang diễn ra đồng thời
Làm sao để đi trước những thứ như thế này một bước? Việc cộng đồng tập trung vào SSHD có ảnh hưởng đến các phần khác của toàn hệ thống không? Còn các khía cạnh kỹ thuật hoặc xã hội khác thì sao?
Mũ giấy bạc thì thú vị đấy
Hoặc mua phần mềm closed-source từ nơi như Microsoft, rồi hy vọng họ có tài nguyên và ý chí để rà soát mã nghiêm ngặt hơn
Và tất nhiên luôn có cách là có một đội vận hành bảo mật giỏi để phát hiện hoạt động mạng bất thường và các nỗ lực leo thang đặc quyền
Chỉ là những contributor không có lịch sử hay dấu vết nào ngoài dự án họ đang làm nên được xem là dấu hiệu cảnh báo trong tương lai
Các nhóm cũ như GOBBLES, ADM, ac1db1tch3z, ~el8 cũng từng làm những việc như vậy, và cả các “nhà nghiên cứu bảo mật” tư nhân như isec.pl cũng thế
Lần này thành vấn đề vì các tác nhân nhà nước đang lợi dụng chủ nghĩa tư bản doanh nghiệp, thứ đã tạo ra một thời đại trong đó các dự án nền tảng được duy trì bằng mức thù lao thấp. Những kẻ xấu gần như có nguồn lực vô hạn để đạt mục tiêu
Điều đó rốt cuộc đã tạo ra nhu cầu và sự ra đời của các tổ chức như NSO, Zerodium
Trước đó, exploit và backdoor hầu như không có giá trị, còn hacker thì kỳ vọng được các công ty như Qualys tài trợ hoặc tuyển dụng
Tôi đã xem vài phân tích của Google về các vụ hack lỗ hổng zero-day, chúng cũng xuất sắc đến mức phi thực tế, nhưng vụ hack lần này có lẽ sẽ thuộc hàng đỉnh nhất từ trước đến nay
Tôi thấy kho xz đã được đưa trở lại GitHub, và Lasse cùng một contributor mới đang dọn dẹp. Họ đã loại bỏ hỗ trợ ifunc và commit mã tạo file test vào kho để có thể tạo file test mà không cần blob. Có vẻ họ đang làm theo hướng tốt