روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ اکتبر 2022، محققین Trail of Bits در مقالهای با جزئیات به آسیبپذیریِ SQLite DBMS پرداختند. این مقاله به حملات احتمالی که میتوانند از طریق CVE-2022-35737 انجام پذیرند میپردازد؛ همینطور عواقبی که دامنهاش از یک خرابی ساده اپ است تا اجرای کد دلخواه. با ما همراه بمانید.
این باگ جزئی در کد SQLite به دو دلیل مورد علاقه مهاجمین است و بالقوه میتواند خطرناک باشد: ابتدا اینکه از اکتبر 2000 در SQLite بوده – تقریباً از شروع توسعه این نرمافزار منبع باز. دوم اینکه قابلیتهای SQLite به لحاظ تئوریک، حمله به دامنه وسیعی از برنامهها را که در خود SQLite دارند ممکن میسازد.
قابلیتهای SQLite
SQLite یک DBMS فشرده، منبعباز و جاسازیشده است که اولین بار 22 سال پیش عرضه شد (آگست 2000). منظورمان از «جاسازیشده» تعریفی کلیدی است: SQLite به عنوان نرمافزاری جداگانه نصب نمیشود. در عوض از آن بعنوان آرشیوی برای توسعهدهندگان نرمافزاری که نیاز دارند با پایگاههای اطلاعاتی کار کنند استفاده میشود. SQLite پیشفرض در جاهایی مثل گوگل کروم، فایرفاکس یا سافاری، اندروید، اپهای شبکهای و غیره درونسازی میشود و بسیاری حتی پکهای سیستمعامل را بر اساس کرنل لینوکس عرضه میکنند. SQLite برای لایسنس بازش به محبوبیت رسید؛ همینطور بخاطر قابلاطمینان بودنش و امنیتی که ارائه میداد: تاکنون تنها کمی نقص در کد DBM پیدا شده است.
جزئیات CVE-2022-35737
متخصصین باگی را در کد تابع sqlite3_snprintf شناسایی کردند که برای تعامل با پایگاه داده در برنامههایی که به زبان C/C++ نوشته میشدند استفاده میشد. اگر یک رشته ورودی بسیار بزرگ (بیش از 2 گیگابایت) را به آن تابع ارسال کنید، باعث از کار افتادن برنامه میشود؛ بدینترتیب راه برای حمله DoS باز میشود. در کد sqlite3_snprintf برای محاسبهی سایز رشته ارسالشده از متغیر عدد صحیح استفاده میشد. اگر رشته ارسالی خیلی بزرگ باشد متغیر میتواند ارزش منفی بگیرد. این سپس باعث میشود بافر مموری تخصیص داده شود که برای نوشتن رشته دریافتی خیلی کوچک است.
اینجاست که خطای رایج سرریز بافر رخ میدهد. این خطا به احتمال زیاد همان 22 سال پیش وارد کد شده؛ زیرا ارسال گیگابایتها پارامتر تابع به دلیل محدودیتهای منبع آن زمان امکان نداشته است. اما دیگر چنین نیست: چیزی که مشخصاً در این تحقیق بدان پرداخته شده است فرض این است که چرا چنین خطایی در طول تست کد استاندارد از قلم افتاده است. روند تست در درجه اول هدفش بررسی کد تازه اضافهشده یا تازه اصلاحشده است و این درحالیست که کد بیش از دو دهه است که تغییر نکرده. سخت میشود چنین آسیبپذیریهایی را با فازینگ[1] -که از پارامترهای تصادفی بعنوان ورودیهای تابع تغذیه میکند- شناسایی کرد. متودهای رایج فازینگ شامل تولید رشتههایی با چنین سایزهایی نمیشوند. نویسندگان این پژوهش چنین نتیجهگیری کردند که فازینگ نمیتوانند تماماً جای تحلیل کد ایستا را که شامل اجرای دستی آن نیز میشود بگیرد.
پیامدهای ضمنی
Trail of Bits توانست حمله DoS اصلی را مدرنیزه کند تا بتواند با دستکاری کردنِ با دقت محتوا و سایز پارامتر ارسالی، کد دلخواه را اجرا کند. گرچه نویسندگان این مقاله اثبات مفهومی را نشان دادند که خود گویای نمونههای حمله بود اما اینها تمرینی هستند تماماً فرضی برای حمله به خود SQLite. با این همه –همانطور که بالاتر گفتیم- SQLite یک DBMS جاسازیشده است؛ پس اگر فردی بخواهد ضرر حسابی بزند باید به اپی حمله کند که در آن کد SQLite جاساز شده است. اینطور به نظر میرسد که در پژوهش مورد بحث، فرضیات زیادی وجود دارد و شاید هرگز اجرایی شدن آنها اثبات نشود. محدودیتهای دیگری نیز وجود دارد.
بر اساس دادههای توسعهدهندگان SQLite، این باگ فقط به رابط برنامههای C مربوط میشود و کد فقط باید با پارامترهای خاصی کامپایل شده باشد. خود محققان Trail of Bits به عدم امکان حمله در صورتی که SQLite با استفاده از قناریهای پشته کامپایل شده باشد اشاره میکنند. این اساساً یک روش اضافی برای محافظت از حمله سرریز بافر است - جلوگیری از اجرای کد دلخواه حتی زمانی که سرریز خود امکان پذیر باشد. آسیبپذیری در SQLite 3.39.2 بسته شد که در جولای 2022 منتشر شد. با این حال، این پچ تأثیر کمی داشته است.
توسعه دهندگان نرم افزار که از SQLite به عنوان بخشی از کد خود استفاده میکنند، به احتمال زیاد باید توسعههای خود را به روز کنند و نسخه نرم افزار جدیدی را توزیع نمایند. تا آن زمان، آسیبپذیری در آنجا باقی خواهد ماند. و فراموش نکنید که بسیاری از برنامههای دارای SQLite دیگر پشتیبانی نمیشوند. هنوز مشخص نیست که این آسیبپذیری چقدر خطرناک است یا اینکه آیا میتوان از آن در عمل بهرهبرداری کرد یا نه. با قضاوت بر اساس تعریف توسعه دهندگان SQLite، احتمال یک حمله واقعی کم است – اما صفر نیست. در این میان، باگ مربوطه به مجموعه باگهای قدمت بالا اضافه شده است که به طور بالقوه میتواند برای توسعهدهندگان نرم افزار دردسر ایجاد کند.
[1]یا آزمون فاز یک فرایند آزمون نرمافزار است که شامل فراهم کردن دادههای ناصحیح، غیرمنتظره، اعداد تصادفی بهعنوان ورودی به یک نرمافزار رایانهای است.
منبع: کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.