Lỗ hổng reentrancy trong hợp đồng staking mới: 200 ETH đã mất, bài học cho dev

Văn hóa | Trương Tuấn |

Tối qua, một giao thức staking mới trên Arbitrum vừa bị khai thác. Kẻ tấn công rút được 200 ETH chỉ trong 3 block. Tôi đọc mã nguồn của chúng trong 10 phút, thấy ngay lỗi. withdraw() không tuân thủ checks-effects-interactions.

Họ dùng OpenZeppelin ReentrancyGuard? Không. Họ tự viết lại modifier. Và họ quên đặt nonReentrant cho hàm claimRewards. Kết quả: kẻ tấn công gọi deposit(), sau đó trong callback của transfer, gọi lại claimRewards trước khi số dư được cập nhật.

Tôi từng audit dự án "AfriCoin" năm 2017. Lỗi y hệt. Chỉ khác là lúc đó tôi phát hiện sớm, cứu được 200 ETH. Lần này, dev không test kỹ.

Hợp đồng staking này có 3 pool chính, mỗi pool cho phép người dùng stake token ERC-20 để nhận phần thưởng. Hàm withdraw(uint256 amount) thực hiện: chuyển token staking về ví, giảm stakedBalance[msg.sender], sau đó gọi _claimRewards() để chốt phần thưởng. Vấn đề: _claimRewards() gọi msg.sender.transfer(rewardAmount), và transfer này kích hoạt fallback function của contract attacker. Trong fallback, attacker gọi lại withdraw() lần nữa. Vì stakedBalance chưa giảm, lần rút thứ hai vẫn hợp lệ. Lặp lại cho đến khi hết pool.

Lỗ hổng reentrancy trong hợp đồng staking mới: 200 ETH đã mất, bài học cho dev

Điều đáng nói: hợp đồng này đã được audit bởi một công ty có tiếng. Báo cáo audit công bố trên Medium. Họ kết luận "không có lỗi reentrancy" vì cho rằng hàm withdraw có kiểm tra balanceOf từ pool. Nhưng họ bỏ qua callback. Đây là điểm mù kinh điển: audit chỉ dựa trên logic tuần tự, không mô phỏng tấn công bằng reentrancy contract.

Tôi đã thử nghiệm lại với môi trường Hardhat fork chính xác trạng thái trước khi tấn công. Chỉ cần 20 dòng Solidity để khai thác. Kẻ tấn công thực tế đã dùng bot để tự động gọi, kịp thời chớp lấy cơ hội trước khi team kịp pause contract. Tổn thất 200 ETH, tương đương 400.000 USD tại thời điểm viết bài.

Bài học: Đừng bao giờ tin vào audit một chiều. Hãy tự chạy fuzz test và kiểm tra reentrancy bằng công cụ như Slither, MythX, hoặc ít nhất là Hardhat console. Tôi từng xây bot yield farming cho Uniswap v2, biết rõ tầm quan trọng của deadline và nonReentrant. Một dòng modifier có thể cứu cả pool.

Lỗ hổng reentrancy trong hợp đồng staking mới: 200 ETH đã mất, bài học cho dev

Dự báo: Vụ này sẽ làm dấy lên làn sóng audit lại các hợp đồng staking tương tự. Các giao thức fork từ codebase này sẽ bị ảnh hưởng. Hãy kiểm tra ngay contract của bạn trước khi quá muộn.

Lỗ hổng reentrancy trong hợp đồng staking mới: 200 ETH đã mất, bài học cho dev

Giá thị trường

BTC Bitcoin
$78,856.2 -2.11%
ETH Ethereum
$2,456 -1.80%
SOL Solana
$96.57 -4.58%
BNB BNB Chain
$696 -2.48%
XRP XRP Ledger
$1.43 -4.80%
DOGE Dogecoin
$0.0864 -6.18%
ADA Cardano
$0.2100 -6.67%
AVAX Avalanche
$7.37 -3.53%
DOT Polkadot
$0.8558 -6.04%
LINK Chainlink
$11.34 -3.74%

Sợ & Tham

65

Tham lam

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
12
05
halving BCH Halving

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

15
04
halving Bitcoin Halving

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

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

22
03
unlock Mở khóa Optimism

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

18
03
unlock Mở khóa token Sui

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

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

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

08
04
upgrade Solana Firedancer

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

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

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

Tất cả →
1
Bitcoin
BTC
$78,856.2
1
Ethereum
ETH
$2,456
1
Solana
SOL
$96.57
1
BNB Chain
BNB
$696
1
XRP Ledger
XRP
$1.43
1
Dogecoin
DOGE
$0.0864
1
Cardano
ADA
$0.2100
1
Avalanche
AVAX
$7.37
1
Polkadot
DOT
$0.8558
1
Chainlink
LINK
$11.34

🐋 Theo dõi cá voi

🔵
0xbd11...661b
1 ngày trước
Stake
49,329 BNB
🟢
0x2984...e2bb
30 phút trước
Chuyển vào
1,455 ETH
🔵
0x76ce...9ea5
3 giờ trước
Stake
1,800 ETH

💡 Smart Money

0x7a76...4136
Nhà đầu tư sớm
+$1.9M
77%
0xe7fb...76f9
Thợ đào DeFi hàng đầu
+$3.0M
71%
0x57d2...bd7f
Nhà giao dịch on-chain dày dặn
+$1.5M
79%

🧮 Công cụ

Tất cả →