-
09/04/2020
-
107
-
942 bài viết
Chỉ 2 dòng mã độc: Đánh sập niềm tin của cộng đồng lập trình qua một pull request vô tội vạ
Một pull request tưởng như vô hại, mang tên “Modernize codebase…” đã âm thầm biến tiện ích ETHcode - công cụ hỗ trợ lập trình Ethereum trên VS Code thành công cụ phát tán mã độc. Không cần kỹ thuật cao siêu, kẻ tấn công chỉ cần hai dòng mã được chèn khéo léo vào dự án mã nguồn mở, qua mặt cả người kiểm duyệt lẫn AI. Bạn sắp bước vào câu chuyện của một cuộc tấn công chuỗi cung ứng phần mềm - nơi mọi thứ bắt đầu chỉ bằng... 2 dòng code.
ETHcode vốn là một công cụ được duy trì bởi tổ chức nhỏ có tên 7finney và từng được hàng ngàn nhà phát triển Ethereum tin dùng (gần 6000 lượt cài đặt). Dự án này gần như đã ngủ quên hơn nửa năm, nên lời đề nghị cập nhật đến từ một “người lạ” như Airez299 khiến nhóm phát triển khá hào hứng. Pull request đó được kiểm tra bởi một thành viên trong nhóm và thậm chí qua cả công cụ AI Copilot.
Giao diện tiện ích mở rộng hiển thị trên Marketplace
Kết luận? Mọi thứ trông rất ổn áp.
Không ai hay biết, chỉ 2 dòng mã trong 4000 dòng thay đổi ấy lại là “con dao hai lưỡi”, biến ETHcode từ một công cụ đáng tin cậy thành cửa ngõ cho mã độc xâm nhập.
Các bình luận trong pull request trên GitHub
Một thư viện phụ trợ độc hại được thêm vào, được gọi thực thi bằng require(),
kích hoạt mã JavaScript đã bị mã hóa và thực thi hành vi độc hại sau khi giải mã.
Thoạt nhìn, keythereum-utils giống như một thư viện phụ trợ hợp pháp, mở rộng chức năng cho gói keythereum gốc. Tên gọi được đặt khéo léo nhằm tránh bị nghi ngờ. Đây là một chiêu thức phổ biến trong các cuộc tấn công giả dạng tên thư viện (typosquatting, tức đặt tên gần giống thư viện thật để đánh lừa người dùng) hoặc lẫn lộn phụ thuộc (dependency confusion, tức lợi dụng sự không đồng nhất giữa gói nội bộ và gói công khai để chèn mã độc).
Tuy nhiên, khi nhóm nghiên cứu của ReversingLabs tiến hành phân tích sâu, họ phát hiện mã nguồn bên trong thư viện đã bị mã hóa khó đọc (obfuscate) ở mức độ cao. Đây là một dấu hiệu thường thấy trong các chiến dịch chèn mã độc tinh vi, nhằm che giấu hành vi thực sự và làm chậm quá trình điều tra.
Sau khi giải mã (deobfuscate), hành vi nguy hiểm dần lộ rõ: thư viện này âm thầm khởi chạy một tiến trình PowerShell ẩn, kết nối đến một dịch vụ lưu trữ công khai và tải xuống một tập lệnh batch rồi lặng lẽ thực thi, hoàn toàn không cần bất kỳ sự đồng ý hay nhận biết nào từ phía người dùng.
Rất may, nhóm phân tích tại ReversingLabs đã phát hiện và gửi cảnh báo đến Microsoft vào ngày 26/6/2025, ETHcode lập tức bị gỡ khỏi Visual Studio Marketplace. Sau đó, bản vá phiên bản 0.5.1 cũng được phát hành vào ngày 1/7/2025, loại bỏ hoàn toàn đoạn mã độc hại.
Điều đáng nói là: kẻ tấn công không cần dùng đến kỹ thuật cao siêu hay phần mềm khai thác đặc biệt. Chúng chỉ tận dụng sự lỏng lẻo trong quy trình đánh giá mã nguồn, sự tin tưởng mặc định với các tiện ích quen thuộc và tâm lý chủ quan của cả cộng đồng phát triển.
Cuộc tấn công này là một ví dụ điển hình của tấn công chuỗi cung ứng phần mềm, tương đồng với những sự kiện lớn như SolarWinds hay XZ Utils nhưng âm thầm, tinh vi và dễ bị thờ ơ hơn.
Các lập trình viên và nhóm phát triển cần ghi nhớ:
Chỉ 2 dòng mã tưởng chừng vô hại lại có thể mở ra cả một cánh cổng cho hacker xâm nhập vào hệ thống của hàng ngàn lập trình viên trên toàn thế giới. Vậy, bạn đã kiểm tra pull request gần đây của mình kỹ đến mức nào?
Theo Báo cáo của Reversinglabs
Bắt đầu từ một lời đề nghị "tốt bụng"
Vào một ngày đẹp trời giữa tháng 6/2025, xuất hiện thành viên mới trên GitHub có tên Airez299. Anh ta gửi đến kho mã nguồn của dự án ETHcode - tiện ích mở rộng nổi tiếng trên Visual Studio Code (VS Code) được dùng để phát triển hợp đồng thông minh Ethereum một pull request với nội dung đầy thiện chí: “Hiện đại hóa mã nguồn, tích hợp Viem và framework kiểm thử”.ETHcode vốn là một công cụ được duy trì bởi tổ chức nhỏ có tên 7finney và từng được hàng ngàn nhà phát triển Ethereum tin dùng (gần 6000 lượt cài đặt). Dự án này gần như đã ngủ quên hơn nửa năm, nên lời đề nghị cập nhật đến từ một “người lạ” như Airez299 khiến nhóm phát triển khá hào hứng. Pull request đó được kiểm tra bởi một thành viên trong nhóm và thậm chí qua cả công cụ AI Copilot.
Giao diện tiện ích mở rộng hiển thị trên Marketplace
Kết luận? Mọi thứ trông rất ổn áp.
Không ai hay biết, chỉ 2 dòng mã trong 4000 dòng thay đổi ấy lại là “con dao hai lưỡi”, biến ETHcode từ một công cụ đáng tin cậy thành cửa ngõ cho mã độc xâm nhập.
Các bình luận trong pull request trên GitHub
Giả dạng thư viện: Kịch bản quen thuộc nhưng hiểm hóc
Điều gì khiến 2 dòng mã đó trở nên nguy hiểm đến vậy?
- Dòng đầu tiên âm thầm thêm một thư viện phụ trợ mới tên keythereum-utils.
- Dòng thứ hai sử dụng require() của Node.js để thực thi thư viện này.
Một thư viện phụ trợ độc hại được thêm vào, được gọi thực thi bằng require(),
kích hoạt mã JavaScript đã bị mã hóa và thực thi hành vi độc hại sau khi giải mã.
Tuy nhiên, khi nhóm nghiên cứu của ReversingLabs tiến hành phân tích sâu, họ phát hiện mã nguồn bên trong thư viện đã bị mã hóa khó đọc (obfuscate) ở mức độ cao. Đây là một dấu hiệu thường thấy trong các chiến dịch chèn mã độc tinh vi, nhằm che giấu hành vi thực sự và làm chậm quá trình điều tra.
Sau khi giải mã (deobfuscate), hành vi nguy hiểm dần lộ rõ: thư viện này âm thầm khởi chạy một tiến trình PowerShell ẩn, kết nối đến một dịch vụ lưu trữ công khai và tải xuống một tập lệnh batch rồi lặng lẽ thực thi, hoàn toàn không cần bất kỳ sự đồng ý hay nhận biết nào từ phía người dùng.
Mục tiêu cuối cùng của mã độc là gì?
Hiện nhóm phân tích của ReversingLabs vẫn đang tiếp tục điều tra payload giai đoạn hai (second-stage payload) thành phần được tải về và thực thi sau khi mã độc được kích hoạt. Tuy chưa xác định đầy đủ hành vi cuối cùng, nhưng dựa trên mục tiêu tấn công là một tiện ích phát triển hợp đồng thông minh Ethereum, có thể đưa ra một số giả định hợp lý:- Chiếm đoạt tài sản số: Mã độc có thể tìm cách truy cập vào các ví tiền mã hóa (crypto wallets) được lưu trữ cục bộ, đánh cắp khóa riêng hoặc dữ liệu xác thực.
- Can thiệp vào quy trình phát triển hợp đồng thông minh: Kẻ tấn công có thể cấy mã độc vào các hợp đồng đang được viết hoặc triển khai, nhằm tạo cửa hậu (backdoor) hoặc thay đổi hành vi vận hành của các dApp (ứng dụng phi tập trung).
Bắt bài kẻ tấn công
Tài khoản GitHub mang tên Airez299 được tạo ra ngay trong ngày gửi pull request. Không lịch sử hoạt động, không repository nào khác, không tương tác với cộng đồng. Tất cả cho thấy đây là một tài khoản ảo được tạo ra với mục đích duy nhất: chèn mã độc vào ETHcode rồi biến mất trong im lặng.Rất may, nhóm phân tích tại ReversingLabs đã phát hiện và gửi cảnh báo đến Microsoft vào ngày 26/6/2025, ETHcode lập tức bị gỡ khỏi Visual Studio Marketplace. Sau đó, bản vá phiên bản 0.5.1 cũng được phát hành vào ngày 1/7/2025, loại bỏ hoàn toàn đoạn mã độc hại.
Điều đáng nói là: kẻ tấn công không cần dùng đến kỹ thuật cao siêu hay phần mềm khai thác đặc biệt. Chúng chỉ tận dụng sự lỏng lẻo trong quy trình đánh giá mã nguồn, sự tin tưởng mặc định với các tiện ích quen thuộc và tâm lý chủ quan của cả cộng đồng phát triển.
Cuộc tấn công này là một ví dụ điển hình của tấn công chuỗi cung ứng phần mềm, tương đồng với những sự kiện lớn như SolarWinds hay XZ Utils nhưng âm thầm, tinh vi và dễ bị thờ ơ hơn.
Các lập trình viên và nhóm phát triển cần ghi nhớ:
- Thẩm định người gửi pull request: Luôn kiểm tra kỹ hồ sơ GitHub của contributor. Những tài khoản mới tạo, không có lịch sử hoạt động rõ ràng là tín hiệu cảnh báo có rủi ro.
- Rà soát kỹ file package.json: Đây là nơi thể hiện toàn bộ phụ thuộc của dự án. Mọi dependency mới được thêm vào dù có tên quen thuộc đến đâu đều cần được đánh giá cẩn trọng.
- Sử dụng công cụ giám sát mã nguồn: Các nền tảng như Spectra Assure có thể giúp phát hiện nhanh sự khác biệt giữa các phiên bản, nhận diện hành vi bất thường và cảnh báo sớm trước khi mã độc đi vào vòng triển khai.
Chỉ 2 dòng mã tưởng chừng vô hại lại có thể mở ra cả một cánh cổng cho hacker xâm nhập vào hệ thống của hàng ngàn lập trình viên trên toàn thế giới. Vậy, bạn đã kiểm tra pull request gần đây của mình kỹ đến mức nào?
Theo Báo cáo của Reversinglabs
Chỉnh sửa lần cuối: