Tràn số nguyên là một vấn đề lập trình phổ biến, đặc biệt cần chú ý trong phát triển hợp đồng thông minh trên blockchain. Khi kết quả tính toán vượt quá phạm vi mà kiểu số nguyên có thể biểu diễn, sẽ xảy ra tràn số nguyên.
Tràn số nguyên được chia thành hai trường hợp: tràn lên và tràn xuống. Tràn lên là khi kết quả vượt quá giá trị tối đa, chẳng hạn như giá trị tối đa của kiểu uint32 là 4,294,967,295 cộng 1 sẽ trở thành 0. Tràn xuống là khi kết quả nhỏ hơn giá trị tối thiểu, chẳng hạn như 0 của kiểu uint32 trừ 1 sẽ trở thành 4,294,967,295.
Lấy token BEC của BeautyChain làm ví dụ, kẻ tấn công đã tận dụng lỗ hổng tràn số nguyên để có được một lượng lớn token. Trong hàm batchTransfer, amount = cnt * _value có thể xảy ra tràn, dẫn đến câu lệnh yêu cầu kiểm tra số dư bị vô hiệu hóa.
Để ngăn chặn tràn số nguyên, khi phát triển hợp đồng thông minh bằng Rust, có thể thực hiện các biện pháp sau:
Cấu hình kiểm tra tràn số nguyên trong chế độ release trong Cargo.toml.
Sử dụng crate uint để hỗ trợ các kiểu số nguyên lớn hơn, như U256, U512, v.v.
Sử dụng hàm chuyển đổi kiểu uint để kiểm tra tràn, như as_u128().
Sử dụng các hàm Safe Math như checked_add(), checked_sub() để thực hiện các phép toán an toàn.
Thực hiện unwrap hoặc expect đối với kết quả Option trả về từ hàm Safe Math.
Thông qua những phương pháp này, có thể hiệu quả tránh được những rủi ro an ninh do tràn số nguyên gây ra. Trong phát triển hợp đồng thông minh, cần luôn cảnh giác với vấn đề tràn số nguyên và thực hiện các biện pháp bảo vệ cần thiết.
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
14 thích
Phần thưởng
14
5
Chia sẻ
Bình luận
0/400
CompoundPersonality
· 07-15 00:43
Vấn đề tràn đã là một cái hố cũ.
Xem bản gốcTrả lời0
MEVSandwichMaker
· 07-14 16:58
Lỗi tràn là thực đơn cần có của Cựu chiến binh tiền điện tử.
Bảo mật hợp đồng thông minh: Phân tích chiến lược bảo vệ lỗ hổng tràn số nguyên
Lỗ hổng tràn số nguyên và biện pháp bảo vệ
Tràn số nguyên là một vấn đề lập trình phổ biến, đặc biệt cần chú ý trong phát triển hợp đồng thông minh trên blockchain. Khi kết quả tính toán vượt quá phạm vi mà kiểu số nguyên có thể biểu diễn, sẽ xảy ra tràn số nguyên.
Tràn số nguyên được chia thành hai trường hợp: tràn lên và tràn xuống. Tràn lên là khi kết quả vượt quá giá trị tối đa, chẳng hạn như giá trị tối đa của kiểu uint32 là 4,294,967,295 cộng 1 sẽ trở thành 0. Tràn xuống là khi kết quả nhỏ hơn giá trị tối thiểu, chẳng hạn như 0 của kiểu uint32 trừ 1 sẽ trở thành 4,294,967,295.
Lấy token BEC của BeautyChain làm ví dụ, kẻ tấn công đã tận dụng lỗ hổng tràn số nguyên để có được một lượng lớn token. Trong hàm batchTransfer, amount = cnt * _value có thể xảy ra tràn, dẫn đến câu lệnh yêu cầu kiểm tra số dư bị vô hiệu hóa.
Để ngăn chặn tràn số nguyên, khi phát triển hợp đồng thông minh bằng Rust, có thể thực hiện các biện pháp sau:
Cấu hình kiểm tra tràn số nguyên trong chế độ release trong Cargo.toml.
Sử dụng crate uint để hỗ trợ các kiểu số nguyên lớn hơn, như U256, U512, v.v.
Sử dụng hàm chuyển đổi kiểu uint để kiểm tra tràn, như as_u128().
Sử dụng các hàm Safe Math như checked_add(), checked_sub() để thực hiện các phép toán an toàn.
Thực hiện unwrap hoặc expect đối với kết quả Option trả về từ hàm Safe Math.
Thông qua những phương pháp này, có thể hiệu quả tránh được những rủi ro an ninh do tràn số nguyên gây ra. Trong phát triển hợp đồng thông minh, cần luôn cảnh giác với vấn đề tràn số nguyên và thực hiện các biện pháp bảo vệ cần thiết.