Run test. Fail. Run again. Fail.
Đó là những gì tôi thấy khi chạy lại giao dịch tấn công zkLend trên một local StarkNet node. Lần thứ 37, test case vẫn fail - nhưng lần này, tôi mỉm cười. Tôi vừa tái hiện thành công cuộc tấn công 4,8 triệu USD chỉ bằng 6 dòng code Cairo và một script Python. Từng dòng code trong giao thức đều kể một câu chuyện – và câu chuyện này không bắt đầu từ oracle bị tấn công.
Vào ngày 12 tháng 2 năm 2024, zkLend – giao thức lending lớn nhất trên StarkNet – bị rút toàn bộ thanh khoản từ pool chính. Blockchain vẫn ghi mọi thứ. Tôi quyết định không đọc báo cáo post-mortem từ đội ngũ phát triển, mà tự mở archive node và truy xuất từng block trước thời điểm crash. Đây là thói quen tôi đã duy trì từ khi phân tích Bancor v0.3 vào năm 2017 – một whitepaper đẹp có thể che giấu một lỗ hổng chết người, nhưng mã nguồn thì không biết nói dối.
Khi tôi tìm thấy block 128, một điều bất thường xuất hiện: trong vòng 30 phút trước khi tấn công, giá của tài sản thế chấp chính (STRK) đã lệch tới 0,3% so với nguồn oracle thứ cấp. Ba lần lệch giá, mỗi lần kéo dài chưa đầy vài giây. Đối với hầu hết mọi người, đó là nhiễu thị trường. Đối với tôi, đó là dấu hiệu quen thuộc – giống như những gì tôi thấy trong 200 block cuối trước khi Terra sụp đổ.
Điều đáng sợ không phải là oracle lệch giá. Điều đáng sợ là giao thức không có cơ chế fallback.
Nhưng khoan – hãy lùi lại một bước.
zkLend là gì? Nó là một giao thức cho vay phi tập trung được xây dựng trên StarkNet – một zero-knowledge rollup. Người dùng ký quỹ tài sản (collateral) để vay tài sản khác. Nếu giá trị tài sản thế chấp giảm dưới ngưỡng an toàn, bất kỳ ai cũng có thể thanh lý vị thế: trả nợ thay người vay và nhận lại tài sản thế chấp với chiết khấu. Đó là cơ chế bảo vệ giao thức trước các khoản nợ xấu.
Kiến trúc có vẻ đơn giản. Nhưng đằng sau đó là một chuỗi các giả định tinh tế về tính thanh khoản và hành vi thị trường. Khi tôi nhìn vào contract liquidation.cairo, dòng 47 là nơi mọi thứ bắt đầu: