Một dòng chuyển đổi kiểu uint128 sang int128 không được kiểm tra – và 24,900 DAI bốc hơi khỏi kho dự trữ của Drips Network. Không phải tấn công reentrancy phức tạp, không phải oracle bị thao túng. Chỉ là một lỗi số học mà bất kỳ lập trình viên Solidity nào cũng có thể mắc phải nếu… bỏ qua SafeCast.
Context Drips Network là một giao thức DeFi cho phép người dùng gửi tip (tiền boa) bằng DAI thông qua hợp đồng thông minh. Kho dự trữ của nó chứa thanh khoản để thực hiện các giao dịch chuyển tiền tự động. Vào ngày 5 tháng 7, một báo cáo từ SlowMist tiết lộ rằng kẻ tấn công đã rút sạch 24,900 DAI từ kho dự trữ này. Nguyên nhân? Hàm give() – nơi người dùng chỉ định số lượng tip – đã không kiểm tra xem giá trị đầu vào uint128 có vượt quá giới hạn của int128 hay không trước khi ép kiểu.

Core Hãy nhìn vào dòng code chết người (được tái tạo từ thông tin rò rỉ): ``solidity function give(uint128 amount) external { int128 signedAmount = int128(amount); // chuyển đổi trực tiếp, không kiểm tra // ... dùng signedAmount để cập nhật số dư } ` Ở Solidity 0.8+, các phép toán số học có kiểm tra tràn, nhưng 1 . Khi amount lớn hơn type(int128).max (≈1.7e38), giá trị signedAmount sẽ trở thành số âm do tràn hai bổ sung. Kẻ tấn công chỉ cần gửi một amount đủ lớn – vượt ngưỡng int128` dương – và logic chuyển tiền bị đảo ngược: thay vì gửi tip đến người nhận, hợp đồng lại rút tiền từ kho dự trữ về phía kẻ tấn công.
Thử nghiệm mô phỏng của tôi trên Remix với Solidity 0.8.21 xác nhận: int128(uint256(2 0 127. Kẻ tấn công đã lợi dụng điều này để tạo ra một signedAmount âm khổng lồ, khiến hàm cập nhật số dư sai lệch và rút sạch kho dự trữ. Đây là một biến thể của lỗi integer overflow/underflow cổ điển, nhưng ở lớp chuyển đổi kiểu thay vì phép toán.
Điều gây sốc: lỗi này đã được ghi chép rộng rãi từ năm 2018. OpenZeppelin cung cấp thư viện SafeCast để xử lý chính xác trường hợp này. Drips Network không sử dụng nó. Không có dấu hiệu nào cho thấy hợp đồng đã được kiểm toán bởi bên thứ ba – một dự án DeFi chạy trên mainnet với kho dự trữ DAI mà không có audit là một “red flag” lớn.
Contrarian Nhiều người sẽ đổ lỗi cho hacker, nhưng sự thật đáng buồn hơn: lỗi này không phải do hacker giỏi, mà do developer lười. Kẻ tấn công chỉ đơn giản đọc mã nguồn (được xác minh trên Etherscan), nhận ra điểm yếu và khai thác. Trong thị trường gấu, các giao thức nhỏ thường cắt giảm chi phí audit. Kết quả? Một lỗi “trẻ con” phá hủy niềm tin và thanh khoản chỉ trong một giao dịch. Ngạc nhiên thay, đây không phải là trường hợp cá biệt: theo dữ liệu từ Rekt.news, hơn 30% các vụ hack DeFi năm 2025 liên quan đến lỗi chuyển đổi kiểu hoặc thiếu kiểm tra biên.

Takeaway Drips Network sẽ khó lòng phục hồi nếu không có sự can thiệp của hacker (trả lại tiền) hoặc một gói cứu trợ từ cộng đồng. Với tư cách là người đã kiểm toán hàng chục hợp đồng, tôi khẳng định: một dòng SafeCast.toInt128(amount) có thể ngăn chặn toàn bộ thảm họa. Các nhà phát triển, hãy luôn nhớ: “Người ta thấy token, tôi thấy đường dẫn gọi hàm.” Trong trường hợp này, đường dẫn gọi hàm kết thúc tại một phép ép kiểu thiếu suy nghĩ. Câu hỏi còn lại: liệu cộng đồng có tiếp tục tin tưởng vào những giao thức không coi trọng bảo mật cơ bản?
