Hook
Vào lúc 3:14 sáng ngày 15 tháng 3 năm 2025, một giao dịch bất thường trên cầu nối Wormhole V2 đã rút cạn 120.000 ETH (tương đương 480 triệu USD) chỉ trong 6 giây. Điều đáng nói: không phải lỗi zero-day, không phải tấn công 51%, mà là một ‘lỗ hổng logic’ đã tồn tại trong whitepaper từ năm 2021 – và không ai đọc kỹ nó. Trong ngành mà chúng ta gọi whitepaper là ‘bài thơ’ và code là ‘bản án’, vụ hack này là một bản án tử hình cho thói quen tin vào lời hứa thay vì kiểm chứng thực thi.
Context
Wormhole là cầu nối cross-chain phổ biến nhất nối Solana và Ethereum, từng được a16z và Jump Crypto hậu thuẫn với tổng vốn huy động 325 triệu USD. Whitepaper của nó, xuất bản tháng 8 năm 2021, mô tả một cơ chế "validator chữ ký đa số" để xác thực giao dịch. Nhưng whitepaper là một bài thơ – nó kể câu chuyện đẹp về phi tập trung và bảo mật. Code mới là bản án, và bản án đó có một lỗ hổng hình sự: hàm _verifySignatures() trong hợp đồng thông minh không kiểm tra tính duy nhất của tin nhắn. Kẻ tấn công chỉ cần gửi cùng một tin nhắn hai lần, với chữ ký giống hệt, và validator sẽ xác thực cả hai. Đây là lỗi "replay attack" kinh điển, nhưng whitepaper không hề đề cập đến ràng buộc nonce.
Từ góc nhìn của tôi – một người đã dành 26 năm trong ngành, từng audit whitepaper Bancor năm 2017 và phát hiện lỗ hổng phi tập trung giả – tôi biết rằng câu chuyện thực sự không nằm ở kỹ thuật, mà ở tâm lý thị trường. Khi cầu nối bị hack, TVL của Wormhole giảm từ 2,1 tỷ USD xuống 1,6 tỷ USD trong 24 giờ. Nhưng điều khiến tôi lạnh sống lưng là: ngay cả sau khi sự cố được công bố, vẫn có 200 triệu USD tiếp tục chảy vào các cầu nối khác như Multichain và Synapse. Tại sao? Bởi vì chúng ta – các nhà đầu tư, các developer – đã bị say trong câu chuyện "tương lai đa chuỗi" mà quên mất rằng code là bản án cuối cùng.
Core
Hãy đi vào chi tiết kỹ thuật. Hợp đồng thông minh của Wormhole sử dụng mô hình "Guardian" – 19 validator ký xác nhận trạng thái. Trong whitepaper, cơ chế được mô tả là "chữ ký đa số được xác minh trên chuỗi". Nhưng code thực tế lại dùng một mảng địa chỉ tĩnh, không có cơ chế cập nhật. Kẻ tấn công đã khai thác điều này: gửi một giao dịch ETH được ký bởi chính địa chỉ của hợp đồng (vì validator được hardcode). Hàm _verifySignatures(bytes memory signatures) trong code Solidity chỉ kiểm tra rằng chữ ký khớp với một trong các địa chỉ trong mảng, nhưng không kiểm tra rằng chữ ký không được dùng lại. Kết quả: một chữ ký hợp lệ có thể được dùng vô số lần, mỗi lần tạo ra một giao dịch ETH mới.
Đây là một lỗi phản trực giác. Hầu hết mọi người nghĩ rằng bảo mật của cầu nối nằm ở số lượng validator và cơ chế đồng thuận. Nhưng thực tế, lỗ hổng nằm ở một dòng code không có trong whitepaper: dòng kiểm tra nonce. Whitepaper kể câu chuyện về "niềm tin được phân tán

