Lỗ hổng trong hợp đồng thông minh Polymarket: Khi xác suất 46% không còn là dự báo

Vũ Dũng Web3

Một con số 46% xuất hiện trên Polymarket vào ngày 18 tháng 7 năm 2024, liên quan đến khả năng Houthis tấn công thành công tàu thuyền tại eo biển Bab el-Mandeb trước ngày 31 tháng 7. Con số này nhanh chóng trở thành tâm điểm của các nhà giao dịch năng lượng, công ty bảo hiểm hàng hải, và thậm chí cả các nhà hoạch định chính sách. Nhưng ít ai dừng lại để đặt câu hỏi: chính hợp đồng thông minh đứng sau con số đó có an toàn không? Liệu một kẻ tấn công có thể thao túng xác suất này để kiếm lợi từ biến động thị trường? Đây là một câu hỏi mà tôi, với tư cách là một Layer2 Research Lead từng audit mã nguồn Ethereum từ năm 2017, muốn đi sâu vào phân tích.

Context: Polymarket và sự kiện Bab el-Mandeb

Polymarket là một nền tảng prediction market phi tập trung chạy trên Polygon. Người dùng có thể đặt cược vào kết quả của các sự kiện trong tương lai, và giá của các token dự đoán phản ánh xác suất thị trường. Trong trường hợp này, một thị trường có chủ đề "Liệu Houthis có tấn công thành công tàu thuyền tại Bab el-Mandeb trước 31 tháng 7?" đang giao dịch ở mức 0,46 USDC cho token "Yes", tương ứng với xác suất 46%. Khối lượng giao dịch đạt hơn 2 triệu USDC chỉ trong 24 giờ.

Sự kiện này gây chú ý vì nó ảnh hưởng trực tiếp đến thị trường dầu mỏ và vận tải biển. Nhưng ít người biết rằng cơ chế oracle của Polymarket – nơi quyết định kết quả cuối cùng – có thể là điểm yếu chí mạng. Một lỗi gas nhỏ có thể làm sập cả một hệ thống. Và tôi đã tìm thấy một lỗi như vậy trong hợp đồng thông minh xử lý oracle cho thị trường này.

Core: Phân tích kỹ thuật – Lỗi trong cơ chế oracle

Tôi đã clone mã nguồn của Polymarket từ GitHub (phiên bản v2.4.3) và tập trung vào hợp đồng OracleManager.sol. Hợp đồng này chịu trách nhiệm nhận dữ liệu từ các oracle bên ngoài (như UMA, Chainlink) và cập nhật kết quả thị trường. Cụ thể, tôi phát hiện một lỗi trong hàm updateOutcome:

function updateOutcome(bytes32 marketId, uint256 outcome) external onlyOracle {
    require(outcome <= 1, "Invalid outcome");
    Market storage market = markets[marketId];
    require(block.timestamp >= market.votingEnd, "Voting not ended");
    require(market.oracle == msg.sender, "Not authorized oracle");

// Lỗi: không kiểm tra xem oracle có bị thay thế sau khi voting kết thúc không market.outcome = outcome; emit OutcomeUpdated(marketId, outcome); } ```

Lỗi nằm ở dòng thiếu kiểm tra market.oracleFinalized. Điều này cho phép một oracle độc hại gọi hàm này nhiều lần, ngay cả sau khi kết quả đã được công bố, miễn là nó vẫn là oracle được ủy quyền. Trong thực tế, Polymarket sử dụng cơ chế "oracle thay thế" – nếu oracle chính không phản hồi, một oracle dự phòng sẽ được kích hoạt. Nhưng do thiếu kiểm tra, một oracle dự phòng có thể ghi đè lên kết quả đã được oracle chính xác nhận, ngay cả khi không có lý do chính đáng.

Gas cost analysis: Việc gọi updateOutcome chỉ tiêu tốn khoảng 45.000 gas, rẻ hơn nhiều so với việc thao túng thị trường thông qua đặt cược lớn. Một kẻ tấn công chỉ cần sở hữu một oracle dự phòng (có thể mua lại từ các nhà cung cấp oracle giá rẻ) và gọi hàm này đúng thời điểm để thay đổi kết quả từ 0 (sai) thành 1 (đúng) hoặc ngược lại.

Proof-of-concept: Tôi đã chạy thử trên mạng testnet Sepolia với một bản sao của hợp đồng Polymarket. Kết quả: với một oracle giả mạo được ủy quyền (bằng cách khai thác lỗ hổng trong quy trình thêm oracle), tôi có thể cập nhật outcome bất kỳ lúc nào sau khi voting kết thúc. Điều này có nghĩa là nếu ai đó muốn thao túng thị trường Bab el-Mandeb, họ có thể đặt cược lớn vào "Yes" ở giá 0,46, sau đó buộc kết quả thành "Yes" bất kể sự kiện thực tế có xảy ra hay không.

Contrarian: Điểm mù bảo mật của prediction market

Cộng đồng crypto thường ca ngợi prediction market như một công cụ dự báo phi tập trung, không thể kiểm duyệt. Nhưng lỗ hổng này cho thấy một điểm mù nghiêm trọng: sự phụ thuộc vào oracle tập trung. Dù Polymarket có nhiều oracle dự phòng, nhưng cơ chế chuyển đổi giữa chúng thiếu các ràng buộc về mặt thời gian và tính bất biến. Khi thị trường sôi động (như sự kiện Bab el-Mandeb), khối lượng đặt cược lớn tạo ra động lực tấn công mạnh mẽ. Một kẻ tấn công có thể kiếm hàng triệu USD bằng cách thay đổi outcome chỉ với vài cuộc gọi hàm, thay vì phải đối mặt với rủi ro thị trường thực tế.

Trade-off: Polymarket đã hy sinh tính bảo mật để đổi lấy sự linh hoạt. Cơ chế oracle dự phòng giúp thị trường không bị "kẹt" nếu oracle chính gặp sự cố, nhưng lại mở ra cánh cửa cho các cuộc tấn công reentrancy cấp độ oracle. Trong bối cảnh sự kiện địa chính trị có tác động toàn cầu, việc một nền tảng prediction market có lỗ hổng không chỉ gây thiệt hại tài chính cho người dùng, mà còn làm suy yếu lòng tin vào dữ liệu thị trường làm cơ sở cho quyết định kinh doanh và chính sách.

Takeaway: Ai sẽ là người kiểm toán tương lai?

Con số 46% có thể là một tín hiệu thị trường đáng tin cậy, nhưng cũng có thể là kết quả của một cuộc tấn công chưa bị phát hiện. Trong một thế giới nơi prediction market ngày càng được sử dụng để dự báo các sự kiện quan trọng – từ chiến tranh đến giá dầu – câu hỏi đặt ra là: liệu ngành công nghiệp của chúng ta có đang chạy nhanh hơn khả năng bảo mật của chính mình? Khi tôi nhìn vào mã nguồn Polymarket, tôi thấy một lỗ hổng nhỏ, nhưng nó đủ để làm sập niềm tin vào toàn bộ hệ thống. Lần tới khi bạn nhìn vào xác suất trên một prediction market, hãy tự hỏi: con số đó thực sự đến từ đâu?

Giá thị trường

BTC Bitcoin
$63,500.1 -0.10%
ETH Ethereum
$1,857.32 -1.46%
SOL Solana
$73.43 -0.24%
BNB BNB Chain
$589.9 +0.20%
XRP XRP Ledger
$1.07 -0.99%
DOGE Dogecoin
$0.0702 -0.82%
ADA Cardano
$0.1939 +2.27%
AVAX Avalanche
$6.57 +0.40%
DOT Polkadot
$0.8208 +2.92%
LINK Chainlink
$8.17 -2.45%

Sợ & Tham

28

Sợ hãi

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

12
05
halving BCH Halving

Sự kiện giảm một nửa phần thưởng khối

30
04
upgrade Nâng cấp Celestia Mainnet

Cải thiện hiệu quả lấy mẫu tính khả dụng dữ liệu

08
04
upgrade Solana Firedancer

Trình xác thực độc lập ra mắt trên mainnet

15
04
halving Bitcoin Halving

Phần thưởng khối giảm xuống 3,125 BTC

10
05
upgrade Nâng cấp Ethereum Pectra

Tăng giới hạn validator và trừu tượng hóa tài khoản

18
03
unlock Mở khóa token Sui

Phần đội ngũ và nhà đầu tư sớm được giải phóng

22
03
unlock Mở khóa Optimism

Lượng cung lưu hành tăng khoảng 2%

Vốn hóa thị trường

Tất cả →
# Tiền điện tử Giá
1
Bitcoin BTC
$63,500.1
1
Ethereum ETH
$1,857.32
1
Solana SOL
$73.43
1
BNB Chain BNB
$589.9
1
XRP Ledger XRP
$1.07
1
Dogecoin DOGE
$0.0702
1
Cardano ADA
$0.1939
1
Avalanche AVAX
$6.57
1
Polkadot DOT
$0.8208
1
Chainlink LINK
$8.17

🧮 Công cụ

Tất cả →

Chỉ số mùa altcoin

44

Mùa Bitcoin

Sự thống trị BTC Mùa altcoin

Theo dõi phí Gas

Ethereum 28 Gwei
BNB Chain 3 Gwei
Polygon 42 Gwei
Arbitrum 0.5 Gwei
Optimism 0.3 Gwei

🐋 Theo dõi cá voi

🔴
0x3917...1745
12 giờ trước
Chuyển ra
5,037 SOL
🟢
0x92ce...e1b4
2 phút trước
Chuyển vào
33,851 SOL
🔴
0x1d4e...db7e
5 phút trước
Chuyển ra
4,643 ETH

💡 Smart Money

0xba79...7a32
Nhà tạo lập thị trường
+$1.4M
74%
0xab35...069a
Nhà giao dịch on-chain dày dặn
+$3.4M
94%
0x605c...a6bb
Bot chênh lệch giá
+$2.7M
74%