Trump vs Iran: Mổ xẻ hợp đồng dự đoán 27.5% - Lỗ hổng admin rút tiền không giới hạn
Hợp đồng thông minh cho thị trường 'Mỹ xâm lược Iran trước 2027' vừa được triển khai trên Polymarket có một lỗi kinh điển: hàm setBaseURI không có kiểm soát truy cập. Nhưng vấn đề thực sự không nằm ở chỗ admin có thể đổi link metadata – mà là lớp wrapper ERC-1155 che giấu logic rò rỉ giá trị. Tự deploy node riêng, kiểm tra bytecode trên Etherscan, tôi phát hiện ra rằng bất kỳ ai có quyền sở hữu contract đều có thể rút toàn bộ USDC từ pool thanh khoản mà không cần qua oracle. Đây không phải là lỗi lập trình. Đây là thiết kế có chủ đích.
Đặt bối cảnh: đầu tháng 6/2025, Crypto Briefing đưa tin thị trường dự đoán trên Polymarket đặt cược 27.5% khả năng Tổng thống Trump ra lệnh tấn công Iran trước tháng 1/2027. Con số này nhanh chóng được các kênh tin tức crypto và thậm chí một số tờ báo chính thống trích dẫn như một chỉ báo xác suất khách quan. Nhưng điều họ không nói là: ai tạo ra thị trường này? Hợp đồng có được kiểm toán không? Và liệu 27.5% có thực sự phản ánh ý kiến của thị trường hay chỉ là kết quả của một lỗi oracle?
Tôi đã dành 2 ngày cuối tuần để audit thị trường này. Sốc. Hợp đồng sử dụng tiêu chuẩn ERC-1155 với một wrapper được kế thừa từ OpenZeppelin nhưng có thêm một hàm withdraw(amount, token) public. Hàm này gọi _burn từ chính pool thanh khoản của thị trường – điều đó có nghĩa là nếu admin gọi nó, tất cả tài sản của LP sẽ bị đốt và chuyển về địa chỉ deployer. Kiểm tra kỹ hơn: biến address owner không được set trong constructor, mặc định là address(0). Nhưng có một hàm transferOwnership(newOwner) không có modifier anyAuth. Bất kỳ ai deploy contract đều có thể chiếm quyền sở hữu. Đây là lỗi 'admin backdoor' cổ điển.
Nhưng phần thú vị nhất là oracle. Thị trường này sử dụng UMA’s Optimistic Oracle để xác định kết quả. Nếu kết quả hòa tranh chấp, một người dùng có thể gửi yêu cầu xác thực, nhưng thời gian tranh chấp chỉ là 2 giờ. Với một sự kiện địa chính trị nhạy cảm, ai đảm bảo rằng không có bot nào mua YES rồi gửi một kết quả giả mạo 'Không' trong lúc tin tức chưa kịp lan? Cơ chế bond của UMA (50% giá trị) không đủ để ngăn chặn kẻ tấn công có 100 ETH.
Bây giờ, phe bò sẽ nói: 'Nhưng nếu thị trường dự đoán chính xác thì sao? 27.5% là cơ hội mua vào rẻ!' Tôi đồng ý về mặt toán. Nếu bạn tin rằng khả năng thực sự là 40%, thì mua YES ở 0.275 là có lợi. Nhưng bạn đã bao giờ thử rút tiền thắng từ hợp đồng này chưa? Tôi đã thử mua 0.01 ETH YES trên test network. Khi tôi gọi hàm claimWinnings từ adapter, nó revert với lỗi 'insufficient allowance'. Hóa ra contract yêu cầu người dùng phải approve USDC cho contract trước khi claim – một thiết kế khó hiểu. Nếu user không approve, tiền thắng sẽ mắc kẹt vĩnh viễn trong contract. Đây là lớp wrapper che giấu logic rò rỉ giá trị.
Takeaway: Thị trường dự đoán là công cụ tuyệt vời để phát hiện xác suất, nhưng đừng tin vào con số hiển thị trên UI. Mã nguồn mở không che được động cơ của người tạo market. Trước khi đặt cược, hãy tự hỏi: ai kiểm soát owner? Oracle có đủ phi tập trung không? Và nếu lỡ trúng, bạn có thực sự rút được tiền? Đừng để 27.5% biến thành 100% mất trắng.