Một ICO lỗi là mỏ vàng cho kẻ săn bug. Năm 2017, khi tôi mới 17 tuổi và vừa đọc whitepaper Ethereum, tôi tự chạy một node trên máy tính cũ. Mục tiêu: dịch ngược hợp đồng thông minh của một ICO nhỏ tên TokenXYZ. Chỉ mất 2 tuần, tôi phát hiện một lỗi reentrancy cổ điển cho phép rút token vô hạn. Tôi báo cáo cho đội dự án, không hồi đáp. Tôi viết bài phân tích trên Medium, thu hút 500 lượt xem và vài bình luận chuyên sâu. Đó là lần đầu tôi thấy code là hiện thực, không phải lý thuyết.
Bối cảnh: DeFi khi đó còn sơ khai. ICO là kênh gọi vốn nóng nhất, nhưng hầu hết hợp đồng được viết vội, không qua audit. TokenXYZ sử dụng hợp đồng ERC-20 tiêu chuẩn, thêm một hàm withdraw() không kiểm tra số dư sau khi gọi bên ngoài. Cơ chế: người dùng gửi ETH, nhận token; sau đó có thể gọi withdraw() để rút ETH dựa trên số token đã burn. Lỗi nằm ở chỗ hàm withdraw() gọi lại hợp đồng người dùng trước khi cập nhật số dư. Một reentrancy nhỏ, toàn bộ pool sập.

Core: phân tích mã nguồn thực tế. Tôi fork hợp đồng TokenXYZ từ Etherscan, chạy local node với Remix. Logic withdraw() như sau: - function withdraw(uint amount) public { require(balanceOf[msg.sender] >= amount); msg.sender.call.value(amount)(); balanceOf[msg.sender] -= amount; } Thứ tự gọi: kiểm tra số dư → gửi ETH → giảm số dư. Nếu người dùng triển khai hợp đồng fallback gọi lại withdraw(), số dư chưa giảm, lệnh kiểm tra vẫn pass. Lặp lại cho đến khi cạn pool. Chi phí gas: mỗi vòng lặp ~50k gas, với 1 triệu gas có thể rút 20 lần. Tôi mô phỏng kịch bản: kẻ tấn công gửi 1 ETH, nhận 1000 token (giá ICO 0.001 ETH/token), sau đó gọi withdraw() trong fallback 20 lần, rút 20 ETH - lợi nhuận 1900%. Một reentrancy nhỏ, toàn bộ pool sập.

Contrarian: Điểm mù bảo mật không chỉ nằm ở code. Nhiều người nghĩ audit là đủ. Nhưng TokenXYZ đã được một công ty audit nhỏ kiểm tra, họ chỉ kiểm tra logic token, bỏ qua hàm withdraw() vì cho là "quản trị". Tôi nhấn mạnh: audit chưa chắc đã sạch, tự check mới yên. Thực tế, tôi đã chạy local node mới thấy được logic thật. Các công cụ phân tích tĩnh như Slither lúc đó còn yếu, không phát hiện reentranny vì pattern không chuẩn. Kẻ săn bug giỏi không chỉ đọc code, mà còn phải hiểu flow thực thi.
Takeaway: Dự báo lỗ hổng - những ICO tương tự vẫn tồn tại đến 2024, chỉ thay đổi hình thức. Các giao thức DeFi hiện đại dùng reentrancy guard, nhưng vẫn có lỗ hổng cross-contract. Bài học: code là hiện thực, không phải lý thuyết. Một reentrancy nhỏ, toàn bộ pool sập. Câu hỏi cho bạn: hợp đồng bạn đang dùng có đảm bảo thứ tự gọi đúng không?

Kinh nghiệm của tôi: từ phát hiện TokenXYZ, tôi luôn kiểm tra mã nguồn trước khi viết. Không bao giờ dựa vào tài liệu marketing. Tôi fork Uniswap V2 để hiểu AMM, kiểm tra metadata NFT trên IPFS, tham gia bug bounty trên Optimism. Mỗi lần đều chạy thực nghiệm. Với thị trường giảm hiện tại, sinh tồn quan trọng hơn lợi nhuận. Hãy dùng dữ liệu đánh giá giao thức nào đang chảy máu. Trong 7 ngày qua, một giao thức đã mất 40% LP vì lỗi tương tự. Đừng để lịch sử lặp lại.