آسیبپذیریهای مربوط به پردازش نادرست آدرسهای IP با ارقام هشتگانه در توابع تجزیه آدرس در کتابخانههای استاندارد زبانهای Rust و Go شناسایی شدهاند. این آسیبپذیریها امکان دور زدن بررسیهای آدرسهای معتبر در برنامهها را فراهم میکنند، برای مثال، برای سازماندهی دسترسی به آدرسهای رابط حلقهای (127.xxx) یا زیرشبکههای اینترانت هنگام انجام حملات SSRF (جعل درخواستهای سمت سرور). آسیبپذیریها چرخه مشکلاتی را که قبلاً در کتابخانهها شناسایی شده بود ادامه میدهند. 2021-28918)، Data::Validate::IP (Perl, CVE-2021-29418) و Net::Netmask (Perl, CVE-2020-28360).
طبق مشخصات، مقادیر رشته آدرس IP که با صفر شروع می شوند باید به عنوان اعداد اکتالی تفسیر شوند، اما بسیاری از کتابخانه ها این را در نظر نمی گیرند و به سادگی صفر را کنار می گذارند و مقدار را به عنوان یک عدد اعشاری در نظر می گیرند. به عنوان مثال، عدد 0177 در اکتال برابر با 127 در اعشار است. مهاجم می تواند با تعیین مقدار "0177.0.0.1" که در نماد اعشاری با "127.0.0.1" مطابقت دارد، منبعی را درخواست کند. اگر از کتابخانه مشکل دار استفاده شود، برنامه تشخیص نمی دهد که آدرس 0177.0.0.1 در زیر شبکه 127.0.0.1/8 قرار دارد، اما در واقع هنگام ارسال درخواست، می تواند به آدرس "0177.0.0.1" دسترسی پیدا کند. توابع شبکه به صورت 127.0.0.1 پردازش خواهند شد. به روشی مشابه، می توانید با تعیین مقادیری مانند "012.0.0.1" (معادل "10.0.0.1") بررسی دسترسی به آدرس های اینترانت را تقلب کنید.
در Rust، کتابخانه استاندارد "std::net" تحت تأثیر یک مشکل (CVE-2021-29922) قرار گرفت. تجزیه کننده آدرس IP این کتابخانه یک صفر را قبل از مقادیر موجود در آدرس کنار گذاشته است، اما تنها در صورتی که بیش از سه رقم مشخص نشده باشد، برای مثال، "0177.0.0.1" به عنوان یک مقدار نامعتبر و یک نتیجه نادرست درک می شود. در پاسخ به 010.8.8.8 و 127.0.026.1 برگردانده می شود. برنامه هایی که از std::net::IpAddr هنگام تجزیه آدرس های مشخص شده توسط کاربر استفاده می کنند، به طور بالقوه در معرض حملات SSRF (جعل درخواست سمت سرور)، RFI (شمول کردن فایل از راه دور) و LFI (شامل فایل محلی) هستند. این آسیب پذیری در شاخه Rust 1.53.0 رفع شد.
در Go، کتابخانه استاندارد "Net" تحت تأثیر قرار می گیرد (CVE-2021-29923). تابع داخلی net.ParseCIDR به جای پردازش آنها از صفرهای ابتدایی قبل از اعداد اکتالی پرش می کند. به عنوان مثال، یک مهاجم می تواند مقدار 00000177.0.0.1 را ارسال کند، که وقتی در تابع net.ParseCIDR(00000177.0.0.1/24) بررسی شود، به عنوان 177.0.0.1/24 تجزیه می شود و نه 127.0.0.1/24. این مشکل در پلتفرم Kubernetes نیز خود را نشان می دهد. این آسیبپذیری در نسخه Go نسخه 1.16.3 و نسخه بتا 1.17 برطرف شده است.
منبع: opennet.ru