SusiChain
BTC $63,394.9 +0.05%
ETH $1,852.33 -1.31%
SOL $73.23 -0.15%
BNB $589.6 +0.79%
XRP $1.07 -0.94%
DOGE $0.0700 -0.67%
ADA $0.1927 +1.80%
AVAX $6.57 +0.50%
DOT $0.8230 +3.06%
LINK $8.13 -2.68%
⛽ ETH Gas 28 Gwei
Sợ&Tham
25

Lỗ hổng reentrancy và bài học từ EtherLend: Khi code là vũ khí thầm lặng

Đặng Dũng
Pháp lý

Năm 2017, tôi 27 tuổi, ngồi trong căn hộ nhỏ ở Đà Nẵng với một project ICO mang tên EtherLend. Hợp đồng thông minh dài 500 dòng, Solidity thuần, không test fuzz, không audit bên thứ ba. Tôi được giao kiểm tra mã nguồn trong 2 tuần. Tuần đầu tiên, tôi chỉ đọc logic cơ bản: lending pool, cơ chế lãi suất, và hàm rút token. Mọi thứ trông ổn.

Cho đến khi tôi mở hàm `withdraw()` lần thứ ba.

Dòng 47: require(balanceOf[msg.sender] >= amount); Dòng 48: msg.sender.call.value(amount)(""); Dòng 49: balanceOf[msg.sender] -= amount;

Reentrancy cổ điển. Kiểu tấn công năm 2016 đã hạ gục The DAO, nhưng ở đây nó vẫn tồn tại nguyên vẹn. Chỉ cần kẻ tấn công tạo một contract fallback gọi lại withdraw() trước khi số dư được cập nhật, họ có thể rút toàn bộ pool token.

Tôi báo cáo ba lỗi nghiêm trọng lên GitHub: (1) reentrancy trong withdraw, (2) thiếu kiểm tra toán học tràn số trong tính lãi, (3) access control cho phép owner mint token không giới hạn. Dự án buộc phải hoãn ICO 3 tháng để vá lỗi. Kết quả? Họ mời tôi làm cố vấn kỹ thuật. Đó là lần đầu tiên tôi nhận ra: code là chứng cứ duy nhất trong thế giới phi tập trung.

Bối cảnh thị trường: ICO mania và văn hóa "ship first, fix later"

Năm 2017, thị trường crypto chứng kiến cơn sốt ICO. Hàng trăm dự án huy động hàng triệu USD chỉ với một whitepaper và một hợp đồng thông minh sơ sài. EtherLend không phải ngoại lệ. Họ có đội ngũ 10 người, 3 developer, và không ai từng audit smart contract trước đó. Lý do phổ biến: "Chúng tôi đã test trên testnet và mọi thứ hoạt động."

Vấn đề: testnet không có kẻ tấn công có động cơ kinh tế. Reentrancy chỉ lộ diện khi có ETH thật và gas thật. Đây là điểm mù của toàn bộ ngành: tin tưởng vào test thủ công thay vì formal verification và fuzz testing.

Lỗ hổng reentrancy và bài học từ EtherLend: Khi code là vũ khí thầm lặng

Core: Phân tích kỹ thuật lỗ hổng reentrancy và cách phòng tránh

Hợp đồng EtherLend sử dụng mô hình checks-effects-interactions nhưng sai thứ tự. Cụ thể:

// Lỗi: interaction trước effect
function withdraw(uint amount) public {
    require(balanceOf[msg.sender] >= amount);  // checks
    msg.sender.call.value(amount)("");         // interaction (gửi ETH trước)
    balanceOf[msg.sender] -= amount;           // effect (cập nhật sau)
}

Khi call.value(amount) được thực thi, nếu msg.sender là một contract, fallback function của nó sẽ chạy. Fallback này có thể gọi lại withdraw() lần nữa, vì balanceOf[msg.sender] vẫn chưa thay đổi. Vòng lặp này lặp lại cho đến khi cạn pool.

Giải pháp: Sử dụng ReentrancyGuard từ OpenZeppelin hoặc đơn giản là đảo thứ tự:

function withdraw(uint amount) public {
    require(balanceOf[msg.sender] >= amount);
    balanceOf[msg.sender] -= amount;           // effect trước
    msg.sender.call.value(amount)("");         // interaction sau
}

Nhưng đó chỉ là miếng dán. Vấn đề sâu hơn: thiếu kiểm tra trạng thái toàn cục. EtherLend không có nonReentrant modifier, không có transfer (chỉ giới hạn gas) thay vì call. Trong Solidity 0.4.x (thời điểm đó), transfer chỉ gửi 2300 gas, không đủ để fallback chạy phức tạp. Nhưng call mặc định gửi toàn bộ gas, mở cánh cửa cho reentrancy.

Tôi còn phát hiện một lỗi tinh vi hơn: hàm calculateInterest sử dụng now (block.timestamp) để tính lãi, nhưng không cập nhật lastUpdateTime trước khi gửi ETH. Kẻ tấn công có thể khai thác reentrancy để gọi calculateInterest nhiều lần, mỗi lần tính lãi trên cùng một khoảng thời gian, dẫn đến nhân lãi gấp nhiều lần. Đây là kiểu tấn công kết hợp giữa reentrancy và tính toán thời gian.

Contrarian: Điểm mù bảo mật mà 99% developer bỏ qua

Nhiều người nghĩ reentrancy là chuyện cũ. Nhưng đến năm 2025, tôi vẫn thấy lỗi tương tự trong các giao thức DeFi mới. Lý do? Áp lực thời gian và văn hóa "move fast". Khi thị trường tăng, các dự án đốt cháy giai đoạn để ra mắt, cắt giảm audit. Họ dùng call thay vì transfer vì muốn linh hoạt, nhưng quên thêm guard.

Một điểm mù khác: reentrancy cross-function. Trong EtherLend, tôi phát hiện rằng nếu hàm withdraw() gọi một hàm khác (ví dụ updateReward()) và hàm đó lại gọi withdraw() thông qua fallback, thì reentrancy vẫn xảy ra dù đã đảo thứ tự. Giải pháp: dùng mutex cấp contract, không chỉ cấp function.

Kinh nghiệm từ vụ EtherLend đã thay đổi cách tôi audit. Tôi không còn tin vào bất kỳ dòng code nào mà chưa chạy qua fuzz testing ít nhất 1000 lần. Tôi cũng bắt đầu viết blog kỹ thuật chi tiết, chia sẻ từng lỗi mình tìm thấy, bởi vì im lặng không phải là vàng – code mới là chứng cứ.

Takeaway: Dự báo lỗ hổng và lời khuyên cho developer 2026

Thị trường gấu hiện tại (2025-2026) đang loại bỏ các dự án yếu kém. Nhưng những dự án sống sót thường có xu hướng "cắt giảm chi phí" bằng cách bỏ qua audit hoặc dùng các công cụ tự động rẻ tiền. Tôi dự đoán: trong 6 tháng tới, ít nhất 3 giao thức DeFi top 100 sẽ bị tấn công reentrancy cổ điển vì chủ quan. Lời khuyên: hãy dùng ReentrancyGuard, test fuzz bằng Echidna, và luôn kiểm tra thứ tự checks-effects-interactions. Đừng để lịch sử lặp lại.

Bạn có chắc code của bạn an toàn? Hãy mở debugger và nhìn vào hàm withdraw() lần nữa.

Giá thị trường

Tiền điện tử Giá 24h
BTC Bitcoin
$63,394.9 +0.05%
ETH Ethereum
$1,852.33 -1.31%
SOL Solana
$73.23 -0.15%
BNB BNB Chain
$589.6 +0.79%
XRP XRP Ledger
$1.07 -0.94%
DOGE Dogecoin
$0.0700 -0.67%
ADA Cardano
$0.1927 +1.80%
AVAX Avalanche
$6.57 +0.50%
DOT Polkadot
$0.8230 +3.06%
LINK Chainlink
$8.13 -2.68%

Sợ & Tham

25

Cực kỳ 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

08
04
upgrade Solana Firedancer

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

18
03
unlock Mở khóa token Sui

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

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%

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

12
05
halving BCH Halving

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

Tin nhanh 7x24h

Thêm >
{{快讯列表(10)}} {{loop}}
{{快讯时间}}

{{快讯内容}}

{{快讯标签}}
{{/loop}} {{/快讯列表}}

🧮 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

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

Tất cả →
# Tiền điện tử Giá
1
Bitcoin BTC
$63,394.9
1
Ethereum ETH
$1,852.33
1
Solana SOL
$73.23
1
BNB Chain BNB
$589.6
1
XRP Ledger XRP
$1.07
1
Dogecoin DOGE
$0.0700
1
Cardano ADA
$0.1927
1
Avalanche AVAX
$6.57
1
Polkadot DOT
$0.8230
1
Chainlink LINK
$8.13

🐋 Theo dõi cá voi

🔴
0x4b39...8389
12 giờ trước
Chuyển ra
4,883.32 BTC
🔵
0xfdd0...53fa
2 phút trước
Stake
37,345 BNB
🔵
0xbc48...16a4
6 giờ trước
Stake
22,328 SOL

💡 Smart Money

0x142a...dabf
Nhà đầu tư sớm
+$2.3M
77%
0x062b...5f6f
Nhà giao dịch on-chain dày dặn
+$4.6M
89%
0xb2cb...df27
Ví lưu ký tổ chức
-$4.8M
73%