
آسیبپذیریهای کتابخانه Libarchive
کتابخانه Libarchive در سال ۲۰۰۴ در پروژه FreeBSD ایجاد گردید. این کتابخانه، امکان خواندن فایلهایی با فرمتهای متفاوت فشردهسازی چون tar، zip، cpio، 7z و غیره را میسر میسازد. به دلیل وجود امکانات فراوان این کتابخانه و پشتیبانی آن از تعداد زیادی از فرمتهای فشردهسازی فایل، از آن در سایر سیستمهای عامل و نیز در نرمافزارهای متعددی برای فشردهسازی و باز کردن فایلهای فشرده استفاده میشود. اخیراً، آسیبپذیریهای سرریز بافر در فایلهایی با فرمتMtree (CVE-2016-4301)، سرریز پشته در فایلهایی با فرمتrar (CVE-2016-4302) ونیز سرریز عدد صحیح در فایلهایی با فرمت 7zip(CVE-2016-4300) یافت شده است. با سوءاستفاده از این آسیبپذیریها، میتوان بیش از حد مجاز بر روی بافر تخصیصیافته نوشت. لذا،حملهکننده میتواند کد مخرب را در فایل فشرده اضافه کند.سپس، هنگامیکه فایل فشرده توسط برنامهای که ازLibarchiveاستفاده میکند، اجرا و خوانده شود، کد مخرب در سیستم قربانی اجرا میشود.
مهمترین دلیل وجود این آسیبپذیریها، عدم برنامهنویسی امن است. چراکه؛ آسیبپذیریهای نامبرده شده، عمدتاً به دلیل عدم وارسی ورودیها- که در فایلهای فشرده، دادههایی است که از فایل فشرده خوانده میشود- وجود دارند. در حال حاضر، این آسیبپذیری در نسخه 3.2.1 این کتابخانه رفع شده است.
1-سیستمهای آسیبپذیر
از کتابخانه Libarchive، در ابزارهای فشردهسازی موجود در سیستمهای عامل FreeBSD و Debian Linuxو نیز نرمافزارهای متعددی چون ضد بدافزارها، ابزارهای مدیریت بسته[1] چون پک من[2]، ایکس. بی. پی. اس[3]، سی میک[4] وpkg-utils، ابزارهای آرشیو و جستجوی فایل چون Springy و ZIP Unpacker Component Extension؛ و ابزاری امنیتی چون yextendاستفاده میشود؛ بنابراین، هر سیستمعامل یا نرمافزاری که از نسخههای پیشین این کتابخانه (نسخ کمتر از 3.2.1) برای باز کردن فایلهای mtree، rar و 7zipاستفاده میکند،آسیبپذیر است. تاکنون، حملهای با سوءاستفاده از این آسیبپذیری گزارش نشده است.
2-چگونگی رفع آسیبپذیری
مهمترین علت وجود این آسیبپذیریها، عدم برنامهنویسی امن است. چراکه؛ آسیبپذیریهای نامبرده شده، عمدتاً به دلیل عدم وارسی ورودیها- که در فایلهای فشرده، دادههایی است که از فایل فشرده خوانده میشود- وجود دارند. توابعی جهت وارسی دقیق ورودیها، برای رفع این آسیبپذیریها در کدهای آسیبپذیر این کتابخانه افزودهشده است. در حال حاضر، این آسیبپذیری در نسخه 3.2.1 این کتابخانه رفع شده است و لازم است، نسخ قدیمی این کتابخانه بهروزرسانی گردند.
برای مثال، برای بهروزرسانیسیستمعاملFreeBSDمیتوان از یکی از روشهای زیر استفاده کرد:
- بهروزرسانی سیستمعاملFreeBSD با دستور "freebsd-update"
- دریافت و نصب وصلهها با اجرای دستورات زیر
freebsd-update fetch
freebsd-update install
- دریافت و نصب کد وصلهها، که در دو مرحله زیر انجام میگیرد:
- دریافت کدها و وارسی امضای آن
fetch https://security.FreeBSD.org/patches/SA-16:23/libarchive.patch
fetch https://security.FreeBSD.org/patches/SA-16:23/libarchive.patch.asc
gpg --verify libarchive.patch.asc
- اعمال وصلهها
cd /usr/src
patch< /path/to/patch
4.کامپایل مجدد هسته FreeBSD با دستورات "buildworld" و "installworld".
3- شیوه حمله
در کتابخانه Libarchive، سه آسیبپذیری سرریز بافر در فایلهایی با فرمت Mtree، سرریز پشته در فایلهایی با فرمت rar ونیز سرریز عدد صحیح در فایلهایی با فرمت 7zip شناساییشده است. در این بخش، جزئیات آسیبپذیری مرتبط با فایلهای Mtree و 7zip و نحوه سوءاستفاده از آنها آورده شده است.
برای مثال، آسیبپذیریفایلهای Mtree، در ماژول libarchivearchive_read_support_format_mtree.c و تابع parse_device قرار دارد. دراین تابع، سه آرگومان حاوی اطلاعات پیرامون فرمت فایل نگهداری میشود. این آرگومانها از نوع unsigned long است. همانطور که در شکل ۱ مشاهده میشود، در هیچ قسمتی از تابع، درستی نوع آرگومانهای ورودی بررسی نمیشود؛ بنابراین، حملهکننده میتواند در هریک از خانههای آرایه، بیشازاندازه درنظرگرفته شده برای متغیرهای unsigned long– که برابر با ۴ بایت در سیستمهای ۳۲ بیتی و ۸ بایت در سیستمهای ۶۴ بیتی است- بنویسد. لذا، میتواند فراتر از اندازه درنظرگرفته شده بر روی حافظه آرایه سهتایی، نوشته و محتویات آن را تغییر دهد.
شکل 1- تابع parse_device که حاوی آسیبپذیری سرریز بافر در پویش فایلهای با فرمت mtree است.
آسیبپذیری مرتبط با فایلهای 7zip، در ماژول libarchivearchive_read_support_format_7zip.c قرار دارد که بخشی از آن در شکل ۲ نشان دادهشده است. در این فایل، در خطوط ۲۱۴۹-۲۱۵۷، در متغیر unpack_streams، مجموع numUnpackStreams برای کلیه پوشهها ذخیره میشود. متغیرunpack_streams از نوع size_t است (معادل unsigned long) و حداکثر میتواند مقداری برابر با ۴ بایت در سیستمهای ۳۲ بیتی و یا ۸ بایت در سیستمهای ۶۴ بیتی را در برگیرد. حال به دلیل عدم بررسی مقدار unpack_streams،به هنگام محاسبه مجموع numUnpackStreams های پوشهها، ممکن استسرریز عدد صحیح انتسابی به unpack_streamsرخ دهد.
سپس در خطوط۲۱۶۶-۲۱۷۷، بهاندازه مقدارunpack_streams، در پشته، برای متغیر ss->unpackSizes حافظه پویا اختصاص داده میشود. در خطوط ۲۱۸۷-۲۱۹۰، برای هر یک از پوشهها و متناسب با numUnpackStreams، عددی ۶۴ بیتی از پشته ایجادشده برای ss->unpackSizesخوانده میشود. ازآنجاییکه سایز حافظه پشته با متغیر unpack_streams، تعیینشده است و درستی مقدار این متغیر وارسی نگردیده، محتوای حافظه خواندهشده، ممکن است درست نباشد.
شکل 2- بخشی از کد archive_read_support_format_7zip.c حاوی آسیبپذیری سرریز پشته در فایلهای 7zip
4- جمعبندی
کتابخانه Libarchive، از کتابخانههای متنبازی است که از فرمتهای گوناگون فایلهای فشرده چون tar، zip، cpio، 7z و غیره، پشتیبانی میکند ودر سیستمهای عامل و نرمافزارهای متعددی استفادهشده است. آسیبپذیریهای سرریز بافر در فایلهایی با فرمت Mtree (CVE-2016-4301)، سرریز پشته در فایلهایی با فرمت rar (CVE-2016-4302) ونیز سرریز عدد صحیح در فایلهایی با فرمت 7zip(CVE-2016-4300) یافت شده است. این آسیبپذیریها، امکان نوشتن بیشازحد مجاز بر روی حافظه و اجرای کدهای مخرب در سیستم قربانی را فراهم کرده و یک خطر جدی محسوب میشود. در نسخه 3.2.1 این کتابخانه، آسیبپذیریهای مذکور رفع شده است و لازم است کلیه سیستمهای حاوی این کتابخانه بهروزرسانی شوند.
[1]Package Manager
[2]Pacman
[3]XBPS
[4]CMake