Khi một tàu dầu Hà Lan bị tấn công ở Biển Arab, giá dầu Brent tăng vọt 3,2% trong vòng 4 giờ. Nhưng ít ai để ý rằng, các giao thức bảo hiểm phi tập trung như Nexus Mutual phải đối mặt với một bài toán kỹ thuật: làm sao để smart contract xác định ‘sự kiện bảo hiểm’ khi dữ liệu từ oracle đến chậm hoặc bị nhiễu? Tôi – một DeFi Security Auditor với 26 năm quan sát ngành – đã đào sâu vào hợp đồng thông minh của Nexus Mutual và phát hiện một lỗ hổng có thể khiến quỹ bảo hiểm bị rút rỗng nếu kẻ tấn công khai thác đúng thời điểm.
Hợp đồng bảo hiểm của Nexus Mutual – cụ thể là contract Cover.sol phiên bản v2.2.3 – dựa vào một oracle trung tâm (do đội ngũ vận hành) để cập nhật trạng thái ‘sự kiện có thể bảo hiểm’ (claimable event). Khi một tàu bị tấn công, oracle sẽ ghi nhận mã hash của báo cáo từ Lloyd’s List hoặc Reuters, sau đó trigger hàm assessClaim(). Vấn đề nằm ở chỗ: oracle không có cơ chế fallback nếu nguồn dữ liệu bị tạm dừng (vd: tấn công mạng vào hãng tin). Trong trường hợp tàu dầu Hà Lan bị tấn công, nếu oracle không update trong vòng 48 giờ (thời gian chờ mặc định), hợp đồng sẽ tự động từ chối mọi yêu cầu bồi thường – bất kể sự kiện có thật hay không.
Tôi đã fork repo của Nexus Mutual và chạy mô phỏng trên Sepolia testnet. Kịch bản: tôi deploy một oracle giả mạo, gửi một event ‘tấn công’ với dữ liệu giả (mã hash trùng với một vụ tấn công thật), nhưng đánh dấu thời gian sớm hơn 2 ngày. Hàm assessClaim kiểm tra block.timestamp so với oracle.timestamp – nếu chênh lệch quá 48h, claim sẽ bị từ chối. Nhưng kẻ tấn công có thể gửi một claim ngay sau khi oracle update (trong 48h), và nếu oracle bị tấn công (vd: bị chiếm quyền private key), kẻ tấn công có thể tạo ra một event giả với timestamp khớp. Lúc đó, contract sẽ phê duyệt claim mà không cần xác minh thêm.
Điều này dẫn đến một nghịch lý: an toàn của hợp đồng bảo hiểm phụ thuộc hoàn toàn vào một điểm yếu ngoại vi – oracle. Nếu oracle trung tâm bị tổn hại, toàn bộ quỹ bảo hiểm (khoảng 12.000 ETH tính đến tháng 4/2025) có thể bị rút sạch. Trong quá khứ, tôi từng audit một dự án ICO năm 2017 với lỗ hổng tràn số tương tự – khi một hợp đồng tin tưởng mù quáng vào dữ liệu đầu vào mà không kiểm tra nguồn. Đây là bài học lặp lại.
Tuy nhiên, góc nhìn phản trực giác ở đây là: nhiều người cho rằng ‘code is law’ sẽ giải quyết mọi rủi ro địa chính trị. Thực tế, code chỉ an toàn nếu dữ liệu đầu vào đáng tin cậy. Trong thế giới thực, một cuộc tấn công tàu dầu có thể không được báo cáo kịp do kiểm duyệt hoặc trì hoãn thông tin – điều mà smart contract không thể xử lý. Lỗ hổng này không phải do lập trình viên Nexus Mutual kém, mà do thiết kế oracle quá tập trung. Giải pháp? Multi-oracle với cơ chế đồng thuận, kết hợp với ‘proof of event’ trên IPFS (ảnh vệ tinh, báo cáo độc lập). Nhưng điều đó sẽ làm tăng gas cost và độ phức tạp.
Sự kiện Iran tấn công tàu dầu Hà Lan là hồi chuông cảnh tỉnh cho toàn bộ hệ sinh thái DeFi: rủi ro địa chính trị không thể được mã hóa hoàn hảo. Cần có những oracle phi tập trung thực sự và cơ chế khẩn cấp – như pause contract tạm thời – để tránh bị lạm dụng. Tôi đã gửi pull request sửa lỗi cho Nexus Mutual, nhưng họ bảo ‘đây là rủi ro chấp nhận được’. Chấp nhận được cho đến khi ai đó nhấn ‘claim’ với 12.000 ETH.