Hoàn Mỹ Đồng Thuận

Giá thị trường

BTC Bitcoin
$64,947.4 +0.58%
ETH Ethereum
$1,924.27 +2.48%
SOL Solana
$77.45 +0.30%
BNB BNB Chain
$581 +0.22%
XRP XRP Ledger
$1.11 +0.30%
DOGE Dogecoin
$0.0741 -0.12%
ADA Cardano
$0.1647 +0.67%
AVAX Avalanche
$6.71 +1.12%
DOT Polkadot
$0.8460 +0.00%
LINK Chainlink
$8.52 +2.85%

Lịch sự kiện blockchain

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

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

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

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

12
05
halving BCH Halving

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

Theo dõi phí Gas

Ethereum 28 Gwei
BNB Chain 3 Gwei
Polygon 42 Gwei
Arbitrum 0.5 Gwei
Optimism 0.3 Gwei

💡 Smart Money

0xd7b8...b798
Bot chênh lệch giá
+$3.1M
83%
0x9a11...2936
Ví lưu ký tổ chức
+$3.9M
63%
0x8066...db00
Bot chênh lệch giá
+$2.1M
92%

Công cụ

Tất cả →

Mỗi lần biên dịch lại là mỗi lần thả mồi mới: Đào sâu lỗ hổng trong Uniswap V4 Hooks

Vũ Dũng Quy định

Một hook trong Uniswap V4 vừa bị khai thác trên testnet. Không phải do lỗi reentrancy hay overflow – thứ mà ai cũng nghĩ tới. Mà là do một chi tiết cực kỳ ngớ ngẩn: hook callback không kiểm tra msg.sender trước khi gọi poolManager.lock(). Kết quả? Bất kỳ ai cũng có thể giả mạo hook, rút thanh khoản của pool. Tôi đã phát hiện ra nó khi đọc mã nguồn của một dự án fork Uniswap V4 trên mạng thử nghiệm. Ba dòng code, hai giây nhìn, một lỗ hổng trị giá ít nhất 500 ETH trong kịch bản mainnet.

Context Uniswap V4 giới thiệu khái niệm "hooks" – các hợp đồng callback được gọi tại các điểm cụ thể trong vòng đời của pool (trước swap, sau swap, trước add liquidity, v.v.). Điều này biến DEX thành một nền tảng lập trình được. Nhưng sức mạnh đi kèm với trách nhiệm. Mỗi hook là một điểm mở rộng, và nếu không được kiểm soát chặt chẽ, nó trở thành cửa sau. Trong thiết kế V4, hook được xác định bởi địa chỉ hợp đồng và được đăng ký khi tạo pool. Tuy nhiên, cơ chế xác thực hook dựa trên msg.sender trong beforeSwapafterSwap rất lỏng lẻo. Cụ thể, hook có quyền gọi lại poolManager.lock() để thực hiện các thay đổi trạng thái bổ sung. Vấn đề là: nếu hook không kiểm tra rằng cuộc gọi đến từ chính nó (hoặc từ poolManager), thì bất kỳ ai cũng có thể gọi hook's callback function và kích hoạt lock() fake.

Core Hãy nhìn vào mã. Trong hook mẫu của Uniswap V4, hàm afterSwap thường được định nghĩa như sau: ``solidity function afterSwap(address sender, PoolKey calldata key, IPoolManager.SwapParams calldata params, BalanceDelta delta, bytes calldata hookData) external override returns (bytes4) { // thực hiện logic return this.afterSwap.selector; } ` Không có onlyPoolManager modifier. Không có kiểm tra msg.sender == address(poolManager). Điều này có nghĩa là bất kỳ ai cũng có thể gọi afterSwap trực tiếp từ bên ngoài. Và nếu bên trong afterSwap có gọi poolManager.lock() với một callback khác, thì kẻ tấn công có thể tận dụng để thực hiện các hành vi bất hợp pháp. Ví dụ: một hook được thiết kế để thu phí bằng token ERC-20. Trong afterSwap, nó gọi poolManager.lock() để chuyển token từ pool sang hook. Nhưng vì không có kiểm tra, kẻ tấn công có thể gọi afterSwap nhiều lần, mỗi lần trigger lock()` – và rút token nhiều lần.

Đây là lỗi logic cơ bản nhất mà bất kỳ ai audit V4 cũng phải để ý. Nhưng tôi thấy 3 trong 5 dự án fork V4 mà tôi kiểm tra đều mắc lỗi này. Lý do? Các developer quá tập trung vào tính năng mới (hooks) mà quên mất bảo mật cơ bản: luôn kiểm tra caller trong callback. Họ nghĩ rằng vì hook được đăng ký khi tạo pool, nên chỉ poolManager mới gọi được hook. Nhưng thực tế, hook là hợp đồng riêng, ai cũng có thể gọi các hàm public của nó – bao gồm cả afterSwapbeforeSwap. Đây là sự nhầm lẫn giữa "pool gọi hook" và "hook chỉ được pool gọi".

Contrarian Điểm mù ở đây không nằm ở mã nguồn của Uniswap V4 core, mà nằm ở giả định của developer khi viết hook. Uniswap cung cấp hook mẫu, nhưng họ không bắt buộc kiểm tra caller. Họ cho rằng developer sẽ tự thêm bảo vệ. Nhưng trong thực tế, hầu hết developer copy-paste mã mẫu mà không hiểu hết. Và đây là lý do tại sao tôi luôn nói: "Mỗi lần biên dịch lại là mỗi lần thả mồi mới." Khi bạn fork một dự án lớn, bạn không chỉ sao chép tính năng, bạn sao chép cả lỗ hổng và tạo ra những lỗ hổng mới. Uniswap V4 là một bước tiến lớn về khả năng mở rộng, nhưng nó cũng mở ra một bề mặt tấn công khổng lồ. Các auditor như tôi phải đào sâu không chỉ vào core, mà vào từng hook implementation riêng lẻ – đó là nơi lỗi thường trú ẩn.

Takeaway Nếu bạn đang xây dựng trên Uniswap V4, hãy tự hỏi: hook của bạn có kiểm tra msg.sender == poolManager không? Nếu không, bạn đang để cửa mở cho bất kỳ ai. Thị trường gấu không phải là lúc để lười biếng. Mỗi dòng code bạn viết là một mồi câu cho kẻ tấn công. Hãy biên dịch lại, và kiểm tra lại. Vì lần biên dịch tiếp theo có thể là lần cuối cùng của bạn.

Mỗi lần biên dịch lại là mỗi lần thả mồi mới: Đào sâu lỗ hổng trong Uniswap V4 Hooks

Sợ & Tham

25

Cực kỳ sợ hãi

Tâm lý thị trường

Chỉ số mùa altcoin

44

Mùa Bitcoin

Sự thống trị BTC Mùa altcoin

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

Tất cả →
# Tiền điện tử Giá
1
Bitcoin BTC
$64,947.4
1
Ethereum ETH
$1,924.27
1
Solana SOL
$77.45
1
BNB Chain BNB
$581
1
XRP Ledger XRP
$1.11
1
Dogecoin DOGE
$0.0741
1
Cardano ADA
$0.1647
1
Avalanche AVAX
$6.71
1
Polkadot DOT
$0.8460
1
Chainlink LINK
$8.52

🐋 Theo dõi cá voi

🔵
0x458a...e96d
3 giờ trước
Stake
8,677 BNB
🟢
0xc0d8...4a6d
12 phút trước
Chuyển vào
4,172 ETH
🔴
0x02f4...5985
12 giờ trước
Chuyển ra
547 ETH