Somalisan

Lỗi không đến từ code, mà từ giả định: Bẫy chết người trong phân tích zk-rollup

Vũ Hưng ETF

Hook

Trong 7 ngày qua, một giao thức zk-rollup hàng đầu đã chứng kiến TVL giảm 40% chỉ sau một đêm. Nguyên nhân? Một báo cáo phân tích an ninh sai lầm được công bố rộng rãi, khiến LP hoảng loạn rút thanh khoản. Nhưng lỗi không nằm ở hợp đồng thông minh – nó nằm ở giả định về dữ liệu đầu vào. Lỗi không đến từ code, mà từ giả định.

Context

zk-rollup là giải pháp scaling Layer2 sử dụng bằng chứng không kiến thức (zero-knowledge proof) để xác thực hàng loạt giao dịch off-chain. Để một giao thức được coi là “trustless”, cộng đồng cần kiểm tra tính đúng đắn của bộ xác minh (verifier) và các tham số công khai (public inputs). Thông thường, các nhà phân tích kỹ thuật mở mã nguồn, chạy thử nghiệm, và đưa ra kết luận dựa trên code hiển thị. Nhưng đây chính là điểm mù: họ quên rằng tính toàn vẹn của một zk-rollup không chỉ phụ thuộc vào code, mà còn vào giả định về cách dữ liệu được cung cấp cho bộ chứng minh (prover).

Core

Hãy xem xét trường hợp cụ thể: một giao thức zk-rollup phổ biến sử dụng trusted setup cho các tham số của SNARK. Khi kiểm toán, nhóm phân tích tập trung vào hợp đồng verifier – họ thấy mọi thứ đều ổn: các ràng buộc logic đúng, không có lỗi overflow, không có reentrancy. Họ kết luận “giao thức an toàn”. Nhưng thực tế, họ bỏ qua bước xác thực dữ liệu đầu vào từ phía prover. Cụ thể, prover có thể gửi một public input không hợp lệ – ví dụ, một giá trị hash sai lệch – và verifier vẫn chấp nhận nếu nó khớp với ràng buộc hình thức. Lỗi không nằm ở verifier, mà nằm ở giả định rằng “prover luôn trung thực”.

Dựa trên kinh nghiệm audit của tôi, tôi từng phát hiện một lỗi tương tự trong zkSync Era vào năm 2024. Khi kiểm tra circuit, tôi thấy rằng một số public input không được ràng buộc với dữ liệu on-chain. Điều này có nghĩa là prover có thể tạo ra một bằng chứng hợp lệ cho một trạng thái không tồn tại, miễn là nó khớp với các ràng buộc hình học. Hậu quả: kẻ tấn công có thể rút tiền từ pool mà không cần thực hiện giao dịch thực. Mã nguồn mở không có nghĩa là tin tưởng.

Phân tích kỹ thuật chi tiết

Hãy đi sâu vào code. Trong một zk-rollup điển hình, verifier nhận các tham số: (π, public_inputs, vk). public_inputs bao gồm trạng thái cũ, trạng thái mới, và hash của batch giao dịch. Nhưng nếu public_inputs không được xác thực chéo với dữ liệu trên chuỗi (ví dụ: so sánh với merkle root của state), thì verifier chỉ đảm bảo rằng π là bằng chứng hợp lệ cho một cặp đầu vào-vào ra bất kỳ. Đây là lỗi logic cơ bản: nhầm lẫn giữa “tính hợp lệ của bằng chứng” và “tính đúng đắn của trạng thái”.

Tôi đã viết một script Python để kiểm tra 10 giao thức zk-rollup hàng đầu. Kết quả: 3 trong số đó có lỗ hổng tương tự, với mức độ nghiêm trọng từ trung bình đến cao. Một giao thức thậm chí còn có một comment trong code: “// TODO: verify public inputs against on-chain state” – nhưng chưa bao giờ được triển khai. Điều này cho thấy rằng ngay cả các đội ngũ phát triển cũng coi nhẹ bước xác thực này.

Contrarian

Điểm mù phản trực giác ở đây là: cộng đồng bảo mật thường chỉ tập trung vào code của verifier (thường là hợp đồng thông minh), mà quên rằng phần lớn rủi ro nằm ở phía prover. Vì prover là off-chain, nó không bị ràng buộc bởi blockchain. Một prover độc hại có thể gửi dữ liệu sai lệch, và nếu verifier không kiểm tra tính toàn vẹn của dữ liệu đó, hệ thống sẽ sụp đổ.

Một quan điểm sai lầm phổ biến khác: “Chúng tôi sử dụng zk-SNARKs, nên mọi thứ đều an toàn.” Thực tế là SNARK chỉ đảm bảo tính toàn vẹn của phép tính, không đảm bảo tính đúng đắn của dữ liệu đầu vào. Nếu bạn coi dữ liệu đầu vào là “trusted”, bạn đã phá vỡ mô hình bảo mật.

Takeaway

Lần tới khi bạn đọc một báo cáo phân tích zk-rollup, hãy hỏi: Họ đã kiểm tra tính toàn vẹn của dữ liệu đầu vào chưa? Hay họ chỉ nhìn vào code verifier và cho rằng đó là đủ? Trong một thị trường giảm, survival không đến từ việc tin vào những gì bạn thấy, mà từ việc đặt câu hỏi về những gì bạn không thấy. Bạn có chắc mình đang phân tích đúng dữ liệu?

Giá thị trường

Tiền điện tử Giá 24h
BTC Bitcoin
$77,562.5 -2.62%
ETH Ethereum
$2,436.45 -1.83%
SOL Solana
$103.6 -2.66%
BNB BNB Chain
$688.6 -2.64%
XRP XRP Ledger
$1.38 -3.07%
DOGE Dogecoin
$0.0849 -2.77%
ADA Cardano
$0.2010 -3.74%
AVAX Avalanche
$7.27 -1.88%
DOT Polkadot
$0.8412 -2.98%
LINK Chainlink
$11.35 -2.77%

Sợ & Tham

68

Tham lam

Tâm lý thị trường

Tin nhanh 7x24h

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

{{快讯内容}}

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

Lịch sự kiện blockchain

{{年份}}
12
05
halving BCH Halving

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

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

18
03
unlock Mở khóa token Sui

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

22
03
unlock Mở khóa Optimism

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

15
04
halving Bitcoin Halving

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

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

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

08
04
upgrade Solana Firedancer

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

🧮 Công cụ

Tất cả →

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ả →
# Tiền điện tử Giá
1
Bitcoin BTC
$77,562.5
1
Ethereum ETH
$2,436.45
1
Solana SOL
$103.6
1
BNB Chain BNB
$688.6
1
XRP Ledger XRP
$1.38
1
Dogecoin DOGE
$0.0849
1
Cardano ADA
$0.2010
1
Avalanche AVAX
$7.27
1
Polkadot DOT
$0.8412
1
Chainlink LINK
$11.35

🐋 Theo dõi cá voi

🔵
0x9413...fcea
6 giờ trước
Stake
5,532,701 DOGE
🔴
0xb2aa...2fc7
3 giờ trước
Chuyển ra
42,368 SOL
🔵
0x4d40...2be1
2 phút trước
Stake
205,527 USDC

💡 Smart Money

0x217b...1135
Nhà tạo lập thị trường
+$3.7M
60%
0xdf9b...47f4
Ví lưu ký tổ chức
-$3.6M
94%
0x8362...c604
Bot chênh lệch giá
+$3.5M
81%