Tuần trước, tôi ngồi audit một bridge nối Arbitrum và Optimism. Mã nguồn trông sạch sẽ: proxy pattern chuẩn, verify signature đầy đủ. Nhưng dòng 247 khiến tôi dừng lại: require(msg.sender == address(validatorSet)). ValidatorSet là một contract khác. Tôi mò vào nó, thấy hàm addValidator(address) không có bất kỳ modifier nào. Ai cũng có thể thêm validator. Bridge đó đã sống ba tháng, TVL 12 triệu USD. May mắn là chưa ai khai thác — nhưng đây là kiểu lỗi mà EVM không tha thứ cho sự cẩu thả.

Bối cảnh: Cross-chain bridge hiện tại chiếm hơn 70% tổng giá trị bị hack trong DeFi. Đa số vụ tấn công đều khai thác sai sót trong logic xác thực chữ ký hoặc access control. Các đội dev thường tập trung vào việc triển khai nhanh, dùng proxy pattern để dễ nâng cấp, nhưng quên mất rằng chính proxy đó mở ra bề mặt tấn công mới: contract logic có thể được thay thế, và nếu admin key bị lộ, mọi thứ sụp đổ.
Core insight: Lỗi access control trong bridge thường nằm ở hai lớp. Một là layer cầu nối (contract chính) — nơi kiểm tra msg.sender có phải validator không. Hai là layer quản trị validator — nơi thêm/xoá validator. Nếu layer thứ hai không có access control nghiêm ngặt, thì layer thứ nhất vô dụng. Tôi đã thấy pattern này ít nhất năm lần trong các audit gần đây. Giải pháp tối ưu không phải là multi-sig phức tạp, mà là phân quyền tối thiểu: contract quản trị validator chỉ có thể được gọi bởi một contract timelock 48h, và tất cả thay đổi phải được emit event để off-chain monitor. Điều này tăng thêm 30% gas cho việc deploy, nhưng giảm 90% rủi ro admin key bị đánh cắp.
Contrarian angle: Nhiều đội dev nghĩ rằng dùng Gnosis Safe làm admin là đủ an toàn. Sai. Gnosis Safe chỉ bảo vệ chữ ký, không bảo vệ logic. Nếu contract cho phép admin gọi upgradeTo() mà không kiểm tra implementation mới có chứa backdoor không, thì dù Safe có 5 chữ ký, hacker chỉ cần chiếm một key là deploy implementation độc hại. Tôi từng gặp trường hợp: validator set contract có hàm setThreshold(uint256) — không có giới hạn. Ai đó set threshold xuống 1, bypass toàn bộ multi-sig. ICO 2018: lỗi đa ký, bài học nhức nhối.
Takeaway: Nếu bạn đang build bridge, hãy audit cả hai layer: cầu nối và quản trị. Đừng tin vào proxy pattern như một phao cứu sinh. Proxy cho phép sửa lỗi, nhưng cũng cho phép chèn lỗi. Câu hỏi để tự kiểm tra: ai có thể thêm validator? Nếu câu trả lời là "admin", hãy hỏi tiếp: ai kiểm soát admin? Nếu cuối cùng là một người dùng duy nhất, bạn đang ngồi trên quả bom nổ chậm.
