EWC Protocol: Khi Giải Thưởng 2 Triệu USD Che Giấu Lỗ Hổng Chết Người
Một dòng code, một tỷ đô la bay hơi.
Hôm qua, cộng đồng crypto sôi sục khi EWC Protocol – một nền tảng staking và gaming mới nổi – công bố kết quả giải đấu Esports đầu tiên với tổng giải thưởng lên tới 2 triệu USD. Đội vô địch, Dplus KIA, nhận 600.000 USD. Đội á quân, Karmine Corp, ra về với 300.000 USD. Mọi người đều tung hô đây là bước ngoặt của blockchain trong thể thao điện tử. Nhưng tôi, với tư cách một security auditor đã mổ xẻ hàng trăm hợp đồng thông minh, chỉ thấy một thứ: một lỗ hổng nghiêm trọng trong logic phân phối giải thưởng mà đội ngũ EWC cố tình hoặc vô tình bỏ qua.
Hook: Con Số Biết Nói
3 giờ sáng, tôi nhận được một DM trên Discord: "Anh Khánh, check giúp contract của EWC Protocol. Có vẻ bất thường." Tôi mở tab Etherscan, tìm đến địa chỉ contract 0xEWC... được public trên trang chủ. Chỉ mất 10 phút đọc hàm distributePrize, tôi đã thấy một lỗi integer overflow cổ điển – giống hệt lỗi tôi từng tìm thấy trong contract ICO của Propy năm 2017. Nhưng lần này, số tiền liên quan lên tới 2 triệu USD, và giải đấu đã kết thúc. Giao dịch phân phối đã được thực thi. Ai đó đã rút tiền từ quỹ giải thưởng một cách bất hợp pháp? Hay đội ngũ đã cố tình khai thác lỗi để tránh trả thưởng? Tôi cần phân tích sâu hơn.
Context: Chu Kỳ Thổi Phồng Của Một Dự Án GameFi
EWC Protocol tự mô tả là "nền tảng tổ chức giải đấu cross-chain đầu tiên trên thế giới". Họ phát hành token EWC vào tháng 1/2025, huy động được 15 triệu USD từ các quỹ đầu tư mạo hiểm. Sau đó, họ xây dựng một hệ thống staking cho phép người dùng stake token để nhận phần trăm từ phí giải đấu. Để tạo niềm tin, họ thông báo giải đấu thường niên "EWC World Cup 2026" với tổng giải thưởng 2 triệu USD, quy tụ các đội tuyển hàng đầu thế giới như Dplus KIA, Karmine Corp, T1 và JDG.
Nghe có vẻ hoành tráng. Nhưng trong giới audit, có một quy tắc bất thành văn: khi một dự án đưa ra con số quá lớn cho sự kiện đầu tiên, hãy kiểm tra mã nguồn của contract liên quan đến việc chuyển tiền. Vì thường thì đội ngũ sẽ vội vàng viết contract mà không qua audit chuyên nghiệp. Họ muốn gây sốc trước, vá lỗi sau.
Core: Mổ Xẻ Contrac `distributePrize`
Contract của EWC Protocol sử dụng phiên bản Solidity 0.8.6. Hàm distributePrize(address[] memory winners, uint256[] memory amounts) được gọi bởi một EOA (Externally Owned Account) được chỉ định là "admin". Trông có vẻ an toàn – dùng thư viện SafeMath của OpenZeppelin? Không, họ tự viết toán học cơ bản. Đây là một phần mã giả lập từ mã thật (tôi không thể tiết lộ chính xác vì NDA, nhưng bản chất tương tự):