Một dòng code, một tỷ đô la bay hơi.
Tuần trước, MetaLend – một giao thức cho vay cross-chain vừa huy động 12 triệu USD từ các quỹ danh tiếng – ra mắt mainnet với lời hứa về lãi suất ổn định nhờ sử dụng LP token làm tài sản thế chấp. Tôi nhận được một bản audit không chính thức từ một người bạn trong cộng đồng. Chỉ mất 2 giờ đọc mã, tôi phát hiện ra một lỗ hổng đủ để rút sạch pool thanh khoản.
Đây không phải lần đầu tôi gặp chuyện này. Năm 2020, tôi audit bZx (sau thành Fulcrum) và phát hiện lỗi flash loan. Đội ngũ từ chối bounty, rồi bị khai thác 350K USD. Lần này, MetaLend đã trả bounty cho tôi 50K USD trước khi tôi công bố công khai. Nhưng câu chuyện thực sự không dừng lại ở đó.
Context: Chu kỳ thổi phồng và sự mù quáng về bảo mật Thị trường tăng đang che giấu mọi thứ. MetaLend thu hút sự chú ý nhờ TVL tăng vọt lên 200 triệu USD chỉ sau 3 tuần. Marketing rầm rộ với khẩu hiệu "siêu tài sản thế chấp" – cho phép người dùng vay stablecoin bằng LP token các pool lớn. Nhưng khi nhìn vào mã nguồn hợp đồng MetaLendingVault.sol (phiên bản 0.8.15 – cập nhật mới nhất), tôi thấy một điều bất thường.

Core: Mổ xẻ mã nguồn – lỗi trong logic updateCollateralRatio Hàm updateCollateralRatio được gọi mỗi khi người dùng thêm hoặc rút tài sản thế chấp. Điều đáng nói: nó sử dụng block.timestamp làm seed để tính toán, nhưng không có oracle bên ngoài. Điều này tạo ra một cửa sổ tấn công: kẻ tấn công có thể gọi một transaction với gas price cao để kiểm soát block.timestamp trong một phạm vi nhỏ, từ đó thao túng tỷ lệ thế chấp tạm thời.
Tôi kiểm tra mã:
