آسیب پذیری سر ریز و زیر ریز عدد صحیح Integer Overflow and Underflow چیست؟

سر ریز و زیر ریز عدد صحیح Integer Overflow and Underflow چیست؟
سرریز عدد صحیح (Integer Overflow) زمانی رخ میدهد که سعی کنیم مقداری بزرگتر از بیشترین مقدار قابل ذخیره در یک نوع داده عدد صحیح را ذخیره کنیم. بهطور مشابه، زیرریز عدد صحیح (Integer Underflow) زمانی رخ میدهد که بخواهیم مقداری کوچکتر از کمترین مقدار مجاز برای آن نوع داده را ذخیره کنیم. ما میتوانیم این سرریزها و زیرریزها را بهصورت ریاضیاتی یا برنامهنویسی تشخیص دهیم.
ماشین مجازی اتریوم (EVM) نوعهای دادهای با اندازه ثابت برای اعداد صحیح تعریف میکند. این به این معنی است که دامنه اعداد قابل نمایش توسط یک متغیر صحیح محدود است. به عنوان مثال، یک "uint8" (عدد صحیح بدون علامت با ۸ بیت؛ یعنی غیرمنفی) فقط میتواند اعدادی را ذخیره کند که بین ۰ تا ۲۵۵ قرار دارند. نتیجه تلاش برای ذخیره هر مقداری بزرگتر از ۲۵۵ در یک "uint8" منجر به یک بیشجریان (Overflow) خواهد شد. به طور مشابه، نتیجه کم کردن "۱" از "۰" مقدار ۲۵۵ را تولید میکند. این پدیده کمجریان (Underflow) نامیده میشود. زمانی که یک عملیات حسابی از حداکثر یا حداقل اندازه یک نوع داده فراتر میرود یا به زیر آن میرسد، بیشجریان یا کمجریان رخ میدهد.
برای اعداد صحیح با علامت، نتیجه کمی متفاوت خواهد بود. اگر ما سعی کنیم "۱" را از یک int8 که مقدار آن -۱۲۸ است کم کنیم، مقدار ۱۲۷ را به دست میآوریم. این به این دلیل است که نوعهای int با علامت، که میتوانند مقادیر منفی را نشان دهند، پس از رسیدن به بالاترین مقدار منفی، دوباره شروع میشوند.
دو مثال ساده از این رفتار شامل توابع ریاضی دورهای (افزودن ۲ به آرگومان تابع سینوس مقدار را دست نخورده نگه میدارد) و اودومترهای خودروها هستند، که مسافت طی شده را ردیابی میکنند (پس از رسیدن به حداکثر عدد، یعنی ۹۹۹۹۹۹، به ۰۰۰۰۰۰ بازنشانی میشوند).
توجه مهم:
در سولیدیتی Solidity نسخه 0.8.0 و بالاتر، کامپایلر به صورت خودکار بررسیهای بیشجریان و کمجریان را در عملیاتهای حسابی انجام میدهد و در صورت رخ دادن بیشجریان یا کمجریان، تراکنش را بازگشت میدهد.
سولیدیتی 0.8.0 همچنین کلیدواژه unchecked را معرفی میکند که به توسعهدهندگان امکان میدهد عملیاتهای حسابی را بدون این بررسیهای خودکار انجام دهند و به صراحت بیشجریان را بدون بازگشت تراکنش مجاز بدانند. این میتواند به ویژه برای بهینهسازی مصرف گاز در مواردی که بیشجریان مشکلی ایجاد نمیکند یا رفتار دورهمی (Wraparound) مورد نظر است، مفید باشد؛ مشابه نحوه عملکرد حسابی در نسخههای قبلی سولیدیتی Solidity.
Integer Overflow and Underflow چه تاثیری دارد؟
1- افزایش مصنوعی موجودی حسابها یا توکنها: مهاجم میتواند از این آسیبپذیریها بهرهبرداری کند تا موجودی حسابها یا تعداد توکنها را به صورت مصنوعی افزایش دهد، که ممکن است به آنها اجازه دهد مبلغ بیشتری از وجوه را که به طور قانونی مالک آنها نیستند، برداشت کنند.
2- تغییر جریان منطقی قرارداد: مهاجم ممکن است جریان مورد نظر منطق قرارداد را تغییر دهد، که منجر به انجام اقدامات غیرمجاز مانند دزدی داراییها یا تولید بیش از حد توکنها میشود.
چه اقدامی باید انجام شود؟
1- استفاده از نسخه 0.8.0 یا بالاتر کامپایلر Solidity: سادهترین راهکار استفاده از نسخه 0.8.0 یا بالاتر کامپایلر Solidity است، زیرا این نسخه به طور خودکار بررسیهای بیشجریان و کمجریان را در عملیاتهای حسابی انجام میدهد.
2- استفاده از جدیدترین کتابخانههای Safe Math: برای جامعه اتریوم، OpenZeppelin کار فوقالعادهای در ایجاد و ممیزی کتابخانههای امن انجام داده است. بهویژه کتابخانه SafeMath میتواند برای جلوگیری از آسیبپذیریهای بیشجریان و کمجریان استفاده شود. این کتابخانه توابعی مانند add(), sub(), mul() و غیره را فراهم میکند که عملیاتهای حسابی پایه را انجام داده و در صورت رخ دادن بیشجریان یا کمجریان به طور خودکار تراکنش را بازگشت میدهد