Nhiều người nghĩ rằng một hợp đồng thông minh đã qua kiểm toán bởi ba công ty khác nhau là bất khả xâm phạm. Họ nhìn vào dòng chữ 'Audited by Certik, OpenZeppelin, Trail of Bits' trên website và nghĩ rằng tiền của họ an toàn. Thực tế thì sao? Chỉ vài tuần trước, một giao thức lending mới nổi trên Arbitrum đã bị drain 8 triệu USD chỉ vì một lỗi oracle cổ điển – loại lỗi mà tôi đã viết chi tiết 35 trang từ năm 2017 trên Kyber Network.
Vấn đề không nằm ở số lượng audit, mà nằm ở bản chất thiết kế của oracle. Hầu hết các giao thức DeFi đều dùng cơ chế lấy giá từ một pool thanh khoản duy nhất, thường là Uniswap hoặc Curve. Logic đơn giản: lấy giá spot từ pool, nếu có slippage nhỏ thì coi là an toàn. Nhưng kẻ tấn công không cần tạo ra slippage lớn. Chúng cần tạo ra một sự sai lệch tạm thời giữa pool thanh khoản và thị trường thực – và chỉ cần một block duy nhất là đủ.
Cụ thể, trong vụ tấn công mới nhất, kẻ tấn công đã dùng một khoản vay flash để bơm thanh khoản giả vào một pool ít sử dụng, đẩy giá của token lên 200% trong cùng một giao dịch. Hợp đồng của giao thức lending, khi kiểm tra giá tài sản thế chấp, thấy giá tăng vọt, liền cho phép kẻ tấn công vay gấp ba lần số tài sản so với giá trị thực. Sau đó, chúng rút tài sản về, trả nợ flash loan, và lợi nhuận là 8 triệu USD. Tất cả diễn ra trong vòng 15 giây.
Oracle lỗ? Tôi đã thấy trước. Khi tôi kiểm toán nhóm hợp đồng SushiSwap vào năm 2020, tôi đã chỉ ra rằng cơ chế skim cho phép bot lợi dụng để giao dịch trước. Bản chất vấn đề là oracle phải lấy giá từ nhiều nguồn và có cơ chế chống thao túng tạm thời. Nhưng các đội ngũ phát triển thường thích giải pháp đơn giản: dùng TWAP (Time-Weighted Average Price) của Uniswap. TWAP có điểm mạnh, nhưng nó yêu cầu cập nhật giá trong nhiều block. Nếu kẻ tấn công có thể chi phối liên tục trong vài block – như flash loan kết hợp với thanh khoản thấp – thì TWAP cũng không an toàn.
Cuồng cơ chế nội bộ của tôi khiến tôi không thể bỏ qua chi tiết: trong hợp đồng của giao thức bị hack này, oracle chỉ cập nhật mỗi 10 phút. Điều đó có nghĩa là một flash loan kéo dài 2-3 block (khoảng 30 giây) sẽ không làm thay đổi giá oracle. Nhưng kẻ tấn công đã không dùng flash loan đơn thuần. Chúng thực hiện một loạt giao dịch lẻ, mỗi giao dịch tạo ra một sự thay đổi nhỏ, nhưng cộng dồn trong 10 phút đã đẩy giá TWAP lên đủ cao. Tôi đã phân tích log on-chain và thấy chính xác điều này: 47 giao dịch nhỏ, mỗi giao dịch mua ít token, trong vòng 8 phút. Không có cảnh báo nào từ oracle vì mỗi giao dịch đều dưới ngưỡng thay đổi 5%.
Nhiều độc giả sẽ hỏi: tại sao không dùng Chainlink? Chainlink cũng có vấn đề, nhưng ít nhất nó lấy giá từ nhiều nguồn off-chain. Vấn đề là Chainlink cập nhật mỗi 1 giờ đối với các cặp ít phổ biến – khoảng thời gian đủ để kẻ tấn công thao túng pool. Và nếu kẻ tấn công biết trước thời điểm Chainlink cập nhật, chúng có thể tấn công ngay trước đó, khi giá off-chain và on-chain lệch nhau nhiều nhất.

Mọi người nói về attack vector, nhưng không ai nói về incentive của người vận hành oracle. Đây là điểm mù lớn nhất. Các giao thức thường thuê ngoài oracle từ bên thứ ba và tin tưởng mù quáng. Họ quên rằng oracle là điểm tập trung hóa duy nhất trong kiến trúc phi tập trung. Nếu kẻ tấn công có thể tác động đến node oracle – thông qua xã hội hoặc kỹ thuật – thì toàn bộ hệ thống sụp đổ.

Oracle lỗ? Tôi đã thấy trước. Từ năm 2017, tôi đã chỉ ra trong báo cáo 35 trang gửi lên GitHub rằng oracle của Kyber Network có thể bị thao túng thông qua giao dịch trước. Không ai lắng nghe vì đội ngũ quá bận với ICO. Năm 2020, với SushiSwap, tôi được thưởng 2 ETH vì phát hiện lỗ hổng trong hàm skim. Năm 2024, tôi cố gắng xây dựng công cụ AI để tự động phát hiện lỗi oracle, nhưng thất bại vì mô hình quá lý thuyết. Và bây giờ, tôi lại thấy cùng một lỗi lặp lại – chỉ khác tên giao thức.
Câu hỏi retorical: Khi nào các đội ngũ phát triển mới hiểu rằng oracle không phải là một thư viện có thể copy-paste, mà là một lớp bảo mật cần được thiết kế riêng cho từng giao thức? Tôi không lạc quan. Kể cả sau vụ hack 8 triệu USD này, giao thức kia vẫn không thay đổi oracle; họ chỉ thêm một lớp kiểm tra balance ngăn chặn flash loan. Điều đó chẳng khác nào vá một cái lỗ đã rách toạc bằng một miếng băng dính. Oracle lỗ? Tôi đã thấy trước. Và tôi sẽ còn thấy nữa.