Một ngân hàng thương mại Việt Nam đã suýt mất 10 triệu USD vì hàm xác thực đa chữ ký thiếu timeout. Tôi phát hiện lỗ hổng này trong đợt audit VietBridge vào tháng 3/2025. Đây không phải chuyện đùa.
Context
Cầu nối permissioned đang là giải pháp được các tổ chức tài chính Việt Nam ưa chuộng để kết nối blockchain riêng với Ethereum. Họ tin rằng whitelist validator và multisig là đủ an toàn. Sai lầm. Tôi đã dẫn nhóm 3 người kiểm tra VietBridge – một cầu nối do một ngân hàng top 5 Việt Nam phát triển. Họ dùng 5/7 multisig, mỗi validator là một server riêng. Nghe có vẻ an toàn, nhưng tôi yêu cầu chạy 12 bài kiểm tra từ các auditor khác nhau. Kết quả: hàm xác thực chữ ký không có cơ chế timeout. Nghĩa là nếu kẻ tấn công chiếm được 3 trong 7 key, họ có thể gửi giao dịch giả mạo và chờ 48 giờ không giám sát để ký đủ 5 chữ ký.
Core: Phân tích kỹ thuật lỗ hổng
Tôi mô phỏng kịch bản tấn công trên local node. Hợp đồng cầu nối sử dụng hàm verifySignatures với vòng lặp kiểm tra từng chữ ký ECDSA. Vấn đề: không có biến deadline để giới hạn thời gian thu thập chữ ký. Trong môi trường production, validator A ký lúc 08:00, validator B ký lúc 08:05, nhưng validator C bị tấn công và ký giả lúc 08:00 ngày hôm sau. Hợp đồng vẫn chấp nhận vì không kiểm tra thời gian. Gas rẻ không đồng nghĩa với an toàn. Việc thêm một dòng kiểm tra block.timestamp <= deadline có thể ngăn chặn hoàn toàn vector tấn công này. Chi phí gas tăng thêm chỉ 2.300 gas mỗi giao dịch – tương đương 0.000046 ETH ở thời điểm hiện tại. Quá rẻ so với rủi ro 10 triệu USD.

Tôi cũng phát hiện rằng logic require(signatureCount >= threshold) không kiểm tra signatureCount có bị reset hay không. Nếu validator gửi lại chữ ký cũ, số đếm tăng lên. Kẻ tấn công có thể lợi dụng điều này để đạt ngưỡng 5/7 mà chỉ cần 3 chữ ký thật + 2 chữ ký replay. Tôi đã chứng minh điều này bằng cách replay một chữ ký cũ từ validator đã bị thay thế. Hợp đồng không phân biệt được.
Contrarian: Điểm mù của ngân hàng
Nhiều người nghĩ multisig là giải pháp bảo mật tuyệt đối. Sai. Trong thực tế, các validator thường không đồng bộ thời gian thực. Họ ký khi có lệnh, không kiểm tra tính hợp lệ của thời điểm. Tôi đã khảo sát 5 dự án cầu nối Việt Nam khác – 4 trong số đó có lỗ hổng tương tự. Layer2: tốc độ cao, trách nhiệm cao. Các ngân hàng Việt Nam đang chạy đua áp dụng blockchain nhưng bỏ qua các kiểm tra cơ bản về thời gian và replay. Họ dựa vào niềm tin vào nhà phát triển, không phải vào mã nguồn. Đây là điểm mù chết người.
Takeaway
Tôi đã đề xuất 3 bản nâng cấp: thêm deadline, nonce chống replay, và kiểm tra chữ ký theo block height. Ngân hàng đã triển khai sau 2 tuần. Nhưng còn bao nhiêu cầu nối khác đang lơ lửng? Câu hỏi không phải là liệu bạn có bị hack không, mà là khi nào. Và tôi cá là nhiều ngân hàng Việt Nam sẽ phải trả giá đắt trong 12 tháng tới.
