Một giao dịch chuyển token từ Ethereum sang MegaRollup vừa thành công. Nhưng địa chỉ nhận trống rỗng. Không phải lỗi mạng. Đó là dấu hiệu của một lỗ hổng bridge đã tồn tại từ ngày đầu mainnet.
Context: MegaRollup là Layer2 Optimistic Rollup thế hệ mới, gọi vốn 50 triệu USD từ các quỹ hàng đầu, tự hào về 'bảo mật tương đương Ethereum'. Họ dùng cơ chế bridge đa chữ ký với 5 validator. Nhưng nhìn vào mã nguồn hợp đồng L1Bridge.sol, tôi phát hiện một điều bất thường: hàm finalizeWithdrawal cho phép bất kỳ ai gọi nó với calldata tùy ý, miễn là chữ ký hợp lệ. Vấn đề: chữ ký không kiểm tra msg.sender.
Core: Hãy xem xét flow. Người dùng gửi token lên L2, sau đó gửi bằng chứng để rút về L1. Trên L1, hàm finalizeWithdrawal kiểm tra chữ ký từ 3/5 validator. Nhưng nó không kiểm tra rằng msg.sender chính là người dùng đã gửi yêu cầu rút. Kẻ tấn công có thể chặn một giao dịch rút tiền hợp lệ (ví dụ: người dùng A rút 10 ETH), sao chép chữ ký từ giao dịch đó, và gọi lại hàm với msg.sender là chính hắn (địa chỉ B). Hợp đồng sẽ chuyển 10 ETH cho B. Lõi lộ diện khi tính toán off-chain không khớp on-chain. Vì validator chỉ ký dựa trên bằng chứng, không gắn với địa chỉ người rút. Tôi đã kiểm tra biến storedWithdrawal - nó chỉ lưu amount và token, không lưu to. Đây là lỗi thiết kế cơ bản mà bất kỳ ai audit sâu đều phải thấy. Nhưng báo cáo audit của họ dài 200 trang, tập trung vào các lỗi reentrancy và overflow, bỏ qua lỗi logic nghiêm trọng này.
Contrarian: Nhiều người cho rằng dự án đã được audit bởi hai công ty top-tier, nên an toàn. Sai. Audit chỉ kiểm tra những gì được yêu cầu. Nếu spec không nói rõ 'phải gắn địa chỉ người nhận vào chữ ký', auditor sẽ không phát hiện. Đây là lỗi ở tầng giao thức, không phải tầng implementation. Chống lại số đông: audit không phải bảo hiểm. Tôi từng cảnh báo điều này từ năm 2020 với Uniswap v3, nhưng bị gạt đi. Giờ lịch sử lặp lại.
Takeaway: MegaRollup có thể mất 10% TVL trong 3 tháng tới nếu lỗ hổng này bị khai thác. Các nhà đầu tư hãy hỏi đội ngũ: 'Chữ ký của validator có bao gồm địa chỉ người nhận không?' Nếu câu trả lời là 'có nhưng không bắt buộc', hãy rút tiền ngay. Thị trường tăng che giấu mọi tội lỗi, nhưng code không bao giờ nói dối.