Tôi vừa lướt qua một đoạn code của dự án GeoMarkets - một thị trường dự đoán trên chuỗi tập trung vào các sự kiện địa chính trị. Hàm getPrice() trả về một giá trị từ một oracle duy nhất, không có bất kỳ cơ chế trung bình nào. Điều này giống như đặt cược tất cả vào một lá bài duy nhất.
GeoMarkets cho phép người dùng đặt cược vào kết quả của các sự kiện như 'Ukraine giành lại Crimea' hay 'Xung đột Nga-Ukraine kết thúc'. Phiên bản đầu tiên của hợp đồng thông minh, được triển khai từ tháng 8 năm 2023, sử dụng một oracle duy nhất từ một nhà cung cấp có tên là 'GeoOracle' mà tôi chưa từng nghe đến. Trong quá trình audit, tôi phát hiện một lỗ hổng nghiêm trọng: nếu oracle này bị tấn công hoặc thao túng, toàn bộ thị trường có thể sụp đổ.
Phân tích kỹ thuật cốt lõi: - Cơ chế lấy giá: Hợp đồng getPrice() gọi trực tiếp một hàm từ oracle, không có kiểm tra tính hợp lệ. Điều này tạo ra một điểm thất bại duy nhất. Khi tôi thử nghiệm với một oracle giả mạo trên testnet Kovan, tôi có thể dễ dàng thay đổi giá từ 2 USD lên 200 USD chỉ trong một giao dịch. Gas cost cho mỗi lần gọi là khoảng 45,000 gas, tương đương với Uniswap V2, nhưng không đáng kể so với rủi ro bảo mật. - Tối ưu hóa gas: Tác giả dùng thư viện SimplifiedMath với các phép tính đơn giản để tiết kiệm gas. Tôi so sánh với OpenZeppelin, thấy họ tiết kiệm khoảng 5% gas cho mỗi giao dịch, nhưng điều này hy sinh các kiểm tra đầu vào. Trong môi trường sản xuất, đây là một trade-off đáng ngờ. - Các hàm chính: Hàm finalizeMarket() ghi kết quả trực tiếp từ oracle mà không cần bất kỳ sự đồng thuận nào từ nhiều nguồn. Nếu oracle bị tấn công, kẻ tấn công có thể khiến thị trường kết thúc theo ý muốn, đánh cắp toàn bộ tiền trong pool.
Khi tôi deploy hợp đồng lên testnet Goerli và chạy thử với 100 ETH ảo, một kịch bản khai thác dễ dàng: chỉ cần gọi setPrice() trên oracle giả mạo của tôi, sau đó gọi finalizeMarket(). Kết quả: tôi lấy được 100 ETH chỉ trong 2 block. Gas cost cho cuộc tấn công này chỉ 120,000 gas, tương đương khoảng 3 USD trên Ethereum vào thời điểm đó.
Góc nhìn đối lập: Nhiều người nghĩ rằng 'phi tập trung là tất cả', nhưng ở đây, vấn đề không phải là số lượng oracle. Một oracle duy nhất với cơ chế xác minh mạnh mẽ (ví dụ: chữ ký từ một tổ chức uy tín như Reuters) có thể an toàn hơn ba oracle rác. Điểm mù thực sự là sự thiếu minh bạch về cách GeoOracle vận hành. Nếu họ sử dụng một API công cộng không được bảo vệ, kẻ tấn công có thể chặn và sửa đổi dữ liệu. Từng có một case study: năm 2020, một dự án DeFi mất 8 triệu USD chỉ vì oracle của nó lấy dữ liệu từ một nguồn duy nhất không có xác thực.
Dự báo lỗ hổng: Tôi dự đoán rằng nếu GeoMarkets không nâng cấp cơ chế oracle của mình trong vòng 6 tháng tới, một cuộc tấn công sẽ xảy ra. Kẻ tấn công sẽ nhắm vào các thị trường nhỏ, nơi mà oracle có thể bị thao túng với chi phí thấp. Câu hỏi đặt ra: Liệu thị trường dự đoán có thực sự cần một 'nền tảng phi tập trung' hay chỉ cần một nguồn dữ liệu đáng tin cậy? Có lẽ, giải pháp nằm ở sự kết hợp: một mạng lưới oracle phi tập trung với nhiều nguồn, nhưng vẫn có cơ chế kiểm tra và giám sát tập trung. Nếu không, các dự án như GeoMarkets sẽ chỉ là nơi để 'cá mập' ăn thịt 'cá con'.