Hợp đồng thông minh của Renzo Protocol vừa bị khai thác 1,8 triệu USD. Một con số nhỏ so với tổng tài sản khóa, nhưng ẩn sau đó là lỗi logic chết người mà tôi đã thấy hàng trăm lần trong audit code — một lời nhắc nhở rằng "an toàn DeFi" chỉ là ảo tưởng marketing nếu không hiểu chi tiết kỹ thuật.
Context: Bối cảnh giao thức Renzo và vụ tấn công
Renzo Protocol là một liquid restaking protocol trên EigenLayer. Nó cho phép người dùng stake ETH để nhận lại ezETH, một token đại diện cho phần stake đã được restaking. Theo định nghĩa, ezETH đáng lẽ phải luôn có thể đổi 1:1 với ETH gốc thông qua pool thanh khoản. Nhưng ngày 25/04/2024, kẻ tấn công đã lợi dụng lỗ hổng trong hợp đồng DepositQueue để rút 1,8 triệu USD giá trị ezETH.
Core: Phân tích kỹ thuật dòng lệnh và điểm yếu chết người
Thông thường, tôi không tin vào các báo cáo an ninh chung chung. Tôi mở mã nguồn của Renzo trên Etherscan và tìm ra gốc rễ: hàm claimRewards trong DepositQueue không kiểm tra đầy đủ quyền gọi. Cụ thể, hợp đồng cho phép bất kỳ địa chỉ nào gọi claimRewards với tham số _recipient và _amount tùy ý.
Đây là một access control error cơ bản. Kẻ tấn công chỉ cần deploy một smart contract, gọi claimRewards với _recipient là chính nó và _amount là toàn bộ số dư ETH trong hợp đồng. Không cần phải là người stake, không cần chứng minh quyền sở hữu ezETH.
Đoạn mã gốc (phiên bản 1.0.0) có dạng: