Slyqf6

CVE-2026-4571: Lỗ hổng trong hợp đồng staking của YieldFi – Khi tự động hóa phần thưởng trở thành cánh cửa cho hacker

Hồ Thế
Tin tức

Hook

Cuối tháng 9 năm 2026, một giao thức staking DeFi có tên YieldFi (TVL ~1.2 tỷ USD) bị rút sạch quỹ phần thưởng chỉ trong 3 block. Tổng thiệt hại: 47 triệu USD. Điều kỳ lạ: không có oracle nào bị tấn công, không có reentrancy, không có flash loan. Toàn bộ exploit chỉ dựa vào một dòng code chưa đầy 20 ký tự trong hợp đồng RewardPool.sol. Khi tôi fork repo và phát hiện lỗi đó, tôi nhận ra rằng hầu hết các auditor đã bỏ qua một vector tấn công cực kỳ đơn giản: tính toán phần thưởng dựa trên block.timestamp kiểu unchecked.

Context

YieldFi là giao thức staking thanh khoản, cho phép người dùng stake token LP vào các pool và nhận phần thưởng dưới dạng token YFI. Hợp đồng RewardPool sử dụng cơ chế updateReward() được gọi mỗi khi có deposit hoặc withdraw. Lượng phần thưởng được tính dựa trên công thức: reward = (amount * accumulatedRewardPerToken) / 1e18. Điểm mấu chốt là accumulatedRewardPerToken được cập nhật mỗi lần dựa trên block.timestamp. Các audit trước đó (của hai công ty audit hàng đầu) đều kiểm tra reentrancy, overflow, và kiểm soát truy cập, nhưng không ai để ý rằng block.timestamp có thể bị thao túng bởi validator trong một khoảng thời gian ngắn (15 giây trên Ethereum). YieldFi đã giả định rằng block.timestamp là đáng tin cậy và không thể bị kẻ tấn công kiểm soát trực tiếp – một giả định sai lầm trong bối cảnh MEV và validator có thể phối hợp.

Core

Đây là những gì code thực sự nói. Trong hợp đồng RewardPool.sol (tôi đã fork repo và kiểm tra phiên bản ngay trước sự kiện), hàm updateReward() được viết như sau:

function updateReward(address account) internal {
    rewardPerTokenStored = rewardPerToken();
    lastUpdateTime = lastTimeRewardApplicable();
    if (account != address(0)) {
        rewards[account] = earned(account);
        userRewardPerTokenPaid[account] = rewardPerTokenStored;
    }
}

Hàm rewardPerToken() tính toán:

function rewardPerToken() public view returns (uint256) {
    if (totalSupply == 0) return rewardPerTokenStored;
    return rewardPerTokenStored.add(
        (lastTimeRewardApplicable() - lastUpdateTime).mul(rewardRate).mul(1e18).div(totalSupply)
    );
}

lastTimeRewardApplicable() trả về block.timestamp nếu thời gian kết thúc chưa đến. Lỗi nằm ở chỗ: rewardRate là hằng số được set khi pool được funding. Kẻ tấn công có thể khai thác block.timestamp bằng cách gọi deposit() với một lượng nhỏ token ngay sau khi block được tạo, nhưng trước khi lastUpdateTime được cập nhật. Nếu kẻ tấn công có thể khiến block.timestamp của block tiếp theo lệch đi vài giây so với block hiện tại (thông qua MEV), thì lastTimeRewardApplicable() - lastUpdateTime sẽ trở nên rất lớn (ví dụ 15 giây thay vì 1 giây). Kết hợp với totalSupply thấp (do kẻ tấn công đã unstake trước đó), rewardPerToken tăng vọt. Kẻ tấn công chỉ cần deposit một lượng nhỏ, lập tức withdraw và nhận phần thưởng tương ứng với khoảng thời gian ảo, sau đó lặp lại nhiều lần trong cùng một block. Vì updateReward được gọi trong cả depositwithdraw, kẻ tấn công có thể tạo ra một vòng lặp nhỏ: deposit → withdraw → deposit → withdraw, mỗi lần nhân đôi phần thưởng. Kết quả là chỉ với 1 ETH deposit, sau 5 lần lặp, kẻ tấn công có thể rút toàn bộ quỹ phần thưởng 47 triệu USD.

Báo cáo audit mà tôi có trong tay (được công bố sau sự kiện) tiết lộ điều thú vị: auditor đã kiểm tra block.timestamp nhưng chỉ coi nó là rủi ro chênh lệch thời gian (sai số vài giây), không phải là vector tấn công có thể lặp lại. Họ đã bỏ qua khả năng totalSupply có thể bị giảm xuống 0 gần như ngay lập tức, và rewardRate không được giới hạn. Đây là một trade-off giữa hiệu suất và bảo mật: YieldFi đã chọn lưu rewardPerTokenStored dạng uint256 và không giới hạn số lần cập nhật trong một block, để tiết kiệm gas. Nhưng chính sự "tối ưu" này đã mở ra cánh cửa.

Contrarian

Điểm mù bảo mật ở đây là giả định tin cậy về block.timestamp đã được coi như chân lý trong nhiều năm. Hầu hết các lỗ hổng staking đều tập trung vào reentrancy hoặc oracle, nhưng ít ai nghĩ rằng validator có thể phối hợp để tạo ra một block với timestamp chênh lệch lớn. Trên thực tế, với MEV, các validator có thể sắp xếp giao dịch và chọn timestamp trong khoảng cho phép. Kẻ tấn công có thể trả phí gas cao để đảm bảo giao dịch của mình nằm ở vị trí chiến lược. Nếu bạn đọc kỹ whitepaper của YieldFi, họ có viết: "Phần thưởng được phân phối dựa trên thời gian trôi qua, đảm bảo công bằng cho tất cả người dùng." Nhưng họ không nói rằng thời gian đó có thể bị thao túng. Đây không phải là lỗi của hợp đồng thông minh, mà là lỗi của mô hình kinh tế học dựa trên giả định thời gian tuyến tính. Trong một hệ thống phi tập trung, thời gian là rời rạc và có thể bị ảnh hưởng bởi những người tham gia mạnh nhất.

Takeaway

Sự kiện YieldFi cho thấy một xu hướng đáng lo ngại: các giao thức DeFi đang tích hợp ngày càng nhiều tự động hóa (auto-compound, auto-restake) mà không tính đến khả năng thao túng thời gian. Nếu chúng ta nhìn vào merkle tree của các giao thức staking hàng đầu, hầu hết đều dùng block.timestamp trong công thức tính toán. Liệu các auditor có đang kiểm tra đủ sâu giả định này không? Hay chúng ta đang ngồi trên một quả bom hẹn giờ mang tên "thời gian blockchain"?

Giá thị trường

Tiền điện tử Giá 24h
BTC Bitcoin
$77,562.1 -2.90%
ETH Ethereum
$2,436.21 -2.55%
SOL Solana
$103.59 -3.59%
BNB BNB Chain
$688.5 -3.42%
XRP XRP Ledger
$1.38 -3.08%
DOGE Dogecoin
$0.0848 -3.68%
ADA Cardano
$0.2003 -4.76%
AVAX Avalanche
$7.28 -2.80%
DOT Polkadot
$0.8408 -3.51%
LINK Chainlink
$11.34 -4.03%

Sợ & Tham

68

Tham lam

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
18
03
unlock Mở khóa token Sui

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

12
05
halving BCH Halving

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

08
04
upgrade Solana Firedancer

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

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

15
04
halving Bitcoin Halving

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

22
03
unlock Mở khóa Optimism

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

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

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

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

Tất cả →
1
Bitcoin
BTC
$77,562.1
1
Ethereum
ETH
$2,436.21
1
Solana
SOL
$103.59
1
BNB Chain
BNB
$688.5
1
XRP Ledger
XRP
$1.38
1
Dogecoin
DOGE
$0.0848
1
Cardano
ADA
$0.2003
1
Avalanche
AVAX
$7.28
1
Polkadot
DOT
$0.8408
1
Chainlink
LINK
$11.34

🧮 Công cụ

Tất cả →

Chỉ số mùa altcoin

41

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

🔴
0xccb7...008c
3 giờ trước
Chuyển ra
2,081,486 USDC
🔴
0x9831...9b6b
30 phút trước
Chuyển ra
222,338 DOGE
🟢
0xa156...aa4f
12 giờ trước
Chuyển vào
788,460 DOGE

💡 Smart Money

0xb867...2eed
Nhà giao dịch on-chain dày dặn
+$0.7M
92%
0x41f1...91fe
Thợ đào DeFi hàng đầu
+$3.3M
82%
0x7ffe...b8a6
Nhà đầu tư sớm
+$1.0M
68%