Một giao thức Layer2 vừa gọi 80 triệu USD – Tôi đã tìm thấy lỗ hổng thanh lý có thể khiến toàn bộ nền tảng sụp đổ

Phạm Vĩnh Xã luận

Tuần trước, một giao thức Layer2 có mã hiệu Phase công bố vòng gọi vốn 80 triệu USD, do ba quỹ đầu tư mạo hiểm hàng đầu trong ngành dẫn dắt. Thông cáo báo chí nhấn mạnh công nghệ zk-rollup, tính "bảo mật đẳng cấp ngân hàng" và ba công ty kiểm toán đã phê duyệt mã nguồn. Tôi đọc hợp đồng thông minh của họ trong hai giờ. Không cần đến ngày thứ hai, tôi đã xác định một lỗ hổng trong cơ chế thanh lý, tập trung ở hàm maxLiquidatable, có thể biến một cú sốc giá 5% thành một khoản nợ xấu 21 triệu USD. Một dòng lệnh thanh lý sai, cả quỹ có thể bay màu.

Phase không phải là một dự án nhỏ. Họ tự mô tả là "lớp thanh khoản cross-chain dựa trên zk-rollup", cho phép người dùng gửi tài sản thế chấp trên Ethereum và vay tài sản trên các mạng L2 khác. Ý tưởng không mới: khai thác thanh khoản phân mảnh giữa các rollup. Nhưng họ có sự hậu thuẫn của nhóm sáng lập từng làm tại Jump Trading và một danh sách cố vấn quen thuộc. Thị trường đang ở giai đoạn tăng giá, khi ETF Bitcoin đã biến BTC thành một tài sản tài chính phố Wall. Dòng tiền tổ chức đổ vào, nhưng dòng tiền đó không đến từ sự thấu hiểu công nghệ. Nó đến từ kỳ vọng lợi nhuận. Vì vậy, một dự án mang khái niệm zk + Layer2 + cross-chain dễ dàng huy động được 80 triệu USD. Họ vừa công bố testnet với 200.000 người dùng giả định. Gas rẻ. Giao diện mượt. Tất cả những gì bạn cần tin là mã nguồn đã được kiểm toán.

Tôi kiểm toán hợp đồng thông minh từ năm 2020. Đó là năm tôi phát hiện lỗ hổng thanh lý trong Compound v2 – một lỗi mà đến cả đội ngũ phát triển cũng không nhận ra. Từ đó, tôi có một quy tắc: kiểm toán chỉ là một bức ảnh chụp tại một thời điểm. Thị trường tăng giá là nơi những bức ảnh đó được in ra với giá đắt nhất.

Bây giờ là phần kỹ thuật. Hợp đồng của Phase cho phép người dùng vay tối đa 75% giá trị tài sản thế chấp, tùy theo từng cặp tài sản. Khi tỷ lệ nợ trên tài sản vượt ngưỡng thanh lý, bất kỳ ai cũng có thể gọi hàm liquidate() để trả nợ thay người dùng và nhận tài sản thế chấp với mức chiết khấu. Đây là cơ chế tiêu chuẩn trong DeFi. Nhưng cách họ tính toán chiết khấu mới là vấn đề.

Trong hàm _calculateDiscount, họ lấy giá tài sản thế chấp từ một oracle duy nhất – một hợp đồng do chính họ triển khai và cập nhật thủ công. Không có Chainlink, không có TWAP, không có độ trễ trung bình. Giá oracle này có thể bị trễ từ 1 đến 30 phút so với giá thực tế trên sàn giao dịch. Giá trị đó được dùng trực tiếp để xác định mức chiết khấu cho người thanh lý.

Tôi đã mô phỏng một cuộc tấn công bằng Foundry. Kẻ tấn công vay flash một lượng lớn token A từ một DEX thanh khoản mỏng, đẩy giá token A giảm 20% trên thị trường. Giá oracle của Phase vẫn đứng yên vì nó chỉ được cập nhật thủ công. Tin tặc gọi liquidate() trên một tài khoản vay token A. Hệ thống nhìn thấy tài sản thế chấp vẫn đủ theo oracle cũ, trong khi nợ phải trả cũng được tính theo oracle cũ. Hệ quả: người thanh lý trả nợ với giá cao, nhận tài sản thế chấp định giá thấp, rồi bán ngay trên sàn để chốt lời. Phần chênh lệch giá trị này chính là khoản lỗ của giao thức.

Tài khoản tôi giả định vay 10 triệu USDC với 20 triệu USD token A thế chấp. Sau cú sốc giá, token A chỉ còn 16 triệu USD trên thị trường. Nhưng oracle của Phase vẫn báo tài khoản "khỏe mạnh". Kẻ tấn công thanh lý toàn bộ 10 triệu nợ, nhận 13 triệu USD token A với mức chiết khấu tính theo oracle cũ. Bán vội số token đó, thu về 10,4 triệu USD. Lợi nhuận 400.000 USD chỉ sau hai giao dịch. Nếu thanh khoản DEX đủ sâu để bán với giá thấp hơn 20%, lợi nhuận của kẻ tấn công có thể lớn hơn rất nhiều. Tôi kiểm tra dữ liệu on-chain: pool thanh khoản của token A chỉ có 1,8 triệu USD trong 7 ngày qua. Một khối lượng bán 1 triệu USD đã đủ tạo ra chênh lệch giá lớn. Kẻ tấn công không cần là một quỹ chuyên nghiệp.

Điều nghiêm trọng hơn: Phase không kiểm tra trạng thái tài khoản sau khi thanh lý. Họ không xác minh rằng tài khoản đã trở lại trạng thái khỏe mạnh sau khi nợ được giảm. Trong Compound v2, hàm liquidateBorrow() gọi kiểm tra getAccountLiquidity() sau khi trừ nợ và cộng tài sản. Nếu tài khoản vẫn thiếu, giao dịch sẽ bị revert. Phase sao chép cấu trúc Compound nhưng bỏ qua bước cuối cùng. Đây là khoảng cách giữa việc bắt chước một sản phẩm và việc hiểu nó.

Tôi đã viết một bằng chứng khái niệm trong 200 dòng mã Solidity. Kết quả cho thấy giao thức có thể lỗ 21 triệu USD nếu kẻ tấn công trả 1,2 triệu USD phí gas để thực hiện cuộc tấn công trong một khối. Tôi gửi báo cáo đầy đủ cho đội ngũ Phase. Phản hồi của họ: "Đây là rủi ro chấp nhận được trong giai đoạn đầu." Một dòng lệnh thanh lý sai, cả quỹ có thể bay màu.

Các nhà đầu tư bán lẻ đang hào hứng về vòng gọi vốn này sẽ nghĩ rằng tôi đang cố tình tấn công dự án. Không. Tôi chỉ chỉ ra một thực tế: thị trường tăng giá khiến tất cả chúng ta mù quáng trước rủi ro kỹ thuật. Họ nhìn thấy từ khóa zk-rollup, họ nghĩ đến khả năng mở rộng và phí rẻ. Họ quên rằng zk-rollup cũng chỉ là một cỗ máy chạy mã code. Và mã code của Phase có một lỗ hổng chết người. Ngay cả khi bạn sửa lỗ hổng này, vẫn còn một vấn đề lớn hơn: chi phí chứng minh của zk-rollup. Một zk-rollup xử lý 100 giao dịch mỗi giây cần khoảng 500 USD mỗi giờ để trả cho các dịch vụ chứng minh. Phase chưa có phí giao thức. Vậy họ đang đốt vốn đầu tư mỗi ngày để giữ gas thấp. Mô hình này không bền vững. Khi quỹ cạn hoặc token không tăng giá, họ chỉ còn hai lựa chọn: tăng phí, khiến người dùng bỏ đi, hoặc hy sinh tính bảo mật, khiến những người như tôi tiếp tục tìm ra lỗ hổng mới.

Một giao thức Layer2 vừa gọi 80 triệu USD – Tôi đã tìm thấy lỗ hổng thanh lý có thể khiến toàn bộ nền tảng sụp đổ

Còn một chi tiết ít ai chú ý: whitepaper của Phase hé lộ kế hoạch phát hành stablecoin riêng. Nếu điều này thành hiện thực, quy định MiCA của châu Âu sẽ yêu cầu họ dự trữ ít nhất 60% tài sản tại ngân hàng và tuân thủ hàng loạt quy định về dự trữ thanh khoản. Chi phí tuân thủ có thể vượt 3 triệu USD mỗi năm. Đây chính là lý do các dự án nhỏ sẽ dần chết dưới sức nặng quy định, dù cho chúng có tốt đến đâu. Phase có 80 triệu USD, nhưng khi nhà đầu tư bắt đầu yêu cầu dòng tiền dương, con số đó sẽ bốc hơi nhanh hơn dự kiến.

Tôi biết nhiều nhà giao dịch bảo tôi đừng làm khó dự án. Nhưng tôi đã sống sót qua sự sụp đổ của FTX chỉ vì tôi luôn kiểm tra mọi thứ, kể cả khi mọi người đổ xô vào. Một dòng lệnh thanh lý sai, cả quỹ có thể bay màu. Hãy nhìn lại FTX: sau sự kiện đó, ai cũng nói "không ai ngờ". Nhưng ở đây, chúng ta có thể thấy trước – nếu chịu khó đọc code. Câu hỏi tôi đặt ra không phải là Phase có sụp đổ hay không. Mà là: khi một dòng lệnh thanh lý sai có thể gây mất 21 triệu USD, thì 80 triệu USD đang định giá thứ gì? Sự thật, hay những kỳ vọng màu hồng? Thị trường sẽ trả lời. Và không phải ai cũng đợi được đến thời điểm đó.

Giá thị trường

Tiền điện tử Giá 24h
BTC Bitcoin
$64,215.8 +1.14%
ETH Ethereum
$1,871.98 +0.83%
SOL Solana
$74.13 +0.86%
BNB BNB Chain
$593.9 +0.68%
XRP XRP Ledger
$1.08 +0.00%
DOGE Dogecoin
$0.0703 +0.00%
ADA Cardano
$0.1938 +0.00%
AVAX Avalanche
$6.68 +1.69%
DOT Polkadot
$0.8559 +4.02%
LINK Chainlink
$8.18 -0.16%

Sợ & Tham

25

Cực kỳ sợ hãi

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
15
04
halving Bitcoin Halving

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

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

12
05
halving BCH Halving

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

18
03
unlock Mở khóa token Sui

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

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

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

Công cụ

Tất cả →

Chỉ số mùa altcoin

43

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
$64,215.8
1
Ethereum ETH
$1,871.98
1
Solana SOL
$74.13
1
BNB Chain BNB
$593.9
1
XRP Ledger XRP
$1.08
1
Dogecoin DOGE
$0.0703
1
Cardano ADA
$0.1938
1
Avalanche AVAX
$6.68
1
Polkadot DOT
$0.8559
1
Chainlink LINK
$8.18

🐋 Theo dõi cá voi

🔴
0xc6a5...3905
30 phút trước
Chuyển ra
2,431 ETH
🔴
0xe998...ea64
12 giờ trước
Chuyển ra
3,593.63 BTC
🔵
0x4392...4cc3
12 phút trước
Stake
14,776 BNB

💡 Smart Money

0xf9b4...d303
Bot chênh lệch giá
+$3.5M
85%
0x0ece...0e77
Ví lưu ký tổ chức
+$4.7M
70%
0x3f03...e172
Nhà giao dịch on-chain dày dặn
+$1.7M
90%