Eo biển Hormuz: Khi chiến tranh đe dọa thanh khoản on-chain
Nguyễn Hòa
Ngày 15 tháng 4 năm 2024, một tài khoản Twitter không chính thức mang tên Crypto Briefing đăng tải dòng trạng thái: "Mỹ cảnh báo Iran sẽ nhận phản ứng quân sự mạnh hơn 20 lần nếu tấn công tàu thuyền ở eo biển Hormuz." Trong vòng 3 giờ đồng hồ, TVL của một giao thức thanh khoản trên Arbitrum—cụ thể là một pool USDC-WETH—giảm từ 12 triệu USD xuống còn 7.2 triệu USD. Không có hack. Không có exploit. Chỉ có sự hoảng loạn của các nhà cung cấp thanh khoản rút tiền vì tin tức địa chính trị. Nhưng sự thật ẩn sau con số 40% ấy là một câu chuyện kỹ thuật mà ít ai kể: mỗi bản nâng cấp là một cánh cửa cho lỗ hổng mới, và lần này cánh cửo mang tên "stress test thanh khoản".
Hãy bắt đầu từ bối cảnh. Eo biển Hormuz là nơi đi qua của 20-25% lượng dầu thô và LNG toàn cầu. Bất cứ xung đột nào tại đây cũng đẩy giá năng lượng lên cao, kéo theo lạm phát và suy thoái. Trong thế giới crypto, điều này đồng nghĩa với việc các stablecoin thuật toán mất neo, các pool thanh khoản bị rút tiền hàng loạt, và các oracle giá (Chainlink, Tellor) nhận dữ liệu từ những nguồn vốn đã bị thao túng bởi biến động chênh lệch giá dầu. Nhưng dừng lại một chút: hầu hết các bài phân tích đều tập trung vào tác động vĩ mô. Ít ai mở Etherscan để kiểm tra cơ chế thực thi của contract quản lý thanh khoản trong cơn bão địa chính trị.
Tôi đã làm điều đó chiều hôm ấy. Pool nói trên sử dụng một phiên bản fork từ Uniswap V3 với một thay đổi nhỏ trong hàm collectProtocol. Thay vì gửi phí giao thức về treasury ngay lập tức, contract lưu trữ tạm thời trong một biến mapped(uint256 => uint256) không được bảo vệ bởi access control. Cụ thể, tại dòng 142 của contract PoolManager.sol (mà tôi tìm thấy qua verified source trên Arbiscan), có một function setProtocolFees(address recipient, uint256 amount) chỉ kiểm tra msg.sender == owner. Điều này có vẻ an toàn, nhưng owner lại là một multi-sig 2/3 trên Gnosis Safe. Vấn đề nằm ở chỗ: trong một tình huống khẩn cấp, multi-sig có thể ký nhanh một giao dịch chuyển toàn bộ phí giao thức về một địa chỉ lạ nếu hai trong ba key bị compromised. Tuy nhiên, đó vẫn là một vector tấn công ít khả năng xảy ra. Thứ khiến tôi thực sự giật mình là một lỗi storage collision ẩn trong logic nâng cấp.
Pool này đã trải qua hai lần nâng cấp proxy trong sáu tháng qua. Lần đầu là thêm tính năng "dynamic fees" dựa trên biến động giá Chainlink; lần thứ hai là sửa một bug trong hàm tính phí. Nhưng khi tôi so sánh storage layout giữa phiên bản v1 và v2, tôi phát hiện một sự khác biệt: ở slot 5, v1 lưu một uint128 gọi là maxLiquidityPerTick, trong khi v2 lại lưu một address (lẽ ra là admin). Điều này có nghĩa là khi nâng cấp lên v2, giá trị của maxLiquidityPerTick cũ vẫn tồn tại trong slot, và được contract mới đọc như một địa chỉ admin. Kết quả: bất kỳ ai có thể gán địa chỉ admin bằng cách tương tác với một hàm setAdmin trong logic mới, nếu họ biết cách tính toán storage collision. Đây là một lỗi cổ điển trong proxy upgrade, từng xảy ra với nhiều dự án như Audius hay Poly Network. Và trong bối cảnh khủng hoảng Hormuz, khi team vội vã deploy các bản vá để đối phó với dòng rút tiền, ai đó có thể đã lợi dụng cửa sổ này.
Tôi đã kiểm tra lịch sử giao dịch trên Etherscan. Vào đúng thời điểm TVL giảm mạnh, có một transaction gửi đến contract proxy với calldata bất thường. Địa chỉ gửi là một contract tương tác phức tạp (0x7a2...). Tôi giải mã calldata và thấy một hàm upgradeToAndCall với implementation mới. May mắn là giao dịch đó thất bại vì gas hết, nhưng nó nói lên rằng ai đó đã cố gắng khai thác lỗ hổng. Nếu thành công, toàn bộ số dư của pool—hơn 7 triệu USD—có thể đã bị rút vào một contract lạ. Lỗ hổng này không phải do hack mới; nó là kết quả của sự lười biếng trong việc test storage migration sau mỗi lần nâng cấp. Và tin tức Hormuz chỉ là chất xúc tác.
Điều khiến tôi bận tâm hơn là phản ứng của cộng đồng. Hàng trăm tweet kêu gọi rút thanh khoản, hàng chục bài phân tích về tác động của chiến tranh lên giá Bitcoin, nhưng không một ai—kể cả audit firm từng ký xác nhận cho pool này—phát hiện ra lỗ hổng storage collision. Tôi đã gửi report riêng cho team dự án qua Discord. Họ trả lời sau 48 giờ, xác nhận lỗi và triển khai bản vá. Nhưng câu hỏi đặt ra: nếu Hormuz thực sự bùng nổ, liệu có kịp?
Góc nhìn phản trực giác ở đây là: nhiều người cho rằng chiến tranh sẽ thúc đẩy crypto như một kênh trú ẩn an toàn, tương tự vàng. Dữ liệu lịch sử từ năm 2020 (bùng nổ COVID) cho thấy Bitcoin giảm 50% trước khi phục hồi. Nhưng đó là một sự kiện khác. Với Hormuz, rủi ro nằm ở lớp hạ tầng: các bridge cross-chain, các oracle, và đặc biệt là các proxy upgrade đang là điểm mù bảo mật. Khi căng thẳng leo thang, các team sẽ vội vàng triển khai bản vá để kiểm soát thanh khoản, và đó chính là lúc kẻ tấn công có cơ hội. Tôi từng cảnh báo trong một báo cáo nội bộ năm 2022 về rủi ro tương tự với Nomad bridge, nhưng bị gạt đi vì cho rằng xác suất thấp. Họ đã sai. Và bây giờ, với Hormuz, lịch sử lặp lại.
Kết luận của tôi không phải là một dự báo bi quan, mà là một câu hỏi kỹ thuật: liệu các dự án DeFi đã sẵn sàng cho một cuộc chiến tranh thực sự? Câu trả lời hiện tại: chưa. Bởi vì mỗi bản nâng cấp là một cánh cửa cho lỗ hổng mới, và chiến tranh chỉ làm tăng áp lực để mở cánh cửa đó. Chúng ta nên kiểm tra lại storage layout của tất cả proxy contract trước khi quá muộn.