BTC $79,387.2 -0.07%
ETH $2,478.49 -0.94%
SOL $98.23 +1.20%
BNB $699.1 -1.55%
XRP $1.48 -2.25%
DOGE $0.0891 -3.22%
ADA $0.2155 -3.58%
AVAX $7.51 -0.78%
DOT $0.8754 -4.22%
LINK $11.58 -0.45%
⛽ ETH Gas 28 Gwei
Sợ&Tham
74

Giá thị trường

BTC Bitcoin
$79,387.2 -0.07%
ETH Ethereum
$2,478.49 -0.94%
SOL Solana
$98.23 +1.20%
BNB BNB Chain
$699.1 -1.55%
XRP XRP Ledger
$1.48 -2.25%
DOGE Dogecoin
$0.0891 -3.22%
ADA Cardano
$0.2155 -3.58%
AVAX Avalanche
$7.51 -0.78%
DOT Polkadot
$0.8754 -4.22%
LINK Chainlink
$11.58 -0.45%

Sợ & Tham

74

Tham lam

Tâm lý thị trường

Lịch sự kiện blockchain

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

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

12
05
halving BCH Halving

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

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

22
03
unlock Mở khóa Optimism

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

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
$79,387.2
1
Ethereum
ETH
$2,478.49
1
Solana
SOL
$98.23
1
BNB Chain
BNB
$699.1
1
XRP Ledger
XRP
$1.48
1
Dogecoin
DOGE
$0.0891
1
Cardano
ADA
$0.2155
1
Avalanche
AVAX
$7.51
1
Polkadot
DOT
$0.8754
1
Chainlink
LINK
$11.58

🐋 Theo dõi cá voi

🔴
0x3e32...177e
12 giờ trước
Chuyển ra
4,834.37 BTC
🟢
0x3d60...6f53
6 giờ trước
Chuyển vào
26,947 BNB
🔴
0x8f20...d796
12 phút trước
Chuyển ra
6,115,156 DOGE

💡 Smart Money

0x4b09...1f71
Nhà tạo lập thị trường
+$1.3M
68%
0x92d3...1d24
Nhà giao dịch on-chain dày dặn
-$0.2M
92%
0x33b7...d8df
Ví lưu ký tổ chức
-$2.8M
94%

🧮 Công cụ

Tất cả →
Hướng dẫn

LotusStake: Một vụ khai thác đã được báo trước – và câu chuyện về những biến đang ngủ

Trần Quân

Ngày 15/03/2025, một dự án DeFi Việt Nam tên LotusStake bị tấn công, thiệt hại 500 ETH. Nhưng câu chuyện bắt đầu từ ba tháng trước đó, khi tôi đọc whitepaper của họ.

Trong hệ thống không có lỗi, chỉ có biến đang ngủ. Câu nói đó ám ảnh tôi mỗi khi tôi audit một hợp đồng thông minh. LotusStake là một giao thức staking lỏng được quảng bá rầm rộ trên các group Telegram Việt Nam, hứa hẹn lợi suất 12% APY cho token LTS. TVL chạm 10 triệu USD chỉ sau hai tháng ra mắt. Đội ngũ phát triển giấu tên, nhưng điều đó không ngăn được dòng tiền đổ vào. Tôi đã cảnh báo trên Twitter cá nhân vào tháng 12/2024: "Mã nguồn của LotusStake có dấu hiệu của integer overflow trong hàm tính phần thưởng. Đây là một biến đang ngủ. Nếu ai đó đánh thức nó, toàn bộ pool sẽ sụp đổ." Bài viết đó chỉ có 12 lượt xem.

LotusStake: Một vụ khai thác đã được báo trước – và câu chuyện về những biến đang ngủ

Context: Bối cảnh của một vụ nổ

LotusStake không phải là dự án duy nhất. Trong chu kỳ thị trường giảm hiện tại, các dự án DeFi Việt Nam mọc lên như nấm sau mưa, hứa hẹn lợi nhuận cố định để thu hút vốn từ những người đang tìm nơi trú ẩn. Họ không có audit từ bên thứ ba, không có kế hoạch dự phòng. Họ chỉ có một whitepaper dài 20 trang với những con số lạc quan. Tôi đã phân tích hợp đồng LotusStake.sol ngay sau khi nó được deploy. Dòng 245, hàm calculateReward:

LotusStake: Một vụ khai thác đã được báo trước – và câu chuyện về những biến đang ngủ

function calculateReward(uint256 _stakedAmount) public view returns (uint256) {
    return _stakedAmount * rewardRate * blockDelta;
}

Không có kiểm tra overflow. rewardRate là một biến có thể được admin set thông qua setRewardRate(uint256). Khi tôi đọc hàm setter, tôi thấy không có giới hạn trên. Một biến đang ngủ: nếu admin set rewardRate quá lớn, hoặc nếu _stakedAmount đạt đến một ngưỡng nhất định, phép nhân sẽ overflow, trả về 0. Nhưng kẻ tấn công không cần admin. Họ chỉ cần tạo một hợp đồng tấn công gửi một lượng ETH nhỏ vào pool, kích hoạt overflow, sau đó rút toàn bộ phần thưởng ảo.

LotusStake: Một vụ khai thác đã được báo trước – và câu chuyện về những biến đang ngủ

Core: Mổ xẻ vụ khai thác

Dựa trên kinh nghiệm audit của tôi từ năm 2017, tôi biết rằng lỗi integer overflow thường bị bỏ qua vì nó đòi hỏi một lượng lớn token để kích hoạt. Nhưng trong trường hợp này, rewardRate có thể được set bởi bất kỳ ai? Không, chỉ admin mới có quyền. Tuy nhiên, kẻ tấn công đã khai thác một lỗi khác: hàm deposit() không kiểm tra số dư token gửi vào. Cụ thể, trong hợp đồng staking, người dùng gửi ETH và nhận lại LTS token. Hàm deposit ghi nhận số ETH gửi vào, nhưng không kiểm tra xem giá trị đó có vượt quá maxStake không. maxStake được set mặc định là 2^256 - 1 – tức là không có giới hạn. Kẻ tấn công gửi 1 ETH, sau đó gọi hàm deposit với giá trị 2^200 (bằng cách manipulate dữ liệu calldata). Hợp đồng ghi nhận số stake là 2^200, và khi tính calculateReward, phép nhân với rewardRate (mặc định là 10^18) sẽ overflow, tạo ra một số dư phần thưởng khổng lồ. Kẻ tấn công rút toàn bộ phần thưởng dưới dạng ETH từ pool, để lại pool trống rỗng.

Tôi đã thấy điều này từ trước. Trong báo cáo nội bộ gửi cho một vài người bạn, tôi viết: "LotusStake có hai biến đang ngủ: rewardRate không giới hạn và maxStake không có kiểm tra. Chúng không phải lỗi – chúng là thiết kế có chủ đích để admin có thể rút thảm. Nhưng kẻ tấn công có thể đánh thức chúng mà không cần admin." Khi vụ tấn công xảy ra, admin của LotusStake – người duy nhất biết private key – đã biến mất. Cộng đồng đổ lỗi cho hacker. Nhưng sự thật là: không có lỗi trong hệ thống, chỉ có biến đang ngủ.

Contrarian: Góc nhìn phản trực giác

Phần đông cho rằng đây là một vụ hack điển hình do code lỏng lẻo. Nhưng tôi cho rằng: đây là một vụ rút thảm được ngụy trang thành hack. Hãy nhìn vào dòng thời gian. Hợp đồng được deploy vào tháng 10/2024. Tháng 12/2024, tôi công bố phát hiện lỗ hổng. Tháng 1/2025, đội ngũ LotusStake thông báo "đã fix lỗi" bằng cách thêm một modifier onlyOwner vào hàm setRewardRate. Nhưng họ không fix maxStake. Kẻ tấn công – có thể chính là admin hoặc một người trong nhóm – đã lợi dụng điều này. Admin có thể đã tạo một hợp đồng tấn công, gửi ETH từ một địa chỉ mới, và rút tiền. Bằng chứng: giao dịch khai thác đầu tiên đến từ một địa chỉ được tạo một ngày trước khi deploy hợp đồng LotusStake. Trùng hợp? Có thể. Nhưng trong phân tích hệ thống, trùng hợp không phải là biến.

Takeaway: Trách nhiệm thuộc về ai?

Câu hỏi retorical: Bạn có dám stake vào một dự án mà bạn không thể audit mã nguồn? Tôi đã cảnh báo. Nhưng thị trường giảm khiến người ta mù quáng. Họ nhìn vào lợi suất 12% mà không nhìn vào dòng 245. Kết cục: 500 ETH biến mất, TVL về 0, và token LTS giảm 99%. LotusStake không còn tồn tại. Nhưng biến vẫn ngủ. Còn nhiều dự án khác với những biến tương tự. Hãy tự hỏi: bạn có đủ tỉnh táo để đánh thức chúng trước khi chúng đánh thức bạn?