کشف آسیب‌پذیری در تابع ()iconv کتابخانه GNU C

vulnerability

اخیرا یک آسیب‌پذیری از نوع نوشتن خارج از محدوده با شدت بالا با شناسه CVE-2024-2961 و امتیاز CVSS 8.8، در تابع ()iconv کتابخانه GNU C نسخه 2.39 و پایین تر شناسایی شده است.

بر اساس اخبار منتشر شده، به واسطه ضعف امنیتی قدیمی اما همچنان شایع «سر ریز بافر»، یک آسیب‌پذیری جدید با شناسه CVE-2024-2961 در بخشی از کد تابع ()iconv کتابخانه GNU C کشف شده است که در هنگام تبدیل مجموعه کاراکترهای UCS4 در پلاگین  ISO-2022-CN-EXT باعث سر ریز بافر، نوشتن خارج از محدوده شده و در نهایت تاثیرهای مخربی همچون اجرای کد دلخواه، خرابی اپلیکیشن‌ها یا بازنویسی ساختارهای داده حیاتی از جمله متغیرهای مجاور (neighboring variables) توسط نفوذگران خواهد داشت.

در خصوص جزئیات فنی این آسیب‌پذیری می‌توان گفت که در هنگام تبدیل از مجموعه کاراکترهای UCS4، نیاز به افزودن تعدادی escape charterer‌، به منظور نشان دادن مکان تغییر مجموعه کاراکتر می‌باشد. در طی این فرآیند، iconv به‌ درستی مرزهای بافرهای داخلی را بررسی نمی‌کند که این موضوع منجر به سرریز بافر و در نتیجه نوشتن تا ۳ بایت در خارج از محل حافظه‌‌ی در نظر گرفته شده می‌گردد.

تأثیر

همان‌ طور که اشاره شد،‌ این نقص ممکن است منجر به بازنویسی داده‌های مجاور بافر خروجی گردد و به مهاجم اجازه می‌دهد تا اپلیکیشن‌ها را با استفاده از تابع ()iconv آسیب‌ دیده و با ارائه ورودی دستکاری‌ شده‌ای که از بافر خروجی سرریز می‌کند، خراب کند. به عبارت دیگر کتابخانه GNU C می‌تواند در صورت پردازش داده‌های ساخته‌ شده خاص، منجر به منع دسترسی و یا اجرای کد دلخواد از راه دور شود.

متعاقبا سوء استفاده از این آسیب‌پذیری می‌تواند منجر به محرومیت از سرویس، ارتقا سطح دسترسی یا حتی اجرای کد از راه دور شود که تهدید قابل‌ توجهی برای امنیت و یکپارچگی سیستم‌های آسیب‌دیده است و تأثیر فراوانی بر مثلث امنیت بعنی یکپارچگی، محرمانه بودن و در دسترس بودن خواهد داشت.

اکسپلویت

هیچ نشانه‌ای مبنی بر اینکه این آسیب‌پذیری در حال حاضر به طور فعال مورد سوء استفاده قرار می‌گیرد، وجود ندارد. با این حال، ممکن است در روزهای آتی کد POC که نشان می‌دهد چگونه سرریز بافر را راه‌اندازی می‌کند در دسترس قرار گیرد.

وصله

کتابخانه GNU C نسخه 2.40 و نسخه‌های جدیدتر دارای یک راه حل برای این نقص امنیتی است. بنابر این  توصیه می‌شود به آخرین نسخه به روزرسانی کنید.

اقدامات مربوط به کاربران

✅ با اجرای دستور زیر نسخه glibc (با GNU libc) سیستم خود را بررسی کنید:

> ldd --version

📌 در صورتی که نسخه glibc کمتر 2.40 باشد، سیستم شما آسیب‌پذیر می‌باشد!

✅ چنانچه دارای نسخه آسیب‌پذیری هستید، نسبت به به‌روزرسانی به نسخه‌های جدید اقدام نمایید.

✅ در صورتی که امکان به‌روزرسانی وجود نداشت، بایستی پلاگین ISO-2022-CN-EXT (یا ISO2022CNEXT) در تنظیمات iconv غیر فعال گردد. بدین منظور لازم است تغییرات زیر اعمال گردد:

▪️ ابتدا با اجرای دستور زیر، وضعیت وجود روال encoding آسیب‌پذیر بررسی می‌شود:

> iconv -l | grep -E 'CN-?EXT'

▪️ در صورت وجود موارد آسیب‌پذیری، خروجی دستور فوق به شکل زیر است:

ISO-2022-CN-EXT//
ISO2022CNEXT//

▪️ برای غیر فعال‌سازی روال encoding آسیب‌پذیر به دایرکتوری زیر رفته:

> cd /usr/lib/x86_64-linux-gnu/gconv

▪️ سپس با اجرای دستورات زیر روال آسیب‌پذیر را غیر فعال کنید.

> cd gconv-modules.d
> cat gconv-modules-extra.conf | grep -v -E 'CN-?EXT' > gconv-modules-extra-patched.conf
> rm gconv-modules-extra.conf
> cd ..

▪️ نهایتا پس از این موضوع فایل‌های cache را نیز حذف کنید.

> rm gconv-modules.cache

اقدامات مربوط به برنامه‌نویسان

🔺 به عنوان یک راه حل، هنگام تبدیل به مجموعه کاراکتر ISO-2022-CN-EXT تا زمانی که سیستم به روز شود، از انتقال داده‌های نامعتبر به تابع ()iconv خودداری کنید. برای جلوگیری از سرریز شدن بافر، تمام ورودی‌ها را به دقت تأیید و پاکسازی (sanitize) کنید.

🔺 از زبانی استفاده کنید که اجازه بروز این نقص را نمی‌دهد یا ساختارهایی ارائه می‌دهد که اجتناب از این نقص را آسان‌تر می‌کند. به عنوان مثال، بسیاری از زبان‌ها مانند Java و Perl که مدیریت حافظه خود را انجام می‌دهند در معرض سرریز بافر نیستند. زبان‌های دیگری مانند Ada و #C، معمولاً محافظت از سرریز را ارائه می‌دهند، اما این حفاظت ممکن است توسط برنامه‌نویس غیرفعال شود.

🔺 از یک کتابخانه یا چارچوب بررسی شده استفاده کنید که اجازه بروز این نقص را نمی‌دهد یا ساختارهایی ارائه می‌دهد که اجتناب از این ضعف را تسهیل می‌کند. به عنوان مثال می‌توان به کتابخانه Safe C String (SafeStr) از Messier , Viega و کتابخانه Strsafe.h از مایکروسافت اشاره کرد. این کتابخانه‌ها نسخه‌های امن‌تری از توابع مدیریت رشته مستعد سرریز ارائه می‌دهند.

🔺 از مکانیزم‌های خودکار تشخیص سرریز بافر که توسط کامپایلرها یا افزونه‌های کامپایلر ارائه می‌شوند، استفاده کنید. از جمله: Microsoft Visual Studio /GS flag, Fedora/Red Hat FORTIFY_SOURCE GCC flag, StackGuard و ProPolice, که مکانیسم‌های مختلفی از جمله تشخیص canary-based و بررسی range/index را ارائه می‌دهند.

🔺 هنگام تخصیص و مدیریت حافظه یک اپلیکیشن، قوانین زیر را رعایت کنید:

  • نرم‌افزار را با استفاده از ویژگی‌ها یا افزونه‌ها اجرا یا کامپایل کنید که به طور تصادفی موقعیت‌های اجرایی برنامه و کتابخانه‌ها را در حافظه مرتب می‌کند. از آنجایی که این امر آدرس‌ها را غیرقابل پیش‌بینی می‌کند، می‌تواند مانع از پرش مطمئن مهاجم به کدهای قابل بهره‌برداری شود.
  • از CPU و سیستم عاملی استفاده کنید که حفاظت از اجرای داده (با استفاده از بیت‌های سخت‌افزاری NX یا XD) یا تکنیک‌های مشابهی که این ویژگی را در نرم‌افزار شبیه‌سازی می‌کنند، مانند PaX ارائه می‌دهد. این تکنیک‌ها تضمین می‌کنند که هر دستوری که اجرا می‌شود منحصراً در یک آدرس حافظه است که بخشی از قطعه کد است.