روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ متخصصین دانشگاه کمبریج آسیبپذیریای را شرح دادند که به گفته آنها بیشتر کامپایلرهای مدرن را تحتالشعاع قرار داده است. یک شیوه حمله جدید و بکر از قابلیت قانونی ابزارهای توسعه استفاده میکند و بموجب این ترفند، کد منبع یک چیز نشان میدهد اما چیزی کاملاً متفاوت را کامپایل میکند. این جادوی کاراکترهای کنترل Unicode است.

بیشتر وقتها کاراکترهای کنترل روی صفحه با بقیه کد ظاهر نمیشوند (هرچند برخی ادیتورها آنها را نمایش میدهد) اما به طریقی متن را دستکاری میکنند. در این جدول کدهایی را مشاهده میکنید حاوی بعنوان مثال الگوریتم دوجهتهی Unicode[1]. همانطور که احتمالاً میدانید برخی زبانهایی که انسانها استفاده میکنند از چپ به راست است (مانند انگلیسی) و بقیه نیز از راست به چپ (مثل عربی). وقتی کدی فقط حاوی یک زبان باشد مشکلی نیست اما در صورت لزوم -وقتی برای مثال یک خط دارای لغاتی هم به انگلیسی و هم به عربی باشد- کدهای bidi (دو جهته) مسیر و جهت متن را تعیین میکنند. محققین از چنین کدهایی برای مثال جهت حرکت دادن ترمیناتورِ کامنت از کد پایتون[2] استفاده کردند (از وسط خط به آخر خط). آنها برای تغییر چند کاراکتر از کد RLI استفاده کردند و بقیه چیزها را دستنخورده باقی گذاشتند.

در بخش راست نسخهای وجود دارد که برنامهنویسان موقع چک کردن کد منبع آن را میبینند؛ سمت چپ هم نشان میدهد چطور کد اجرا خواهد شد. بیشتر کامپایلرها کاراکترهای کنترل را نادیده میگیرند. هر کسی که کد را چک میکند با خود فکر خواهد کرد خط پنجم یک کامنت بیخطر است اما در باطن یک جمله مخفیشده داخلش بزودی باعث خواهد شد برنامه عملیات را رد کرده و نادیدهاش بگیرد؛ عملیاتی که کارش درآوردن پول از حساب بانکی است. در این نمونه –به بیانی دیگر- برنامه بانکی شبیهسازیشده پول را توزیع میکند اما موجودی حساب را کم نمیکند.
چرا باید از این آسیبپذیری ترسید؟
در اولین نگاه، این آسیبپذیری به نظر ساده میآید. چه کسی میآید کاراکترهای نامرئی را درج کند و امید داشته باشد ممیزگرهای کد منبع فریب بخورند؟ با این حال مشکل آنقدری جدی تلقی شده بود که یک شناسه آسیبپذیری تضمین شود (CVE-2021-42574). پیش از نشر این مقاله، نویسندگان در مورد رایجترین کامپایلرها به توسعهدهندگان اطلاع دادند و به آنها زمانی دادند برای آماده کردن یک سری پچ.
این آسیبپذیری تا چه میزان خطرناک است؟
کمی بعد از نشر این مقاله رای کاکسِ برنامهنویس حمله Trojan Source را مورد انتقاد قرار داد. او در حقیقت تحتتأثیر قرار نگرفت. در ادامه بخشهایی از صحبتهای او را خواهیم داشت:
- این اصلاً حملهی جدیدی نیست.
- بسیاری از ادیتورهای کد برای نمایش کد نامرئی از برجستهسازی نحوی استفاده میکنند.
- پچهای کامپایلرها لازم نیستند- همین که با دقت کد چک شود تا مبادا در آن باگهای آلوده یا تصادفی وجود داشته باشد کفایت میکند.
در واقع مشکلی که اکنون با کاراکترهای کنترل Unicode پیدا شده است ریشه در سال 2017 دارد. همچنین مشکل مشابهی هم با هموگلیفها[3] -کاراکترهایی که یکجور به نظر میرسند اما کدهای مختلفی دارند- پیش آمده که آن هم چندان جدید نیست و کارش پنهان کردن کدهای اضافی برای عبورد دادنشانهای از بازرسیهای دستی است. با این حال تحلیل انتقادیِ کاکس موجودیت این چالش را انکار نمیکند، بلکه گزارشاتی را که در آنها از بار دراماتیک بسیاری استفاده شده بود محکوم میکند- برای مثال توصیف نامناسب روزنامهنگار برایان کرب از باگ Trojan Source که میگفت امنیت کل کد را به خطر میاندازد. مشکل، واقعی است اما خوشبختانه راهکار حل آن بسیار ساده است. همه پچهایی که تا به حال نشر شدند یا قرار است بزودی نشر شوند کامپایل کردن کدهای حاوی چنین کاراکترهایی را بلاک خواهند کرد. اگر از ابزارهای ساخت نرمافزاری مخصوص به خود استفاده میکنید توصیه میکنیم برای کاراکترهای مخفی که نباید به طور نرمال در کد منبع ظاهر شوند یک چک مشابه اضافه کنید.
خطر حملات زنجیره تأمین
بسیاری از شرکتها تسکهای توسعه را برای کنتراکتورها برونسپاری میکنند و یا از ماژولهای منبع باز از پیش آماده در پروژههای خود استفاده مینمایند. این کار همیشه دری را به روی ورود حملات زنجیره تأمین باز میکند. مجرمان سایبری میتوانند یک کنتراکتور را دستکاری کرده و یا در یک پروژهی منبع باز کدی را جاساز کنند و در ادامه کد مخرب را در نسخه نهایی نرمافزار بگنجانند. ممیزیهای کد معمولاً چنین بکدرهایی را برملا میکنند اما اگر نکردند، کاربران نهایی ممکن است نرمافزار را از منابع قابلاطمینان دریافت کنند اما هنوز دادههای خود را از دست داده باشند. Trojan Source نمونهی دیگریست از حملهای به مراتب باشکوهتر. مهاجمین به جای اینکه سعی کنند مگابایتهای کد مخرب را در محصولی نهایی قاچاق کنند میتوانند از چنین رویکردی برای معرفی ایمپلنتی که بسختی شناسایی میشود در بخش مهمی از یک نرمافزار استفاده کرده و آن را تا سالهای آتی همچنان اکسپلویت کنند.
راهکارهای امنیتی
- همه کامپایلرهای زبان برنامهنویسی را که استفاده مینمایید آپدیت کنید (اگر برایشان پچی ارائه شده است)
- اسکریپتهای خود را بنویسید؛ که دامنه محدودی از کاراکترهای کنترل را در کد منبع شناسایی کند.
مبارزه در برابر حملات بالقوهی زنجیره تأمین نیازمند ممیزیهای دستی کد و نیز دامنهای از تستهای اتومات است. دیدن کد خودتان از دریچه نگاه مجرمان سایبری هرگز ضرری نداشته و نخواهد داشت. سعی کنید یک ارور ساده را هدف بگیرید؛ اروری که میتواند کل مکانیزم امنیتی را به هم بریزد. اگر برای چنین نوع تحلیلی منابع لوکال کافی ندارید از متخصصین خارجی کمک بگیرید.
[1] Unicode Bidirectional (bidi) Algorithm
[2] Python code
[3] homoglyphs
منبع: کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.