هک کردن مانیتور رنو فقط برای عوض کردن ساعت
خلاصهٔ کاملتر
نویسنده یه رنو لتیتود ۲۰۱۴ داره. وقتی استونی از ساعت تابستونی به زمستونی رفت، ساعت داشبورد یه ساعت جلو موند و تو منوها هیچ گزینهای برای تغییرش پیدا نکرد. بعد از مهندسی معکوس firmware فهمید صاحب قبلی راست میگفته: تعریف منوی Settings از روی خود کارت SD نقشه خونده میشه. اون کارت هم DRM داره، یعنی فایلها با CID (شناسهی یکتای کارت) امضا شدن و نمیشه کپیشون کرد. خرید کارت هم حدود ۶۰ یورو آب میخورد، برای همین تصمیم گرفت دستگاه رو روت کنه.
دستگاه یه TomTom Carminat LIVE هست با پردازندهی Samsung S5P6440 و یه سیستمعامل اختصاصی بر پایهی لینوکس 2.6.28. اولین ایدهش دستکاری ایمیج آپدیت بود، ولی ایمیج آخرش یه امضای ۴۰ بایتی داشت و نسخهی تغییردادهشده قبول نمیشد. بعد با QEMU یه شبیهساز برای دستگاه ساخت و یه CAN emulator ساده هم اضافه کرد تا سیستم بوت بشه. این شبیهساز بعداً خیلی به کارش اومد. نشون داد تقریباً همهی پارتیشنها یا فقطخواندنی هستن یا noexec (یعنی نمیشه از روشون برنامه اجرا کرد)، که برای یه دستگاه مال ۲۰۱۱ امنیت قابلتوجهیه.
بعد سراغ master.script رفت، یه اسکریپت به زبان اختصاصی که موقع بوت از روی SD خونده میشه و باینری ttn با دسترسی root اجراش میکنه. تو این زبان دو تا چیز پیدا کرد. دستور SHEX میتونه هر باینریای که روی rootfs هست رو اجرا کنه، ولی بدون هیچ آرگومانی. دستور LOG هم میتونه یه خط متن ASCII تو یه فایل بنویسه، و چون مسیر فایل لاگ چک نمیشد، یه ضعف path traversal داشت (یعنی میشد با مسیر نسبی از پوشهی مجاز بیرون رفت و هر جای سیستم نوشت). هیچکدوم بهتنهایی کافی نبود، چون جاهای قابل نوشتن همه noexec بودن.
راهحل از یه ترفند رایج تو exploitهای کرنل لینوکس اومد: core_pattern. این تنظیم کرنل مشخص میکنه وقتی یه برنامه کرش میکنه، core dump کجا بره. اگه با علامت pipe شروع بشه، کرنل خودش یه برنامه رو اجرا میکنه و dump رو بهش میده، اون هم با آرگومان (این قابلیت از نسخهی 2.6.24 اضافه شده). نویسنده با LOG مقدار core_pattern رو از طریق procfs طوری تنظیم کرد که shell خود rootfs اسکریپتی رو از روی SD اجرا کنه. اینجوری محدودیت noexec دور زده شد.
حالا فقط یه کرش لازم بود. نویسنده تو شبیهسازش تقریباً همهی باینریها رو اجرا کرد و دید dbus-monitor وقتی به system bus وصل نمیشه SIGABRT میده و core dump میسازه. پس با SHEX اجراش کرد، کرنل اسکریپتش رو با دسترسی root اجرا کرد و اولین کاری که کرد گرفتن بکاپ کامل از eMMC بود. بعد فهمید دستگاه اصلاً مفهوم timezone نداره: ساعت رو از GPS میگیره و اختلاف محلی رو به دقیقه تو /mnt/flash/settings.dat نگه میداره. عدد ۱۸۰ رو کرد ۱۲۰ و ساعت درست شد.
نکات کلیدی:
- دستگاه: TomTom Carminat LIVE با لینوکس 2.6.28.10 و پردازندهی Samsung S5P6440
- منوی تنظیم ساعت بدون کارت SD نقشهی اصلی با CID درست باز نمیشه
- زنجیرهی حمله: path traversal تو دستور LOG + بازنویسی core_pattern + کرش عمدی dbus-monitor با SHEX
- core_pattern محدودیت noexec رو دور زد چون خود کرنل برنامه رو اجرا میکنه
- اختلاف زمانی به دقیقه تو settings.dat ذخیره میشه و از ۱۸۰ به ۱۲۰ تغییر کرد




