4.224 hợp đồng thông minh. 5.742 địa chỉ ví. Gần 3,5 triệu USD bốc hơi. Tất cả chỉ vì một dòng chữ nhỏ trên giao diện: "Estimated balance change: +0.001 ETH". Bạn bấm Confirm, bạn mất hết.
Đầu năm 2025, một nhà giao dịch trên Telegram khoe rằng anh ta vừa nhận được một khoản airdrop bất ngờ. Chỉ cần gọi hàm Claim(), ví hiển thị lãi 10 ETH. Mười phút sau, số dư của anh ta về 0. Anh ta không bị hack. Anh ta tự tay gửi toàn bộ tài sản cho kẻ lừa đảo. Câu chuyện của anh ta không phải cá biệt. Nó đã diễn ra ít nhất 5.742 lần, trên bốn blockchain khác nhau.
Nghiên cứu đăng trên arXiv ngày 30/7 vừa phơi bày một kỹ thuật tấn công khiến các công cụ mô phỏng giao dịch bên trong ví điện tử trở thành chỗ dựa cho kẻ trộm. Các tác giả đã phát triển SimGuard, một trình phát hiện dựa trên bytecode hợp đồng, và tìm thấy 4.224 hợp đồng phishing Ethereum, BNB Smart Chain, Avalanche và Polygon. Họ liên kết chúng với 6.223 giao dịch nạn nhân, nhưng gọi con số thiệt hại 3,48 triệu USD chỉ là giới hạn trên, bởi vì một phần hoạt động thử nghiệm của kẻ tấn công có thể bị xếp nhầm vào dữ liệu nạn nhân. Quan trọng hơn: 91,5% tổn thất nằm trên Ethereum, và khoảng 83% số tiền bị rút từ một nhóm tấn công duy nhất.
Đây không phải một đợt tấn công mới. Đây là lịch sử. Và nó vẫn đang được tái diễn trong bóng tối.
Mô phỏng giao dịch: một buổi diễn tập có thể bị đạo diễn ngược
Transaction simulation là gì? Trước khi bạn ký một giao dịch, ví sẽ gọi một hàm mô phỏng, thường là eth_call, với trạng thái blockchain hiện tại. Nó trả về một kết quả giả lập: bạn sẽ nhận được bao nhiêu, mất bao nhiêu, token nào sẽ đổi chủ. Công cụ này được sinh ra để bảo vệ người dùng khỏi những giao dịch mù. Nhưng các hợp đồng mà SimGuard tìm thấy được lập trình để diễn hai kịch bản riêng biệt: một kịch bản cho buổi diễn tập, một kịch bản cho buổi công diễn.
Hợp đồng chứa các nhánh rẽ có điều kiện. Khi mô phỏng, nó trả về đúng kết quả mà người dùng mong đợi: tiền gốc trở về kèm một chút lãi. Nhưng khi giao dịch được đưa vào block, điều kiện bị thay đổi, và hợp đồng chuyển toàn bộ số dư đến địa chỉ của kẻ tấn công. Có ba biến thể chính, và mỗi biến thể đều đánh vào một điểm mù khác nhau trong thiết kế ví.
Biến thể đầu tiên là storage-control. Kẻ tấn công có thể gọi một hàm riêng để thêm địa chỉ nạn nhân vào danh sách đen, ngay trước khi giao dịch của nạn nhân được khai thác. Lúc mô phỏng, hợp đồng thấy địa chỉ sạch, nên kích hoạt nhánh "trả tiền gốc + lãi". Lúc thực thi, hợp đồng thấy địa chỉ nằm trong blacklist, nên kích hoạt nhánh "chuyển tiền cho attacker". Giao dịch vẫn thành công. Ví vẫn báo mức phí như bình thường. Nhưng số tiền đã đi về một nơi khác.
Biến thể thứ hai là timestamp-based. Kẻ tấn công đặt điều kiện kiểu: nếu block.timestamp lớn hơn một mốc X, hãy chuyển tiền cho attacker; còn lại, hãy trả tiền gốc. Khi bạn mô phỏng, timestamp là thời điểm hiện tại, thường nhỏ hơn X, nên kết quả hiển thị là có lãi. Giao dịch của bạn được đưa vào block sau, với timestamp lớn hơn X. Lúc đó, nhánh chuyển tiền cho attacker được kích hoạt. Không cần thêm bất kỳ tương tác nào. Chỉ cần thời gian trôi qua.
Biến thể thứ ba là gas-control. Hợp đồng dùng hàm gasleft() để quyết định luồng thực thi. Khi ví mô phỏng giao dịch, nó thường dùng một gas limit do công cụ ước tính. Nhưng khi giao dịch thật được gửi, gas limit có thể khác, do người dùng tùy chỉnh hoặc do ứng dụng đặt. Nếu gasleft() vượt ngưỡng, thực thi nhánh an toàn. Nếu thấp hơn, thực thi nhánh chuyển tiền. Loại này không cần thay đổi storage, không cần chờ block tương lai. Chỉ cần một chút lệch gas là kết quả hoàn toàn khác.
Trong một thử nghiệm có kiểm soát, nhóm nghiên cứu gửi số dư của một tài khoản vào một hợp đồng trả về 1 wei — đơn vị nhỏ nhất của ETH. Kết quả: một số công cụ mô phỏng phổ biến vẫn hiển thị con số dương. Hầu hết đều không hiển thị rõ tổng số tiền rời khỏi ví. Bạn nhìn thấy lãi. Nhưng thực tế là lỗ hoàn toàn.
Bỏ qua thanh khoản là tự sát. Trong bối cảnh này, thanh khoản của chính ví bạn đang bị rút đi một cách hợp pháp, bởi chính bạn.
Tôi đã audit nhiều hợp đồng thông minh trong mười năm qua. Tôi từng đọc white paper đến mức thuộc lòng, rồi mất 80% danh mục vì không quan sát hành vi on-chain. Tôi biết rằng một bài báo khoa học chưa được bình duyệt chỉ nên dùng làm tín hiệu, không nên dùng làm chân lý. Nhưng khi tôi truy vết giao dịch 143,45 ETH ngày 8/1/2025 được trích dẫn trong nghiên cứu, tôi thấy một lời gọi Claim() chuyển tiền qua một hợp đồng bị Etherscan dán nhãn phishing. Dữ liệu trên chuỗi xác nhận dòng tiền đi. Nó không thể cho tôi biết nạn nhân nhìn thấy gì trên màn hình lúc đó. Nhưng nó cho thấy một điều: giao dịch trông hợp lý, trông giống một khoản nhận, nhưng thực chất là một khoản mất.
Hãy tôi nói rõ hơn. Vấn đề không phải là hợp đồng thông minh có lỗ hổng. Hợp đồng hoạt động chính xác như những gì code mô tả. Vấn đề là môi trường mô phỏng không thể nắm bắt hết các trạng thái tương lai. Nó giống như bạn nhìn một bức ảnh chụp một người đang mỉm cười, rồi tin rằng người đó luôn hạnh phúc. Bức ảnh chỉ là một khoảnh khắc. Giao dịch của bạn sẽ nằm trong một khoảnh khắc khác.
Nghiên cứu này càng đáng ngại hơn khi đặt trong bối cảnh thị trường đi ngang. Khi giá không tăng cũng không giảm, người dùng có xu hướng chủ quan. Họ nghĩ rằng không có cơn sốt, không có hoảng loạn, thì không có lừa đảo. Sai lầm ngớ ngẩn. Kẻ tấn công hoạt động ngày càng chuyên nghiệp. Chúng không cần bull run. Chúng cần sự mất tập trung của bạn.
Các con số trong nghiên cứu cũng cần được nhìn nhận cẩn trọng. Bài báo chưa được bình duyệt. Số lượng hợp đồng trên Avalanche được nhắc đến không nhất quán giữa các phần. Khoảng thời gian quan sát cũng có mâu thuẫn. Các tác giả không xác định được phiên bản ví, cài đặt, hay backend mô phỏng mà nạn nhân sử dụng. Do đó, không thể chắc chắn rằng những ví phổ biến nhất hiện nay vẫn dễ bị tấn công như thời điểm dữ liệu được thu thập. Nhưng điều đó không làm giảm giá trị của cảnh báo. Vì kẻ tấn công không ngừng thích nghi. Ngay khi ví vá một kiểu tấn công, chúng sẽ tìm ra kiểu khác.
Có một sự mỉa mai đáng chú ý: nhóm nghiên cứu đã dùng AI để tạo ra 30 trong số 44 hợp đồng phục vụ việc đánh giá. Điều đó cho thấy AI có thể tạo ra những cái bẫy tinh vi chỉ trong vài phút. Vậy ai sẽ thắng trong cuộc chạy đua giữa AI tạo bẫy và AI phát hiện bẫy? Tôi không biết. Nhưng tôi biết rằng người dùng bình thường, với một chiếc ví miễn phí và một chút tự tin thái quá, sẽ là người trả giá.
Một góc nhìn khác: đừng đổ lỗi cho công cụ, hãy nhìn vào tâm lý của chính mình
Nhiều người sẽ nhận xét rằng đây là lỗi của ví. Ví hiển thị thông tin sai lệch. Ví nên chặn giao dịch. Ví nên có thêm cảnh báo. Nhưng tôi cho rằng cách nhìn đó trốn tránh vấn đề cốt lõi.
Ví chỉ là một chiếc kính hiển vi. Nếu bạn không biết cách nhìn, chiếc kính không cứu được bạn. Những kẻ tấn công này không khai thác lỗ hổng trong mã nguồn ví. Chúng khai thác lỗ hổng trong nhận thức. Chúng biết rằng con người có xu hướng tin vào các con số được hiển thị có chủ đích. Một con số dương nhỏ, hiển thị ngay cạnh nút màu xanh "Confirm", đủ để xóa tan mọi nghi ngờ. Chúng đánh vào lòng tham.
Và lòng tham thì không có phiên bản vá. Bạn có thể nâng cấp ví, cập nhật phần mềm, sử dụng danh sách đen. Nhưng nếu bạn vẫn nghĩ rằng một giao dịch hiển thị "lãi 0,01 ETH" thì đáng để ký, bạn vẫn sẽ bị lừa, bởi một hợp đồng khác, vào một ngày khác.
Hãy đặt câu hỏi ngược: tại sao bạn lại cần mô phỏng giao dịch? Bởi vì bạn không hiểu điều gì đang thực sự xảy ra. Một người dùng thành thạo sẽ nhìn vào mã nguồn, nhìn vào địa chỉ hợp đồng, nhìn vào dòng tiền trên block explorer. Họ không cần một màn hình xanh báo lãi. Họ tự đọc dữ liệu. Còn bạn, nếu chỉ dựa vào mô phỏng, bạn đang giao phó an toàn cho một công cụ có thể bị lừa. Điểm mù nằm ở chỗ bạn tin rằng công cụ hoạt động trong cùng một thế giới với giao dịch thực. Nhưng chúng không ở cùng thời điểm, cùng trạng thái, cùng gas.
Tôi thường nói với các học viên của mình: "AMM cơ bản, nhưng 90% trader không hiểu." Giờ tôi phải mở rộng thêm: mô phỏng giao dịch cũng cơ bản, nhưng 99% người dùng không hiểu rằng nó không bao giờ đảm bảo kết quả cuối cùng. Một công cụ mô phỏng được sinh ra để giảm thiểu rủi ro, nhưng nó cũng tạo ra một loại rủi ro mới: sự tự tin giả tạo.
Hãy nhìn vào câu chuyện Etherscan ngày 8/1/2025. Một giao dịch Claim() chuyển 143,45 ETH. Kẻ tấn công thậm chí không cần phức tạp. Chỉ cần một cái tên hàm quen thuộc, một địa chỉ trông có vẻ uy tín, và một kết quả mô phỏng dương. Đủ để nạn nhân ký. Đủ để mất trắng.
Các tác giả của nghiên cứu đưa ra khuyến nghị rất cụ thể. Hãy chạy lại mô phỏng khi contract state hoặc gas fields thay đổi. Hãy dùng chính xác gas limit và gas price trong yêu cầu giao dịch thực. Hãy kiểm tra với các giá trị block-number và timestamp trong tương lai. Và đặc biệt: giao diện ví nên hiển thị tổng số tiền rời khỏi ví, thay vì chỉ số dư ròng. Nếu người dùng thấy "sẽ có 10 ETH rời khỏi ví" và "sẽ nhận về 0,000000000000000001 ETH", chắc chắn họ sẽ không nhấn nút. Nhưng khi chỉ thấy "+0,001 ETH", họ nghĩ đó là lãi.
Đó là lý do tại sao tôi luôn khuyên mọi người hãy tự viết một vài dòng mã để hiểu cảm giác khi đối diện với một hàm transfer. Không cần phải là lập trình viên blockchain. Chỉ cần đủ để hiểu rằng blockchain không có khái niệm "hoàn tiền" mà không có lý do. Nếu một hợp đồng trả lại cho bạn tiền, hãy tìm hiểu vì sao. Nếu không tìm ra lý do, đừng ký.
Con số 3,48 triệu USD có thể là phần nổi, nhưng vấn đề nằm ở kiến trúc
Chúng ta đang nói về 4.224 hợp đồng và 6.223 giao dịch nạn nhân. Số giao dịch nhiều hơn số địa chỉ, nghĩa là một số nạn nhân đã bị lừa nhiều lần bởi cùng một kỹ thuật. Điều đó cho thấy sự thiếu hiểu biết được duy trì trong một thời gian dài. 91,5% tổn thất trên Ethereum cho thấy những nạn nhân tập trung ở nơi có nhiều thanh khoản nhất. 83% từ một cụm duy nhất cho thấy hoạt động này có tổ chức. Đây không phải những kẻ cơ hội. Đây là một ngành công nghiệp.
Nhưng khoan. Hãy nhìn kỹ hơn vào phương pháp. SimGuard đánh giá trên 44 hợp đồng, trong đó 30 được tạo bằng Gemini. Kho mã và dữ liệu liên kết trong bài báo trả về HTTP 401 khi tôi kiểm tra. Nghĩa là không thể tải xuống để xác minh độc lập. Điều này đặt ra câu hỏi về tính tái lập của nghiên cứu. Có thể các con số sẽ thay đổi nếu một nhóm khác chạy lại toàn bộ quy trình. Tuy nhiên, điều đó không làm thay đổi bản chất của kỹ thuật tấn công. Ngay cả khi con số 3,48 triệu USD chỉ là một nửa sự thật, vẫn có hơn 5.000 người đã mất tiền vì bị mô phỏng đánh lừa.
Một điều ít ai chú ý: nghiên cứu không xác định phiên bản ví của các nạn nhân. Nghĩa là không biết họ dùng MetaMask, Phantom, Rabby hay một ví nội bộ của sàn. Không biết họ bật chế độ cảnh báo hay tắt. Không biết họ dùng phần mở rộng trình duyệt, ứng dụng di động hay một thiết bị phần cứng. Tất cả những yếu tố này đều ảnh hưởng đến kết quả mô phỏng. Vì vậy, nếu một ví đã vá lỗ hổng này, nghiên cứu không thể chứng minh rằng nó an toàn hoặc không an toàn. Nó chỉ cho chúng ta biết rằng đã từng có một thời gian dài các công cụ mô phỏng có thể bị qua mặt.
Theo tài liệu hiện tại của MetaMask, số dư ước tính chỉ là dự đoán và cảnh báo rằng kết quả cuối cùng không được đảm bảo. Nhưng có bao nhiêu người dùng đọc tài liệu? Có bao nhiêu người dùng biết rằng "ước tính" khác với "đảm bảo"? Tôi cá rằng phần lớn những người bị lừa chưa từng đọc một trang tài liệu nào. Họ chỉ nhìn một con số xanh, tin rằng mình sắp có lãi, và nhấn nút.
Điều đó dẫn tôi đến một góc nhìn phản trực giác: Kẻ tấn công không cần phải thông minh hơn bạn. Chúng chỉ cần hiểu bạn hơn bạn hiểu chính mình.
Bạn nghĩ rằng bạn đang nhận được một airdrop. Bạn không biết rằng cái tên "Claim" chỉ là một cái bẫy. Bạn không biết rằng một hàm có tên thân thiện có thể gọi transfer bên trong. Bạn không đọc mã nguồn. Bạn xem một đoạn mô phỏng có chọn lọc. Và bạn ký.
Có một chi tiết thú vị trong nghiên cứu: một số biến thể gas-control không yêu cầu kẻ tấn công thay đổi bất kỳ dữ liệu on-chain nào sau khi mô phỏng. Điều này có nghĩa là ngay cả khi bạn dùng một ví không có cơ chế lưu trữ state đặc biệt, bạn vẫn có thể bị lừa chỉ vì gas limit lúc gửi giao dịch khác với gas limit lúc mô phỏng. Điều này rất phổ biến, bởi vì nhiều người dùng chỉnh tay gas để tiết kiệm phí. Họ vô tình thay đổi điều kiện thực thi của hợp đồng độc hại. Họ tự tay kích hoạt cái bẫy.
Đó là lý do tại sao tôi không coi đây là một cuộc tấn công công nghệ. Đây là một cuộc tấn công tâm lý được mã hóa bằng Solidity. Công nghệ chỉ là công cụ. Còn trò chơi là trò chơi của niềm tin.
Kết luận: không có nút bấm nào an toàn hơn sự hiểu biết
Nếu có một bài học duy nhất từ nghiên cứu này, đó là: đừng bao giờ ký một giao dịch chỉ vì ví của bạn hiển thị một con số dương. Hãy tự hỏi: tổng số tiền rời khỏi ví là bao nhiêu? Địa chỉ nhận tiền có phải là một hợp đồng có thể thay đổi trạng thái? Tôi có hiểu mã nguồn không? Nếu bạn không trả lời được ba câu hỏi đó, bạn chưa đủ điều kiện để nhấn nút Confirm.
Thị trường đi ngang hiện tại không phải là thời gian để ngủ quên. Nó là thời gian để xây dựng thói quen kiểm tra on-chain. Khi bull run đến, mọi người đều vội vàng, và sự vội vàng là mảnh đất màu mỡ nhất cho những kẻ săn mồi. Còn khi bear market đến, sự sợ hãi khiến người ta ký những giao dịch "cứu giá" mà không đọc kỹ.
Tôi đã mất rất nhiều tiền vì tin vào lý thuyết. Tôi đã từng ôm một đồng coin vì tin white paper, rồi nhìn nó giảm 80% mà không thể làm gì. Nhưng tôi chưa bao giờ mất tiền vì một giao dịch tôi không hiểu, bởi vì tôi không ký. Đó là ranh giới giữa một nhà giao dịch và một nạn nhân.
Giao thức của bạn có thể an toàn. Hợp đồng của bạn có thể không có lỗ hổng. Nhưng nếu bạn ký một giao dịch mà bạn không hiểu, mọi thứ về an toàn đều trở thành vô nghĩa. Hãy đọc mã. Hãy kiểm tra dòng tiền. Hãy nhìn vào tổng số tiền rời khỏi ví, không phải số dư ròng.
Còn về những kẻ tấn công? Chúng sẽ tiếp tục viết mã. Chúng sẽ tiếp tục dùng AI để tạo ra những cái bẫy tinh vi hơn. Chúng sẽ không bao giờ dừng lại. Bạn có thể chọn cách trở thành một con mồi cảnh giác, hoặc một bữa tiệc dễ dàng.
Và NFT định giá bằng lý thuyết? Cười chết. Nhưng một giao dịch hiển thị "+0,001 ETH" mà bạn ký mà không hiểu, thì kẻ tấn công cũng cười chết như vậy. Hãy chọn vai của mình: người đọc mã nguồn, hay nạn nhân trong bản báo cáo tiếp theo.