Tràn số nguyên là một lỗ hổng lập trình phổ biến, có thể xảy ra trong hầu hết các ngôn ngữ lập trình. Khi kết quả tính toán vượt quá phạm vi biểu diễn của kiểu số nguyên, sẽ xảy ra tràn. Ví dụ, phạm vi của số nguyên không dấu 32 bit (uint32) là từ 0 đến 4.294.967.295. Nếu cộng 1 vào 4.294.967.295, kết quả sẽ "tràn" và trở thành 0.
Sự tràn này có thể dẫn đến lỗi chương trình nghiêm trọng, đặc biệt là khi xử lý dữ liệu tài chính. Ví dụ, nếu giá cổ phiếu được biểu diễn bằng số nguyên 32 bit, khi giá vượt quá giá trị tối đa, nó có thể bị đọc sai thành 0, điều này rõ ràng sẽ gây ra sự hỗn loạn lớ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 số: Kết quả vượt quá giá trị tối đa, chẳng hạn như uint32 của 0xFFFFFFFF + 1 = 0x00000000
Xuống dưới: kết quả nhỏ hơn giá trị tối thiểu, như uint32 của 0x00000000 - 1 = 0xFFFFFFFF
Trong hợp đồng thông minh blockchain, lỗ hổng tràn số nguyên đặc biệt nguy hiểm. Năm 2018, token BEC của BeautyChain đã bị kẻ tấn công lợi dụng do lỗ hổng tràn số nguyên, gây ra mất mát lớn token.
Để ngăn chặn tràn số nguyên, ngôn ngữ Rust cung cấp một số phương pháp hiệu quả:
Sử dụng gói uint để hỗ trợ các loại số nguyên lớn hơn, chẳng hạn như U256, U512, v.v.
Sử dụng hàm chuyển đổi kiểu để kiểm tra tràn, ví dụ:
rỉ sét
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // sẽ gây ra panic
Sử dụng các hàm Safe Math như checked_add, checked_sub, v.v:
rỉ sét
let result = x.checked_sub(y).expect("Đã xảy ra tình trạng thiếu");
Thông qua những phương pháp này, chúng ta có thể phát hiện và ngăn chặn hiệu quả việc tràn số nguyên, nâng cao tính an toàn của hợp đồng thông minh. Khi viết hợp đồng có liên quan đến tính toán số lớn, cần phải xử lý cẩn thận các tình huống có thể xảy ra tràn.
Xem bản gốc
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.
9 thích
Phần thưởng
9
4
Chia sẻ
Bình luận
0/400
SellLowExpert
· 07-16 05:14
Sợ rằng lại có ai đó bị sập băng.
Xem bản gốcTrả lời0
SigmaBrain
· 07-16 05:14
Viết mã thì có chỗ nào không tràn? Ai hiểu thì đều hiểu.
Xem bản gốcTrả lời0
SchroedingersFrontrun
· 07-16 05:11
Các bạn nói cái này chẳng phải là tài sản trong ví tiền giảm về 0 sao?
Phòng ngừa tràn số nguyên: chìa khóa để bảo vệ an toàn hợp đồng thông minh
Lỗ hổng tràn số nguyên và biện pháp phòng ngừa
Tràn số nguyên là một lỗ hổng lập trình phổ biến, có thể xảy ra trong hầu hết các ngôn ngữ lập trình. Khi kết quả tính toán vượt quá phạm vi biểu diễn của kiểu số nguyên, sẽ xảy ra tràn. Ví dụ, phạm vi của số nguyên không dấu 32 bit (uint32) là từ 0 đến 4.294.967.295. Nếu cộng 1 vào 4.294.967.295, kết quả sẽ "tràn" và trở thành 0.
Sự tràn này có thể dẫn đến lỗi chương trình nghiêm trọng, đặc biệt là khi xử lý dữ liệu tài chính. Ví dụ, nếu giá cổ phiếu được biểu diễn bằng số nguyên 32 bit, khi giá vượt quá giá trị tối đa, nó có thể bị đọc sai thành 0, điều này rõ ràng sẽ gây ra sự hỗn loạn lớn.
Tràn số nguyên được chia thành hai trường hợp: tràn lên và tràn xuống.
Trong hợp đồng thông minh blockchain, lỗ hổng tràn số nguyên đặc biệt nguy hiểm. Năm 2018, token BEC của BeautyChain đã bị kẻ tấn công lợi dụng do lỗ hổng tràn số nguyên, gây ra mất mát lớn token.
Để ngăn chặn tràn số nguyên, ngôn ngữ Rust cung cấp một số phương pháp hiệu quả:
toml [profile.release] overflow-checks = true panic = 'hủy bỏ'
Sử dụng gói uint để hỗ trợ các loại số nguyên lớn hơn, chẳng hạn như U256, U512, v.v.
Sử dụng hàm chuyển đổi kiểu để kiểm tra tràn, ví dụ:
rỉ sét let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // sẽ gây ra panic
rỉ sét let result = x.checked_sub(y).expect("Đã xảy ra tình trạng thiếu");
Thông qua những phương pháp này, chúng ta có thể phát hiện và ngăn chặn hiệu quả việc tràn số nguyên, nâng cao tính an toàn của hợp đồng thông minh. Khi viết hợp đồng có liên quan đến tính toán số lớn, cần phải xử lý cẩn thận các tình huống có thể xảy ra tràn.