Tuần trước, tôi nhận được một tin nhắn từ một đồng nghiệp cũ – một developer đang tìm việc. Anh ấy kể rằng vừa hoàn thành một bài coding challenge cho một dự án Web3 danh tiếng, và mọi thứ có vẻ suôn sẻ. Tôi không trả lời ngay, nhưng trong đầu tôi đã thấy một dấu hiệu đỏ từ năm 2017, khi tôi phát hiện lỗi mint token trong hợp đồng thông minh của CryptoTulip. Lần này, tôi tự hỏi: liệu bài coding challenge đó có thực sự chỉ là một bài kiểm tra?
Sự thật, như báo cáo từ cơ quan quản lý Singapore xác nhận, đã vượt xa nỗi lo của tôi. Một chiến dịch lừa đảo tuyển dụng tinh vi đã khiến các nhà phát triển Web3 mất tổng cộng 11,8 triệu USD. Đây không phải là một cuộc tấn công vào smart contract. Đây là một cuộc tấn công vào con người, vào quy trình tuyển dụng từ xa, vào những thứ mà hầu hết các dự án vẫn coi là “niềm tin mặc định”.
Bối cảnh: Làn sóng tuyển dụng từ xa và lỗ hổng niềm tin
Web3 là ngành công nghiệp của sự phân tán, nhưng sự phân tán đó không bao giờ bao gồm quy trình tuyển dụng. Trong vài năm qua, các dự án Web3 đã đổ xô tuyển dụng lập trình viên từ khắp nơi trên thế giới. Các nền tảng như LinkedIn, CryptoJobs, và Discord đầy rẫy những lời mời làm việc hấp dẫn với mức lương cao, remote, và cơ hội làm việc với các giao thức hàng đầu. Quy trình phỏng vấn điển hình bao gồm một bài coding challenge – thường là một bài kiểm tra nhỏ được thực hiện trên máy tính cá nhân của ứng viên. Không có sandbox, không có máy ảo, không có kiểm tra bảo mật. Chỉ có một tệp ZIP hoặc một liên kết GitHub, và một lời hứa.
Đây chính là mảnh đất màu mỡ cho kẻ tấn công. Họ mạo danh các dự án uy tín, gửi cho ứng viên một bài coding challenge có chứa mã độc. Khi ứng viên chạy mã đó – vì đây là cách duy nhất để chứng minh kỹ năng – phần mềm độc hại sẽ âm thầm cài đặt, đánh cắp session token, và giành quyền truy cập vào kho mã nguồn của dự án mà ứng viên đang làm việc (hoặc các dự án khác mà ứng viên có quyền truy cập). Và như vậy, một kẻ tấn công không cần phải khai thác bất kỳ lỗ hổng nào trong mã nguồn chính; họ chỉ cần một developer đang tìm việc.
Phân tích kỹ thuật: Tại sao 11,8 triệu USD không phải là con số ngẫu nhiên
Khi tôi đọc báo cáo từ Singapore, tôi lập tức nhận ra đây không phải là một cuộc tấn công thông thường. Đây là một cuộc tấn công kết hợp giữa social engineering và supply chain poisoning, nhưng với một điểm nhấn đặc biệt: nó nhắm vào session token. Trong thế giới Web3, session token là chìa khóa vạn năng. Một khi kẻ tấn công có được token đó, họ có thể bypass MFA (multi-factor authentication) một cách dễ dàng – bởi vì token đã được xác thực từ trước. Họ không cần phải vượt qua lớp bảo vệ thứ hai; họ chỉ cần giả mạo người dùng hợp lệ.
Hãy để tôi chỉ ra một lỗ hổng cụ thể mà nhiều đội ngũ bỏ qua: hầu hết các kho mã nguồn Web3 sử dụng các token truy cập cá nhân (PAT) hoặc session cookie dài hạn. Khi một developer đăng nhập vào GitHub, GitLab, hoặc Bitbucket, token đó thường có hiệu lực trong nhiều giờ, thậm chí nhiều ngày. Nếu kẻ tấn công lấy được token này, chúng có thể truy cập vào tất cả các kho mà developer đó có quyền – bao gồm các kho chứa private key, deployment scripts, và thậm chí cả admin keys. Một khi chúng vào được kho chính, chúng có thể thực hiện nhiều hành động: chuyển tiền từ treasury, nâng cấp contract, hoặc cài backdoor vào các bản phát hành phần mềm. 11,8 triệu USD là con số đã được xác nhận, nhưng tôi tin rằng con số thực tế có thể cao hơn, bởi vì không phải tất cả các tổn thất đều được báo cáo ngay lập tức.
Dựa trên kinh nghiệm kiểm toán của tôi, tôi nhận thấy một điểm yếu lặp đi lặp lại: các dự án Web3 thường đầu tư rất nhiều vào audit smart contract, nhưng lại bỏ qua bảo mật của chính nhà phát triển. Họ thuê những người giỏi nhất, cấp cho họ quyền truy cập không giới hạn, và sau đó không kiểm soát được môi trường làm việc của họ. Một developer có thể đang làm việc trên một chiếc laptop không được bảo vệ, chạy các bài coding challenge từ các nguồn không xác định, và sử dụng cùng một token để truy cập vào cả kho mã nguồn lẫn tài khoản cá nhân. Điều này giống như việc giao chìa khóa két sắt cho một người lạ, nhưng lại yêu cầu họ phải mở cửa trước khi kiểm tra danh tính.
Góc nhìn phản trực giác: Kẻ tấn công đã làm đúng, và điều đó thật đáng sợ
Thông thường, khi một cuộc tấn công bị phát hiện, cộng đồng sẽ đổ lỗi cho nạn nhân vì thiếu cảnh giác. Nhưng ở đây, tôi muốn đưa ra một góc nhìn khác: kẻ tấn công đã thực hiện một cuộc tấn công gần như hoàn hảo về mặt chiến thuật. Chúng không khai thác lỗi zero-day, không cần phải brute-force, không cần phải social engineer từng người một. Chúng chỉ đơn giản là tận dụng một quy trình kinh doanh tiêu chuẩn – bài coding challenge – và biến nó thành vũ khí. Điều này cho thấy rằng, trong bối cảnh Web3 hiện tại, “con người” là điểm yếu lớn nhất, nhưng không phải theo nghĩa thông thường. Không phải developer thiếu hiểu biết về bảo mật; chính quy trình tuyển dụng đã tạo ra một lỗ hổng cố hữu.
Một điểm khác mà tôi muốn nhấn mạnh: các cuộc tấn công kiểu này có thể dễ dàng được mở rộng quy mô. Một khi kẻ tấn công có được một danh sách các developer đang tìm việc (dễ dàng thu thập từ LinkedIn), chúng có thể gửi hàng trăm bài coding challenge giả mạo mỗi ngày. Nếu chỉ 1% trong số đó thành công, chúng vẫn có thể kiểm soát hàng chục kho mã nguồn. 11,8 triệu USD chỉ là phần nổi của tảng băng. Tôi cá rằng trong vòng 6 tháng tới, chúng ta sẽ thấy nhiều vụ tương tự hơn, và các cơ quan quản lý sẽ buộc phải can thiệp.

Kết luận: Trách nhiệm thuộc về ai?
Sau tất cả, tôi không viết bài này để gây hoang mang. Tôi viết để kêu gọi một sự thay đổi có hệ thống. Nếu bạn là một dự án Web3 đang tuyển dụng, hãy tự hỏi: bạn có đang yêu cầu ứng viên chạy mã trên máy tính của họ không? Bạn có cung cấp một môi trường sandbox để họ làm việc không? Bạn có kiểm tra nguồn gốc của các bài coding challenge không? Nếu câu trả lời là không, thì bạn đang mời gọi thảm họa.
Còn đối với các developer, hãy nhớ: không có công việc nào đáng giá để bạn mất đi toàn bộ tài sản số. Hãy luôn chạy mã từ các nguồn không tin cậy trong một máy ảo hoặc container tạm thời. Và nếu một lời mời làm việc có vẻ quá tốt để trở thành sự thật, hãy kiểm tra kỹ danh tính của người tuyển dụng. Bởi vì trong thế giới Web3, một cuộc phỏng vấn có thể là cái bẫy đắt giá nhất mà bạn từng gặp.
Ghi chú kỹ thuật: Tôi đã từng chứng kiến một vụ tấn công tương tự vào năm 2021, khi một developer vô tình chạy một script từ một repository giả mạo và mất toàn bộ quyền kiểm soát multi-sig. Khi đó, tổn thất chỉ là 2 triệu USD, nhưng bài học thì vẫn còn nguyên giá trị. Hãy học từ lịch sử, trước khi lịch sử lặp lại với số tiền lớn hơn.
