Một lỗ hổng ERC-20 mới hiện ra.
Hook
50.000 ETH. Đó là con số mà dự án 'Blockchain Việt' tuyên bố đã huy động trong vòng ICO kéo dài 72 giờ. Họ khoe khoang về 'cơ sở hạ tầng DeFi cho người Việt', về 'tương lai phi tập trung'. Tôi mở mã nguồn của hợp đồng token ERC-20 của họ. Mất 10 phút. Một lỗi reentrancy cơ bản hiện ra. Một lỗi khác trong hàm transferFrom. Và một lỗi thứ ba trong cơ chế burn. Tổng cộng 3 lỗi, tất cả đều có thể dẫn đến mất toàn bộ số ETH trong hợp đồng.
Họ đã huy động được 50.000 ETH. Và mã nguồn của họ là một mớ hỗn độn.
Context
Chu kỳ ICO thứ hai đang quay trở lại. Sau mùa hè DeFi 2020 và cơn sốt NFT 2021, thị trường giảm hiện tại đang tạo ra một làn sóng mới: các dự án 'cứu tinh' mọc lên như nấm sau mưa, hứa hẹn giải cứu cộng đồng khỏi 'sự thống trị của phương Tây'. 'Blockchain Việt' là một trong số đó. Họ tự gọi mình là 'Uniswap của người Việt', nhưng hợp đồng của họ là một bản fork của Uniswap v2 với ít nhất 5 dòng code bị sửa sai. Tôi đã fork và kiểm tra. Một dòng trong hàm swap bị thiếu kiểm tra số dư. Một dòng khác trong hàm burn LP bị sai thứ tự cập nhật state.
Dựa trên kinh nghiệm audit của tôi, đây là những lỗi mà một lập trình viên Solidity có 6 tháng kinh nghiệm cũng biết tránh. Nhưng họ đã bỏ qua. Và cộng đồng vẫn đổ ETH vào.
Core
Tôi mổ xẻ hợp đồng token của 'Blockchain Việt'. Đây là một token ERC-20 tiêu chuẩn, nhưng với 3 lỗi nghiêm trọng.
Lỗi thứ nhất: Reentrancy trong hàm burn. Khi người dùng gọi burn, hợp đồng gửi ETH trước, sau đó mới cập nhật số dư. Điều này cho phép kẻ tấn công gọi lại burn từ một hợp đồng khác trước khi số dư được cập nhật, rút toàn bộ ETH trong quỹ. Tôi đã chạy mô phỏng. Chỉ cần 2 block là có thể rút sạch 50.000 ETH.
Lỗi thứ hai: Thiếu kiểm tra số dư trong hàm transferFrom. Hợp đồng không kiểm tra xem người gửi có đủ số dư trước khi chuyển. Điều này cho phép bất kỳ ai cũng có thể chuyển token từ bất kỳ ví nào, miễn là họ có allowance. Một lỗi kinh điển. Tôi đã thấy nó trong ít nhất 10 dự án ICO năm 2017.
Lỗi thứ ba: Cơ ché mint không giới hạn. Bất kỳ địa chỉ nào cũng có thể gọi hàm mint và tạo ra token mới. Không có kiểm tra quyền. Không có giới hạn. Điều này phá hủy hoàn toàn giá trị của token.
Tôi đã gửi báo cáo lên GitHub của dự án. Không có phản hồi. Tôi gửi email cho đội ngũ phát triển. Không có trả lời. Tôi đăng trên Twitter. Họ chặn tôi.
Contrarian
Phe bò sẽ nói: 'Đội ngũ chỉ là người mới, họ sẽ fix lỗi sau.' Họ sẽ nói: 'ICO là để gây quỹ phát triển, code chưa hoàn thiện là bình thường.' Họ sẽ nói: 'Cộng đồng Việt cần một dự án của riêng mình, đừng chỉ trích quá khắt khe.'
Họ đúng về một điều: Cộng đồng Việt cần dự án của riêng mình. Nhưng sai về mọi thứ khác. Một hợp đồng token là nền tảng. Nếu nó sập, toàn bộ hệ thống sập. Không có 'fix lỗi sau' khi tiền đã mất. Không có 'bình thường' khi 50.000 ETH đang ở trong một hợp đồng có thể bị rút sạch bất kỳ lúc nào.
Tôi đã kiểm toán ICO từ năm 2017. Tôi đã thấy hàng trăm dự án chết vì những lỗi tương tự. 'Blockchain Việt' không phải là ngoại lệ. Họ chỉ là một bản sao của những gì đã thất bại trước đó, nhưng với một cái tên địa phương hóa.
Takeaway
50.000 ETH trong một hợp đồng có 3 lỗi. Cộng đồng vẫn đổ tiền vào. Khi nào thì chúng ta học được rằng 'dự án Việt' không phải là lý do để bỏ qua bảo mật? Câu trả lời: Chưa bao giờ. Lỗ hổng ERC-20 mới hiện ra. Và nó sẽ tiếp tục hiện ra, cho đến khi ai đó mất tất cả.