2 điểm bởi GN⁺ 4 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 Pichế độ chỉ đọc, chỉ bật các công cụ đọc tệp
    • Lệnh sử dụng: pi --tools read,grep,find,ls
  • 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.js dà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
  • 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.js thực thi const test = require('./test'), từ đó load và chạy app/test/index.js
  • package.json nối app/index.js vào giai đoạn khởi động
  • Mấu chốt là script prepare, vì npm sẽ tự động chạy prepare sau npm 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 install trước khi suy nghĩ kỹ
  • 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 prepare tự động chạy sau npm 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

    • LinkedIn không cung cấp cách nào để công ty bác bỏ những người dùng tự nhận đang làm ở $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ức
      Cô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ế
    • Nếu là bạn bè thì đừng để bạn mình dùng NPM
      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
    • Cách này đặc biệt là chiêu trò đã được kiểm chứng trên Upwork thời bùng nổ crypto/NFT giai đoạn 2021~2022, và từ một thời điểm nào đó đã lan rộng khỏi các dự án tiền mã hóa sang nhiều nhóm khác
      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ơn
      Nề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
    • Tôi từng gặp kiểu phishing cố moi email rồi gửi mấy thứ như bullshitpowershellladendoucument.pdf.docx, nhưng gửi thẳng qua LinkedIn DM thì đúng là chiến thuật khá liều lĩnh
    • Gần đây đi phỏng vấn nhiều nên tôi cũng gặp vài kẻ lừa đảo rất lộ liễu, và tôi chỉ mong không phải vì trông tôi ngu đến mức dễ bị lừa, mà là vì loại lừa đảo này giờ đã phổ biến hơn
  • Đâ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

    • Đáng buồn là tội phạm mạng độc hại đã biết một mẹo kỳ lạ: “phạm tội từ những quốc gia không quan tâm đến tội phạm”
    • https://www.ic3.gov
      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 đề cốt lõi là không có một 911 toàn cầu dùng được trên phạm vi toàn thế giới
      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ói một cách cay đắng thì, trên cái cây của những điều tệ hại con người gây ra cho nhau, chuyện này nằm ở một cành khá cao và khó với tới
      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
    • FBI cũng có IC3, nhưng năng lực xử lý tội phạm mạng rất tệ và thực tế gần như vô dụng
      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 install trước khi kịp suy nghĩ sâu hơn

    • Trong bối cảnh phỏng vấn thì còn tệ hơn
      Bạ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

    • Tôi từng thấy quảng cáo trên LinkedIn giả làm CBC News Canada
      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
    • Không thấy lạ sao? Microsoft sở hữu cả LinkedIn, GitHub, NPM
      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
    • Lẽ ra nên báo cáo theo diện vi phạm DMCA
      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

    • Chuyện này không liên quan riêng đến npm
      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ộ

    • Chạy các script curl | bash ngẫ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ày
      Mộ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
    • Trên Mac đã có cách khá ổn rồi
      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

    • Anh/em tôi đã thất nghiệp lâu vì bệnh, rồi nhận được một “lời mời việc” trông khá thuyết phục trên LinkedIn
      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

    • Đúng kiểu tự vấp bẫy do chính mình tạo ra
  • 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