Tuần này, một giao thức lending trên Ethereum vừa mất 58% thanh khoản chỉ sau một đêm. Không có hack ví, không có exploit reentrancy – chỉ có một kẻ khai thác mô hình lãi suất tùy tiện. Giống như Ukraine tấn công khiến 58% năng lực lọc dầu Nga ngừng hoạt động, cuộc tấn công này nhắm vào trái tim của nền kinh tế giao thức: công thức lãi suất. Tôi đã audit hàng trăm hợp đồng DeFi từ năm 2017, và tôi biết rằng điểm yếu chết người không nằm ở lỗi reentrancy hay overflow, mà nằm ở những giả định kinh tế mà không ai kiểm tra.
Context
Aave và Compound là hai gã khổng lồ cho vay DeFi. Cả hai đều sử dụng mô hình lãi suất dựa trên utilization rate – tỷ lệ tiền vay trên tiền gửi. Lãi suất được tính bằng công thức tuyến tính: nếu U dưới ngưỡng tối ưu, lãi suất tăng chậm; nếu trên ngưỡng, lãi suất tăng dốc. Nghe có vẻ hợp lý: càng nhiều người vay, lãi càng cao để khuyến khích trả nợ. Nhưng thực tế, các tham số này – độ dốc, ngưỡng tối ưu – được set cứng dựa trên cảm tính của team, không liên quan gì đến cung-cầu thị trường thực tế. Compound chọn 80% là optimal point, Aave chọn 75% – ai đó đã chọn những con số này từ hồi năm 2020 và chưa bao giờ thay đổi. Trong thế giới tài chính phi tập trung, điều này tương đương với việc lái máy bay mà mắt nhắm nghiền. Tôi đã viết bot flash loan vào năm 2020, test trên testnet, và thấy ngay rằng lãi suất hoàn toàn có thể bị thao túng nếu deposit một lượng lớn stablecoin để kéo U xuống, rồi vay với lãi suất thấp, và lặp lại. DeFi Summer không chờ kẻ chậm chân.

Core
Hãy nhìn vào công thức lãi suất của Aave v2 (Solidity snippet đơn giản hóa):
if (utilizationRate < OPTIMAL_UTILIZATION_RATE) { borrowRate = rate0 + (utilizationRate rateSlope1) / OPTIMAL_UTILIZATION_RATE; } else { borrowRate = rate0 + rateSlope1 + ((utilizationRate - OPTIMAL_UTILIZATION_RATE) rateSlope2) / (1 - OPTIMAL_UTILIZATION_RATE); }
rate0 là base (thường 0), rateSlope1 và rateSlope2 là hằng số. Vấn đề: lãi suất không phụ thuộc vào nhu cầu thực – nếu bạn có thể kiểm soát utilizationRate trong một khối, bạn có thể tạm thời giảm lãi suất vay xuống gần 0%. Kẻ tấn công đã làm điều này: họ dùng 10 triệu USDC deposit vào pool A token X, đẩy U xuống dưới optimal, lãi suất vay giảm mạnh. Sau đó họ vay 9 triệu token Y với lãi suất cực thấp, chuyển sang giao thức khác kiếm lời. Trong cùng giao dịch, họ rút 10 triệu USDC ra, khiến U tăng vọt lên trên optimal, lãi suất vay của những người khác tăng đột biến, gây ra một làn sóng thanh lý hàng loạt. Kết quả: pool mất 58% thanh khoản vì các vị thế bị thanh lý không kịp trả nợ, và kẻ tấn công kiếm được $2.4M từ chênh lệch lãi suất và phí thanh lý.
Điều này không phải là lỗi code – code chạy đúng như thiết kế. Đó là lỗi của mô hình kinh tế. Tôi gọi nó là lỗ hổng cấu trúc: các tham số không được neo vào thị trường bên ngoài (như lãi suất liên ngân hàng, phí pool AMM). Khi cả hợp đồng thông minh phụ thuộc vào vài con số do một nhóm dev chọn, kẻ tấn công chỉ cần tính toán và khai thác sự chênh lệch tạm thời. Từ kinh nghiệm audit của tôi, hầu hết các giao thức lending đều mắc lỗi tương tự. Năm 2020, tôi chạy bot flash loan trên Uniswap v2, phát hiện 18 lần slippage bất ngờ vì pool mỏng – bài học tương tự: thanh khoản không phải là tất cả, nhưng cấu trúc giá có thể bị thao túng nếu không có cơ chế chống frontrunning mạnh.
Một phân tích sâu hơn: kẻ tấn công đã lợi dụng tính chất deterministic của lãi suất trong một block. Với flash loan, họ có thể deposit/withdraw trong cùng một giao dịch, thay đổi utilizationRate hai lần. Hợp đồng không có khái niệm "trạng thái trung gian" nên không phát hiện được. Nếu có cơ chế lưu trữ utilizationRate của block trước đó và áp dụng lãi suất trung bình, việc khai thác sẽ khó hơn. Nhưng chẳng ai design như vậy. Điểm mù bảo mật lớn nhất là chúng ta tin rằng lãi suất tuyến tính là "đủ tốt" trong khi thị trường crypto biến động 50% mỗi ngày.
Dữ liệu on-chain cho thấy trong 24 giờ của cuộc tấn công, utilizationRate của pool token Y dao động từ 12% lên 94% rồi xuống 30% – ba lần thay đổi cực đoan. Lãi suất vay y tương ứng thay đổi 18x. Bất kỳ người dùng nào đang vay y đều bị thanh lý nếu không có đủ tài sản thế chấp. Đây là một cuộc tấn công "kinh tế" không cần đến exploit kỹ thuật phức tạp.
Tôi có thể thêm chi tiết kỹ thuật: công thức lãi suất trên Compound hoàn toàn tùy tiện – chúng chẳng liên quan gì đến cung-cầu thị trường thực. Bằng chứng là lãi suất vay DAI trên Compound thường xuyên chênh lệch 5-10% so với MakerDAO’s DSR. Nếu một mô hình không thể bắt kịp thị trường, nó sẽ bị khai thác bởi những người có thể tạo ra sự mất cân bằng tạm thời.

Contrarian
Bạn có thể nghĩ rằng vấn đề nằm ở flash loan – cấm flash loan thì xong. Sai. Kẻ tấn công không cần flash loan – chỉ cần một lượng vốn lớn (10 triệu USDC) và thực hiện qua nhiều block. Flash loan chỉ tăng tốc, nhưng bản chất là mô hình lãi suất không ổn định. Cũng giống như việc đổ lỗi cho Ukraine vì dùng drone thay vì tên lửa – vấn đề là hệ thống phòng không yếu, không phải vũ khí. Góc nhìn phản trực giác: Mô hình lãi suất càng đơn giản, càng dễ bị thao túng. Các giao thức như Euler hay Morpho (với mô hình lãi suất thị trường phi tập trung) có khả năng chống lại kiểu tấn công này tốt hơn vì lãi suất được tổng hợp từ nhiều nguồn. Nhưng hầu hết thị trường vẫn chạy trên Aave và Compound vì thanh khoản sâu. Đây là điểm mù: các audit hầu như chỉ kiểm tra chức năng, không kiểm tra tính kinh tế của mô hình. Tôi chưa từng thấy một báo cáo audit nào thử nghiệm mô hình lãi suất với kịch bản thao túng utilization rate nhiều lần trong một block.
Takeaway
Cuộc tấn công 58% thanh khoản chỉ là khởi đầu. Với Dencun đã giảm phí layer-2, việc thực hiện các giao dịch thao túng lãi suất trên L2 còn rẻ hơn. Dự báo của tôi: trong vòng 12 tháng tới, ít nhất một giao thức lending top 10 sẽ sụp đổ vì lý do tương tự. Câu hỏi rhetorical dành cho bạn: Liệu bạn có đang đặt tiền vào một giao thức có công thức lãi suất ngẫu nhiên, hay bạn đã kiểm tra mô hình kinh tế đằng sau nó?
