- Một trường hợp tấn công social engineering khi một recruiter tiếp cận qua tin nhắn LinkedIn, lấy lý do tuyển lead engineer và yêu cầu review một kho GitHub công khai
- Trong đoạn mã được yêu cầu review có một backdoor ngụy trang thành test suite, còn yêu cầu "hãy kiểm tra vấn đề deprecated Node modules" là mồi nhử để dụ nạn nhân chạy
npm install - Khi cảm thấy nghi ngờ và kiểm tra mã bằng read-only agent trên một VPS dùng một lần thay vì máy local, tệp đáng ngờ bị phát hiện chỉ trong vài giây
- Cả commit của kho lẫn hồ sơ recruiter đều mạo danh danh tính của người có thật, lần lượt giả làm một lập trình viên thực và một nhà báo lĩnh vực nghệ thuật
- Bài học phòng thủ thực tế: sự nghi ngờ, security hygiene, và sử dụng read-only agent hiệu quả hơn cả việc tự đọc mã trực tiếp
Diễn biến tiếp cận
- Tuần trước, tác giả nhận được tin nhắn LinkedIn từ một recruiter của một startup crypto nhỏ
- Hai bên đã trao đổi vài lần trong nhiều ngày, và recruiter mô tả một proof-of-concept bị hỏng đang cần lead engineer
- Họ gửi một kho GitHub công khai để review và nhờ "kiểm tra vấn đề deprecated Node modules"
- Việc được nhờ review codebase vốn không hiếm, nhưng lần này tác giả cảm thấy có gì đó không ổn nên cảnh giác hơn
Cách kiểm tra
- Thay vì clone rồi cài dependency, tác giả tạo một VPS dùng một lần trên Hetzner và clone kho ở đó
- Đặt Pi ở chế độ chỉ đọc, chỉ bật các công cụ đọc tệp
- Lệnh sử dụng:
pi --tools read,grep,find,ls
- Lệnh sử dụng:
- Khi yêu cầu agent review codebase và đánh dấu các điểm đáng ngờ, nó gần như dừng lại ngay lập tức ở
app/test/index.js
Cấu trúc backdoor
- Kho có cấu trúc frontend React + backend Node
- Cái bẫy nằm trong
app/test/index.jsdài khoảng 250 dòng, được ngụy trang thành test suite - Bên trong, URL được chia nhỏ rồi ghép lại để che giấu
- Ghép các biến như protocol, domain, separator, path, token, subdomain để tạo thành
https://rest-icon-handler.store/icons/77
- Ghép các biến như protocol, domain, separator, path, token, subdomain để tạo thành
- Payload được giấu giữa các test dummy đã bị comment out, cho phép chạy bất cứ thứ gì server gửi về trên máy của người dùng
- Payload nằm ở dòng 225
Cơ chế kích hoạt
- Tệp này không chờ đến lúc chạy test
app/index.jsthực thiconst test = require('./test'), từ đó load và chạyapp/test/index.js
package.jsonnốiapp/index.jsvào giai đoạn khởi động- Mấu chốt là script
prepare, vì npm sẽ tự động chạypreparesaunpm install- Do đó, chỉ cần cài dependency là backdoor sẽ chạy
- Chỉ dẫn "kiểm tra deprecated Node modules" thực chất là mồi nhử để ép chạy
npm install - Tác giả có thể chạy payload trong sandbox để quan sát payload giai đoạn 2, nhưng đã dừng lại ngay khi có bằng chứng rằng nó thực thi mã do server gửi xuống
Danh tính bị mạo danh thứ nhất
- Các commit được ghi bằng tên và email của một full-stack developer có thật
- Người này có hồ sơ LinkedIn bình thường, website cá nhân và tài khoản GitHub với lịch sử lâu năm
- Tác giả giả vờ nói rằng mình vừa tiếp quản codebase rồi liên hệ với lập trình viên đó
- Người này trả lời rằng anh chưa từng làm cho công ty đó, trước đây cũng từng bị mạo danh trên GitHub và có repository bị gỡ xuống, đồng thời khẳng định không liên quan đến kho này
- Anh cũng cho biết bản thân đang báo cáo các kho kiểu này
- Toàn bộ lịch sử 39 commit đều đứng tên một lập trình viên chưa từng chạm vào repository đó
Danh tính bị mạo danh thứ hai
- Hồ sơ recruiter thực chất thuộc về một nhà báo nghệ thuật có thật, chỉ có kinh nghiệm trong lĩnh vực văn hóa và không có yếu tố kỹ thuật nào
- Khi tác giả trả lời rằng không cài được, người vốn là nhà báo phi kỹ thuật này lập tức biến thành chuyên gia npm và phiên bản Node, gây áp lực để chạy
npm install
Điều này có thể xảy ra với bất kỳ ai
- Tác giả từng nghe về kiểu tấn công này và cũng từng đọc trên HN, nhưng khi chính mình trở thành mục tiêu thì vẫn hơi bị bất ngờ
- Ngay từ tin nhắn đầu tiên đã thấy nghi ngờ, nhưng nếu rơi vào một ngày mệt mỏi hoặc đang vội, rất có thể tác giả đã chạy
npm installtrước khi suy nghĩ kỹ
- Ngay từ tin nhắn đầu tiên đã thấy nghi ngờ, nhưng nếu rơi vào một ngày mệt mỏi hoặc đang vội, rất có thể tác giả đã chạy
- Những tin nhắn LinkedIn kèm lời nhờ review repository cần được tiếp cận với một chút cảnh giác và security hygiene
- Việc review code bằng read-only agent hiệu quả hơn so với tự đọc trực tiếp
- Backdoor được ngụy trang như một đoạn mã non tay vụng về, nhưng agent phát hiện chỉ trong vài giây
- Tác giả đã báo cáo repository với GitHub và recruiter với LinkedIn, nhưng đến nay vẫn chưa có thay đổi gì và đoạn mã vẫn đang được công khai
1 bình luận
Ý kiến trên Hacker News
Một recruiter từ startup tiền mã hóa nhỏ đã gửi một kho GitHub công khai, nói rằng hãy xem giúp một kho proof-of-concept bị lỗi và kiểm tra “deprecated Node modules issue”, nhưng hóa ra đó là một màn lừa đảo dụ chạy npm install
script
preparetự động chạy saunpm install, trở thành backdoor thực thi mã tùy ý do máy chủ trả về trên máy cục bộ, và việc có thể bị kiểu phishing này trên LinkedIn nghe nghiêm trọng đến mức đáng báo động$company, và chỉ cần ghi trong hồ sơ là họ sẽ xuất hiện trên trang công ty chính thứcCông ty chúng tôi cũng từng có các recruiter giả làm trò lừa đảo y hệt, với hồ sơ giả khá thuyết phục, thậm chí có cả nhiều bài viết liên quan trên LinkedIn Premium, nhưng họ không phải nhân viên thật
Báo cáo bao nhiêu cũng không bị gỡ, cuối cùng phải mua rượu mời một người quen đang làm ở LinkedIn mới xử lý được, nhưng đâu phải startup nào cũng có mối quan hệ như thế
Nhìn cảnh người ta cứ liên tục bị dính đòn như bây giờ, thật khó hiểu khi không dùng công cụ như PNPM và chặn cái lỗ hổng hiển nhiên, bị lạm dụng thường xuyên nhất là thực thi mã tùy ý ngay trong quá trình tải mã xuống
Những công cụ tự chạy mã tùy ý ngay lúc bạn chỉ định tải code về thì đến lúc phải dừng lại rồi
Lần gần nhất tôi nhớ là tải về thứ được ngụy trang thành file screensaver Windows
.scr, còn việc nó xuất hiện trên LinkedIn là một bước còn tệ hơnNền tảng có lẽ sẽ không mấy quan tâm vì nhìn bề ngoài nó giống như “tăng trưởng việc làm”, khá giống cách các mạng quảng cáo như Google hay Meta cũng không quá để tâm đến quảng cáo lừa đảo
bullshitpowershellladendoucument.pdf.docx, nhưng gửi thẳng qua LinkedIn DM thì đúng là chiến thuật khá liều lĩnhĐây rõ ràng là tội phạm, vậy mà tôi không hiểu vì sao lại không có một đầu mối nổi tiếng kiểu 911 dành cho tội phạm mạng để báo cáo và nhận trợ giúp
Xã hội cần nhanh chóng bắt kịp các rủi ro thực tế và xây dựng mạng lưới hỗ trợ, vì tội phạm có tổ chức cần được đối phó bằng phòng vệ có tổ chức
Có lẽ bạn sẽ không nhận được phản hồi, nhưng với công dân Mỹ, và có khi là với bất kỳ ai, theo tôi biết đây là nơi gần nhất với một internet 911
Vấn đề thứ hai là sự bất đối xứng: công sức để tạo ra mấy trò lừa đảo này gần như bằng 0, nhưng để bắt và truy tố thì cần nỗ lực rất lớn và chi phí khổng lồ
Nó ở vị trí tương tự những cuộc gọi lừa đảo nhắm vào người già bằng cách giả làm bộ phận hỗ trợ Microsoft, và gần như không thể bắt được nghi phạm
Hoặc là chúng che giấu dấu vết rất giỏi, hoặc thường hơn là chúng sống ở những quốc gia mà chính quyền không quan tâm, thậm chí còn dung túng việc lừa người phương Tây
Bạn có thể báo án nhưng khả năng cao sẽ không được giúp đỡ hay liên hệ lại
Giờ chuyện này đáng lo đến mức gần giống một bài tập phỏng vấn bình thường
Tình huống ai đó gửi kho mã, nói phần cài đặt bị lỗi và nhờ xem giúp là hoàn toàn tự nhiên, và nhiều lập trình viên nếu đang mệt hoặc đang tìm việc có thể chạy
npm installtrước khi kịp suy nghĩ sâu hơnBạn không muốn trông có vẻ chậm chạp, nên sẽ bỏ qua cả bước hỏi xem ngay từ đầu có nên chạy nó hay không
“Kho mã đã được báo cho GitHub, recruiter đã được báo cho LinkedIn nhưng vẫn chưa có gì thay đổi và đoạn mã kia vẫn còn trên đó”, à, Microsoft
Nó dẫn tới một video giả về việc thủ tướng Canada công bố kế hoạch đầu tư tiền mã hóa cho mọi công dân Canada, còn có cả liên kết đăng ký, vậy mà khi tôi báo cáo thì họ trả lời rằng sau khi điều tra, họ không thấy vi phạm chính sách nào
Cả ba đều có vấn đề về bảo mật hoặc độ tin cậy, và Microsoft càng lún sâu vào AI thì trông càng không khá lên mà còn tệ hơn
Tôi thật sự không biết cái năng suất AI nội bộ của công ty, thứ có người nói là gấp 10 lần, đang đi về đâu
Khi đó chắc đã bị gỡ ngay
Có vẻ chúng đang dùng cùng một domain cho nhiều mục tiêu
Có một chủ đề Reddit tương tự từ 3 tháng trước: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...
Tôi không hiểu vì sao đến giờ mọi hệ điều hành trên thế giới vẫn chưa chặn npm
Đám này có vẻ sẽ chẳng bao giờ chịu học
Mấy trò lừa đảo kiểu này có thể làm bằng nhiều công nghệ khác nhau, thậm chí dùng cả Makefile cũng được
Tôi chỉ mong cuối cùng Mac sẽ có một framework ảo hóa thực sự tử tế
Cái thời tải script ngẫu nhiên từ internet mà không có bảo vệ gì như năm 1995 giờ thật sự quá mệt rồi
Khi gặp người lạ và đưa đồ của họ vào sâu trong máy tính của mình, đừng quên mang đồ bảo hộ
curl | bashngẫu nhiên từ GitHub, AUR, NPM cũng tệ y như vậy, nhưng nhiều lập trình viên ở đây vẫn có những giả định đáng ngờ về thói quen xấu nàyMột loạt vụ việc nhỏ kiểu Shai-Hulud trong vài tuần gần đây cho thấy điều đó tệ đến mức nào
Có thể cấu hình trong IntelliJ để chạy các lệnh npm bên trong container Docker
Những lời mời việc tôi nhận được trên LinkedIn đều rất đáng ngờ
Toàn kiểu bắt ứng tuyển qua nền tảng riêng, ghi hình video tự giới thiệu, hoặc làm bài kiểm tra code để hiệu chỉnh nằm sau một nền tảng chấm bài
Họ bảo viết séc đặt cọc cho laptop công ty; nhìn qua cũng đã vô lý, nhưng vì thất nghiệp lâu nên rất tuyệt vọng và thực sự vui mừng vì nghĩ rằng cuối cùng cũng tìm được việc
Người thất nghiệp dài hạn đôi khi tuyệt vọng đến mức bỏ qua cả những dấu hiệu cảnh báo nghiêm trọng mà người đang có việc muốn chuyển việc, hoặc người có đủ tiền tiết kiệm, sẽ không bao giờ mắc phải
Chẳng phải dạo này phần lớn tác giả gói NPM đều bị hack theo kiểu này sao?
Người phụ trách axios hình như cũng bị dính cùng một cách tiếp cận qua LinkedIn
Tôi chỉ dùng LinkedIn vì tin tuyển dụng, nhưng mấy tháng gần đây số lượng tin rác đã tăng quá nhiều
Có vô số tin từ những công ty tương tự Ladders, Swooped, và có lẽ đã đến lúc bỏ hẳn LinkedIn