Flash Loan Attack: Lỗ Hổng 'Reentrancy Ẩn' Trong RWA On-chain

DAO | Võ Thủy |

Mỗi lần kiểm toán là một lần tôi đặt câu hỏi: 'Nếu một protocol dùng Chainlink, sao nó vẫn bị reentrancy?'. Tuần trước, tôi nhận một smart contract từ một RWA project. Họ tự hào: 'Chúng tôi đã audit bởi 3 firm'. Nhưng tôi chỉ cần 10 phút để thấy một dòng code nguy hiểm: price = aggregator.latestRoundData().answer. Nó gọi safeTransfer bên trong, nhưng quên khóa reentrancy guard. Đây không phải bug của Chainlink. Đây là bug do ai đó copy-paste từ Uniswap V2 mà không hiểu tại sao Uniswap dùng require trước khi chuyển token. RWA on-chain đang làm tôi nhớ lại năm 2021: ai cũng muốn lên sàn nhanh, ai cũng quên audit thực sự.

Flash Loan Attack: Lỗ Hổng 'Reentrancy Ẩn' Trong RWA On-chain

Bối cảnh: RWA là câu chuyện kể của ba năm qua. Mọi người nói về việc đưa trái phiếu, bất động sản lên chain. Nhưng ít ai hỏi: 'Các tổ chức truyền thống có cần public chain của bạn không?'. Tôi đã audit gần 20 RWA project. Hầu hết đều copy cơ chế oracle từ DeFi cũ. Họ lấy giá từ Chainlink, nhưng quên rằng Chainlink feed không được thiết kế cho tài sản thanh khoản thấp. Một token RWA có thể chỉ có 5% giá trị thanh khoản trên Uniswap V3. Khi một flash loan tấn công, nó không cần thay đổi giá oracle. Nó chỉ cần tạo ra một vòng lặp: borrow → swap → deposit → borrow lại. Vì contract không có reentrancy guard, nó cho phép gọi lại hàm withdraw trước khi cập nhật số dư. Tôi đã thấy một bug tương tự trong Bancor năm 2017.

Core của vấn đề: Reentrancy không chỉ là gọi hàm bên ngoài. Nó là bất kỳ hành động nào cho phép contract gọi lại chính nó trước khi trạng thái được cập nhật. Trong RWA project tôi audit, họ dùng safeTransfer để gửi tiền cho user. Hàm safeTransfer của OpenZeppelin có callback. Nếu user là một contract độc hại, nó có thể gọi lại hàm withdraw của RWA contract. Code gốc: uint256 balance = balances[msg.sender]; require(balance >= amount); safeTransfer(token, msg.sender, amount); balances[msg.sender] -= amount;. Bạn thấy lỗi không? balances được cập nhật sau safeTransfer. Nếu callback gọi withdraw lần hai, balance vẫn là giá trị cũ. Kết quả: user rút gấp đôi số tiền. Đây là lỗi 'checks-effects-interactions' cổ điển. Nhưng nhiều developer vẫn mắc vì họ copy code từ contract 'trusted' mà không hiểu. Dựa trên kinh nghiệm audit của tôi, 70% RWA project có ít nhất một reentrancy bug dạng này.

Flash Loan Attack: Lỗ Hổng 'Reentrancy Ẩn' Trong RWA On-chain

Góc nhìn phản trực giác: Flash loan attack không cần oracle manipulation. Mọi người nghĩ flash loan chỉ để thao túng giá. Nhưng trong trường hợp này, attacker không cần thay đổi giá. Họ chỉ cần tận dụng lỗi reentrancy để rút toàn bộ thanh khoản. Tại sao điều này nguy hiểm hơn? Vì oracle manipulation có thể bị phát hiện qua off-chain monitoring (ví dụ: Chainlink phân phối dữ liệu từ nhiều nguồn). Reentrancy tấn công diễn ra trong một block. Nó gần như không thể phát hiện trước khi giao dịch hoàn thành. Một lần tôi audit một project Bridged USDC trên BSC. Họ có 10 triệu USDC trong pool. Chỉ cần một flash loan 10 triệu USDC, attacker có thể rút toàn bộ trong 2 lần gọi withdraw. Kết quả: pool mất 10 triệu, attacker lãi 10 triệu. Đây không phải lỗi toán học. Đây là lỗi logic về thứ tự cập nhật trạng thái.

Flash Loan Attack: Lỗ Hổng 'Reentrancy Ẩn' Trong RWA On-chain

Takeaway: Tôi không tin RWA on-chain sẽ thành công nếu code vẫn như 2016. Mỗi lần kiểm toán là một lần tôi thấy lỗi mới từ lỗi cũ. Reentrancy đã được biết đến 8 năm. Nhưng vì các project mới vội vàng launch, họ lặp lại lịch sử. Câu hỏi của tôi cho các developer: Bạn có chắc contract của bạn an toàn khi user có thể gọi lại nó trong một block không? Nếu câu trả lời là 'chắc rồi', hãy deploy và gọi cho tôi. Tôi sẽ mất 5 phút để proof bạn sai.

Giá thị trường

BTC Bitcoin
$63,052.1 +0.54%
ETH Ethereum
$1,871.82 +0.33%
SOL Solana
$72.82 -0.46%
BNB BNB Chain
$577.6 -1.42%
XRP XRP Ledger
$1.06 +0.09%
DOGE Dogecoin
$0.0701 +1.36%
ADA Cardano
$0.1730 +2.37%
AVAX Avalanche
$6.37 -0.62%
DOT Polkadot
$0.7784 +2.75%
LINK Chainlink
$8.1 -0.42%

Sợ & Tham

27

Sợ hãi

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
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%

15
04
halving Bitcoin Halving

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

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

18
03
unlock Mở khóa token Sui

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

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

12
05
halving BCH Halving

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

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

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

Tất cả →
1
Bitcoin
BTC
$63,052.1
1
Ethereum
ETH
$1,871.82
1
Solana
SOL
$72.82
1
BNB Chain
BNB
$577.6
1
XRP Ledger
XRP
$1.06
1
Dogecoin
DOGE
$0.0701
1
Cardano
ADA
$0.1730
1
Avalanche
AVAX
$6.37
1
Polkadot
DOT
$0.7784
1
Chainlink
LINK
$8.1

🐋 Theo dõi cá voi

🟢
0xd238...0f52
1 giờ trước
Chuyển vào
6,091 BNB
🔴
0x3bd0...198e
2 phút trước
Chuyển ra
9,040,752 DOGE
🔵
0x58ed...79ad
6 giờ trước
Stake
4,249,748 USDT

💡 Smart Money

0xfd5c...b54c
Nhà tạo lập thị trường
+$4.1M
85%
0xd5fa...cf97
Ví lưu ký tổ chức
+$4.4M
74%
0x4646...74e8
Nhà tạo lập thị trường
+$1.9M
67%

🧮 Công cụ

Tất cả →