اخیراً سه آسیبپذیری بحرانی در نرمافزار Adobe Acrobat Reader DC در نسخه سیستمعامل mac که به مهاجمان امکان میدهد به دسترسی Root دست پیدا کنند، وصله شد (CVE-2020-9615، CVE-2020-9614، CVE-2020-9613). تنها نصب Adobe Acrobat Reader DC باعث ایجاد آسیبپذیریها میشود. یک کاربر عادی سیستمعامل mac (با SIP فعال شده) میتواند از این زنجیره آسیبپذیریها جهت افزایش دسترسی به ROOT بدون اطلاع کاربر، بهرهبرداری کند.
با استفاده از دسترسی ROOT میتوان تقریباً هرگونه عملیاتی را در سیستم انجام داد؛ ایجاد کاربری جدید، نصب برنامه، تغییر فایلها و خواندن/نوشتن در همه فایلها/پایگاهدادههای حساس. با این حال در سیستمعامل mac جدید، فرآیندهای ROOT خارج از sandbox (حالت محافظتی) وجود ندارد؛ بیشتر سرویسهای داخلی سیستمعامل mac درون یک sandbox اجرا میشوند.
علاوه بر سرویسهای داخلی Mac، نرمافزارهای محبوب از جمله Adobe Acrobat Reader DC اهداف خوبی برای مهاجمان هستند. یکی از اجزای Adobe Acrobat Reader DC به نام com.adobe.ARMDC.SMJobBlessHelper در مسیر /Library/PrivilegedHelperTools/ مسئول بهروزرسانی نرمافزار است؛ که با دسترسی root اجرا شده، هیچگونه sandbox در آن اعمال نشده است و از یک سرویس XPC به نام SMJobBlessHelper (com.adobe.ARMDC.SMJobBlessHelper) میزبانی میکند. بیشتر سرویسهای XPC از جمله SMJobBlessHelper پیش از هر کاری client اتصال خود را بررسی میکنند.
1 آسیبپذیری اول: بررسی نادرست client اتصال به نام NSXPC
SMJobBlessHelper مبتنی بر NSXPC میباشد که بررسی client آن در [SMJobBlessHelper listener:shouldAcceptNewConnection:] موجود است. منطق این بررسی طبق تصویر زیر، ابتدا دریافت PIDی client و سپس به دست آوردن شناسه Bundle بر اساس مسیر فرآیند client است. در صورتی که شناسه Bundle در client برابر com.adobe.ARMDC باشد، client قابل اعتماد است.
در کد بالا، NSBundl در واقع نمایش کد و منابع ذخیره شده در یک دایرکتوری bundle روی دیسک است که دارای یک ساختار دایرکتوری با برخی فایلها/زیرشاخهها میباشد. شناسه bundle از طریق Contents/Info.plist در ساختار دایرکتوری به دست میآید. ساختار دایرکتوری مطمئناً قابل اعتماد نیست، بنابراین میتوان با ایجاد یک دایرکتوری bundle خاص، شناسه Bundle را جعل کرد.
2 آسیبپذیری دوم: محافظت از Root در دایرکتوری Temp میتواند دور زده شود.
با توجه به تصویر زیر، فرآیند بهروزرسانی پیش از SMJobBlessHelper، ARMDCHammer را اجرا میکند، پوشه دانلود (در دایرکتوری منبع bundle) به /var/folders/zz/xxxxx/T/ منتقل میشود. متأسفانه پس از انتقال دایرکتوری، /var/folders/zz/xxxxx_n0000000000000/T/download نیاز به دسترسی root داشته و کاربران عادی به آن دسترسی ندارند. بنابراین نمیتوان این فایل و زیرشاخههای آن را تغییر داد.
3 آسیبپذیری سوم: validateBinary و launchARMHammer دارای پنجره Race Condition هستند.
با استفاده از آسیبپذیری 2 میتوان از validateBinary() جهت بررسی /tmp/test/hello_root استفاده کرد.
validateBinary و launchARMHammer از مسیر برنامه استفاده میکنند که دارای مجوزهای خاصی میباشد. بنابراین اگر /tmp/test/hello_root را پس از validateBinary با فایل مخرب خود تعویض کنیم، launchARMHammer فرآیند مخرب را اجرا میکند.
4 بهره برداری
4-1 دور زدن بررسی Client اتصال NSXPC
همانطور که در بالا ذکر شد، NSBundle قابل اعتماد نیست، بنابراین میتوان با استفاده از شناسه bundle به نام com.adobe.ARMDC آن را جعل کرد. جهت صرفه جویی در زمان، bundle اصلی Adobe را از مسیر /Library/Application Support/Adobe/ARMDC/Application/Adobe Acrobat Updater.app کپی میکنیم.
سپس client بهرهبرداری NSXPC را کامپایل کرده و آن را در Adobe Acrobat Updater.app/Contents/MacOS/ کپی میکنیم.
حال SMJobBlessHelper-Exploit به عنوان NSXPC client اجرا میشود و [SMJobBlessHelper listener:shouldAcceptNewConnection:] را بررسی نمیکنیم.
4-2 دور زدن محافظت Root در دایرکتوری Temp
پیش از آن که SMJobBlessHelper به دایرکتوری دانلود منتقل شود، یک [1]symlink در این دایرکتوری ایجاد میکنیم.
سپس در رابط XPC، BlessHelper را اجرا میکنیم و /tmp/test/exploit/download به /var/folders/zz/xxxxx/T/download منتقل میشود. حال میتوان symlink را در /tmp/test/exploit/download/ مشاهده کرد که به /tmp/test/hello_root اشاره میکند.
با استفاده از symlink، منطق را تغییر میدهیم:
4-3 یافتن یک ARMDCHammer معتبر به منظور به دست آوردن الزامات validateBinary
validateBinary از دستور codesign داخلی برای بررسی معتبر بودن /var/folders/zz/xxxxx/T/download/ARMDCHammer استفاده میکند.
این پارامترها همانند شکل زیر به codesign ارائه میشوند:
4-4 Race Condition بین validateBinary و launchARMHammer
زمان بین validateBinary و launchARMHammer کوتاه است که با استفاده از OPLock میتوان این مسئله را رفع کرد. متأسفانه موردی مشابه OPLock در سیستمعامل mac وجود ندارد.
بدین منظور باید عملکرد خود را به سه بخش تقسیم کنیم. هر بخش شامل یک thread جداگانه است:
4-4-1 Thread 1: مرتباً فایلها را جایگزین کنید.
Symlink در /var/folders/zz/xxxxx/T/download به /tmp/test/hello_root اشاره میکند، بنابراین مرتباً آن را جایگزین میکنیم.
4-4-2 Thread 2: مرتباًsymlink و دایرکتوری download را آماده کنید.
5 وصلهی آسیبپذیری
مهمترین بخش وصلهی آسیبپذیری افزودن یک تابع جدید به نام -[SMJobBlessHelper validatePaths] پیش از validateBinary و اجرای آن است که symlink بودن یک مسیر را بررسی میکند.
یک بهروزرسانی جهت وصله این آسیبپذیریها منتشر شده است.
حالت محافظتی یا sandbox یک معماری اصلی است که تمام ویژگیها و گردش کار در Acrobat را دربرگرفته و آن را تغییر میدهد. این ویژگی در حالت پیشفرض غیرفعال است. توصیه میشود که برای رفع این نقص، علاوه بر بهروزرسانی برنامه، تنظیمات زیر نیز انجام شود:
- کلیک روی گزینه Edit > Preferences در منو
- کلیک روی گزینه Security (Enhanced) در دستهبندیها و انتخاب Enable Protected Mode at Startup (Preview)
- خروج از Acrobat و اجرای مجدد آن.
مراجع
[1]
[2]