Hook
24.900 DAI — tương đương gần 25.000 USD — bốc hơi khỏi Drips Network chỉ sau một giao dịch. Không phải hack phức tạp, không phải oracle manipulation. Lý do: một dòng code chuyển uint128 sang int128 mà không kiểm tra giới hạn. Nếu bạn nghĩ “chuyện này chỉ xảy ra ở những dự án meme”, hãy đọc tiếp. Đây là cảnh báo cho tất cả các giao thức DeFi đang chạy trên mainnet mà chưa qua audit chuyên nghiệp.
Context
Drips Network là một giao thức tipping (tip) phi tập trung trên Ethereum, cho phép người dùng gửi DAI cho creator mà không cần trung gian. Giống như Gitcoin Grants nhưng đơn giản hơn: người dùng nạp DAI vào reserve contract, sau đó có thể tip cho bất kỳ ai. Reserve contract giữ toàn bộ thanh khoản của hệ thống. Khi tôi đọc SlowMist report hôm 5/7, tôi lập tức nhận ra vấn đề: hàm give() trong contract không kiểm tra phạm vi của amount trước khi ép kiểu. Kẻ tấn công chỉ cần gửi một giá trị lớn hơn type(int128).max (khoảng 1.7e38 wei, tương đương 1.7e20 DAI — nhưng thực tế chỉ cần vượt quá 2^127-1) để biến số dương thành âm, đảo ngược logic chuyển tiền. Hậu quả: reserve bị rút sạch.
Core
Đây không phải zero-day hay vulnerability mới. Đây là lỗi cơ bản nhất trong Solidity: type conversion không an toàn. OpenZeppelin có SafeCast từ năm 2018. Các static analyzer như Slither, Mythril đều detect được pattern này. Vậy tại sao Drips Network vẫn dính? Khả năng cao: contract chưa bao giờ được audit bởi bên thứ ba. Một audit nghiêm túc (SlowMist, Trail of Bits, Code4rena) sẽ phát hiện ngay. Tôi từng thấy lỗi tương tự ở một vài dự án nhỏ năm 2021, nhưng năm 2025 mà còn tái diễn thì đáng báo động. Thông số cụ thể:
- Hàm
give(address to, uint128 amount)— amount là uint128, nhưng bên trong có dòngint128 signedAmount = int128(amount);mà không córequire(amount <= type(int128).max). - Khi amount > type(int128).max (≈ 1.7e38 wei), signedAmount thành số âm.
- Logic chuyển tiền dùng signedAmount để tính toán:
balance[from] -= signedAmount; balance[to] += signedAmount;. Khi signedAmount âm, từ trừ đi số âm -> tăng, đến cộng số âm -> giảm. Kẻ tấn công gọigive(attacker, hugeAmount)làm reserve chuyển DAI về ví mình. - Kết quả: reserve mất 24.900 DAI. Toàn bộ thanh khoản tipping của giao thức biến mất.
Contrarian
Nhiều người sẽ nói “chỉ 25k USD, nhỏ mà”. Sai. Đối với một giao thức nhỏ, reserve là trái tim. Mất reserve đồng nghĩa không thể tip, không thể withdraw — người dùng mất niềm tin ngay lập tức. Nhưng góc nhìn phản trực giác của tôi: sự kiện này tốt cho toàn ngành. Vì sao? Vì nó phơi bày một sự thật khó chịu: rất nhiều dự án “đã audit” thực chất chỉ audit surface-level, bỏ qua những lỗi cơ bản. Tôi từng làm việc với một đội audit năm 2023 — họ chỉ chạy Slither và đọc code bằng mắt, bỏ sót integer overflow vì “nó hiếm gặp”. Thực tế, lỗi này không hiếm, nó nằm trong checklist OWASP Smart Contract Top 10. Drips Network không phải ngoại lệ. Nếu bạn là builder, hãy xem đây như một cú sốc điện: trước khi deploy bất kỳ contract nào có chuyển tiền, hãy tự hỏi: “Mình đã dùng SafeCast chưa? Mình đã kiểm tra mọi type conversion chưa?”. Nếu câu trả lời là không, bạn đang ngồi trên quả bom hẹn giờ.
Takeaway
24.900 DAI — một con số nhỏ với sàn, nhưng với Drips Network đó là mạng sống. Liệu đội ngũ có thể cứu vãn? Họ cần public post-mortem ngay, liên hệ hacker (hy vọng là whitehat), và cam kết audit toàn diện. Tôi sẽ theo dõi reserve contract trên Etherscan trong 48 giờ tới. Nếu DAI không quay về, dự án coi như chết. Còn bạn? Hãy kiểm tra contract của mình ngay bây giờ, trước khi ai đó làm điều đó thay bạn.
