ما یک مقاله تحقیقاتی اخیر را بررسی میکنیم که یک آسیبپذیری سختافزاری بزرگ در CPUهای Apple M1، M2 و M3 را برجسته میکند.
در اواسط ماه مارس، محققان چندین دانشگاه ایالات متحده مقالهای را منتشر کردند که آسیبپذیری سختافزاری در پردازندههای سری M اپل را نشان میداد. این پردازندهها، بر اساس معماری ARM و طراحی شده توسط اپل، قدرت اکثر لپتاپها و دسکتاپهای جدیدتر و همچنین برخی از مدلهای iPad را تامین میکنند. این مشکل به طور بالقوه می تواند برای شکستن الگوریتم های رمزگذاری مورد سوء استفاده قرار گیرد. حمله ای که از این آسیب پذیری استفاده می کند “GoFetch” نام داشت.
ترکیبی از یک موضوع حساس و یک سازنده مشهور مانند اپل منجر به این شد که این مقاله بسیار فنی توسط طیف گسترده ای از رسانه ها – هم فنی و هم نه چندان زیاد – مورد توجه قرار گیرد. بسیاری با عناوین هشداردهنده ای مانند “داده های خصوصی خود را به لپ تاپ های اپل اعتماد نکنید” اجرا کردند. در واقعیت، وضعیت چندان وخیم نیست. با این حال، برای اینکه واقعاً به بررسی این مشکل جدید بپردازیم، باید کمی به نحوه کار CPU ها بپردازیم – به طور خاص با بحث در مورد سه مفهوم: واکشی اولیه داده، برنامه نویسی در زمان ثابت و حملات کانال جانبی. مثل همیشه، ما سعی خواهیم کرد همه چیز را به ساده ترین عبارت ممکن توضیح دهیم.
پیش واکشی داده ها
CPU یک کامپیوتر رومیزی یا لپ تاپ برنامه هایی را اجرا می کند که به صورت کد ماشین نمایش داده می شوند. به زبان ساده، این یک دسته از اعداد است – برخی نشان دهنده دستورالعمل ها و برخی دیگر نشان دهنده داده هایی برای محاسبات هستند. در این سطح اساسی، ما در مورد دستورات بسیار اساسی صحبت می کنیم: برخی از داده ها را از حافظه واکشی کنید، چیزی را با این داده ها محاسبه کنید و نتیجه را به حافظه بازگردانید.
شما فکر می کنید این عملیات باید به این ترتیب اجرا شود. در اینجا یک مثال ساده وجود دارد: یک کاربر رمز عبور خود را برای دسترسی به کیف پول ارزهای دیجیتال وارد می کند. کامپیوتر باید رمز عبور را از RAM بخواند، چند عملیات محاسباتی را اجرا کند، بررسی کند که رمز عبور صحیح است و تنها پس از آن به داده های محرمانه دسترسی پیدا کند. اگر این روشی بود که CPUهای امروزی همه کدها را اجرا می کردند، کامپیوترهای ما به طرز دردناکی کند می شدند. پس چگونه سرعت کار را افزایش می دهید؟ شما بهینه سازی های زیادی را انجام می دهید – مانند واکشی اولیه داده ها.
واکشی اولیه داده ها به این صورت عمل می کند: اگر کد برنامه حاوی دستوری برای واکشی داده است، چرا آن را برای سرعت بخشیدن به کارها زودتر بارگذاری نکنید؟ سپس، اگر داده ها در نقطه ای مفید باشند، ما فقط برنامه را کمی سریعتر اجرا کرده ایم. اگر به دردتان نخورد، چیز مهمی نیست: فقط آن را از حافظه پنهان CPU دور میاندازیم و چیز دیگری میآوریم.
واکشی اولیه داده به این صورت است. پردازندههای اپل از یک پیشفرضکننده جدیدتر به نام «پیشفرشگر وابسته به حافظه داده» یا DMP استفاده میکنند. به طور خلاصه، DMP تهاجمی تر است. دستورات برای واکشی داده از حافظه همیشه صریح نیستند. اشارهگرها به مکانهای حافظه خاص ممکن است نتیجه کار محاسباتی باشد که هنوز باید انجام شود، یا ممکن است در یک آرایه داده ذخیره شوند که برنامه بعداً به آن دسترسی خواهد داشت. DMP سعی می کند حدس بزند کدام داده در برنامه نشانگر یک مکان حافظه است. منطق یکسان است: اگر چیزی شبیه یک اشاره گر به نظر می رسد، سعی کنید داده ها را در آن آدرس واکشی کنید. فرآیند حدس زدن به تاریخچه عملیات اخیر متکی است – حتی اگر آنها به یک برنامه کاملاً متفاوت تعلق داشته باشند.
در سال 2022، مطالعه دیگری نشان داد که DMP تمایل دارد نشانگرها را با سایر داده هایی که برنامه با آنها کار می کند اشتباه بگیرد. این لزوماً به خودی خود یک مشکل نیست – بارگذاری موارد اشتباه در حافظه پنهان CPU کار بزرگی نیست. اما وقتی صحبت از الگوریتم های رمزگذاری به میان می آید، مشکل ساز می شود. DMP می تواند برنامه نویسی زمان ثابت را تحت شرایط خاصی قطع کند. در ادامه در مورد این موضوع صحبت کنیم.
برنامه نویسی با زمان ثابت
یک قانون ساده وجود دارد: زمان پردازش داده ها نباید به ماهیت آن داده ها بستگی داشته باشد. در رمزنگاری، این یک اصل اساسی برای محافظت از الگوریتم های رمزگذاری در برابر حملات است. اغلب، عوامل مخرب سعی می کنند با تغذیه داده ها و مشاهده خروجی رمزگذاری شده به الگوریتم رمزگذاری حمله کنند. مهاجم کلید خصوصی مورد استفاده برای رمزگذاری داده ها را نمی شناسد. اگر آنها این کلید را کشف کنند، می توانند سایر داده ها، مانند ترافیک شبکه یا رمزهای عبور ذخیره شده در سیستم را رمزگشایی کنند.
الگوریتم های رمزگذاری ضعیف برخی از داده ها را سریعتر از سایرین پردازش می کنند. این به بازیگر مخرب یک ابزار هک قدرتمند می دهد: به سادگی با مشاهده زمان اجرا الگوریتم، آنها به طور بالقوه می توانند کلید خصوصی را بازسازی کنند.
اکثر الگوریتمهای رمزگذاری در برابر این نوع حمله مصون هستند: سازندگان آنها مطمئن شدند که زمان محاسبات بدون توجه به دادههای ورودی همیشه یکسان است. آزمونهای استحکام الگوریتم همیشه شامل تلاشهایی برای نقض این اصل است. این همان چیزی است که برای مثال در حمله هرتزبلید رخ داد. با این حال، برای امکان سرقت کلید واقعی، حمله باید از یک کانال جانبی استفاده کند.
حمله کانال جانبی
اگر واکشی اولیه DMP گاهی اوقات داده های برنامه معمولی را با یک اشاره گر حافظه اشتباه می گیرد، آیا به این معنی است که می تواند یک قطعه از یک کلید خصوصی را با یک اشاره گر اشتباه بگیرد؟ معلوم می شود که می تواند. محققان این را در عمل با استفاده از دو کتابخانه رمزگذاری داده محبوب نشان دادند: Go Crypto (کتابخانه استاندارد توسعه دهندگان Go) و OpenSSL (که برای رمزگذاری ترافیک شبکه و بسیاری موارد دیگر استفاده می شود). آنها الگوریتم های رمزگذاری مختلفی را بررسی کردند – از جمله RSA و Diffie-Hellman همه جا حاضر، و همچنین Kyber-512 و Dilithium-2 که در برابر حملات محاسباتی کوانتومی مقاوم هستند. با تلاش برای واکشی دادهها از یک اشارهگر نادرست که در واقع قطعهای از یک کلید خصوصی است، DMP اساساً کلید را به مهاجم «نشت میکند».
یک نکته وجود دارد: بدافزار فرضی مورد نیاز برای این حمله به حافظه پنهان دسترسی ندارد. ما نمی دانیم DMP چه چیزی در آنجا بارگذاری شده است یا از کدام آدرس RAM داده ها را دریافت کرده است. با این حال، اگر حمله مستقیم امکانپذیر نباشد، هنوز امکان استخراج اطلاعات از طریق یک کانال جانبی وجود دارد. چیزی که این امکان را فراهم می کند یک ویژگی ساده هر کامپیوتری است: داده های بارگذاری شده در حافظه پنهان CPU سریعتر از داده های موجود در RAM معمولی پردازش می شوند.
بیایید این حمله را کنار هم بگذاریم. بنابراین، ما بدافزاری داریم که می تواند داده های دلخواه را به الگوریتم رمزگذاری تغذیه کند. دومی داده های مختلفی را در حافظه پنهان بارگذاری می کند، از جمله یک کلید رمزگذاری مخفی. DMP گاهی اوقات به اشتباه داده ها را از آدرسی که در واقع بخشی از این کلید است واکشی می کند. مهاجم میتواند بهطور غیرمستقیم متوجه شود که دادهها از یک آدرس خاص واکشی شدهاند، با اندازهگیری زمان لازم برای دسترسی CPU به قطعات خاصی از دادهها: اگر دادهها در حافظه پنهان بودند، دسترسی به آن کمی سریعتر از موارد دیگر خواهد بود. این دقیقاً همان چیزی بود که محققان اصل برنامهنویسی زمان ثابت را شکستند: ما میتوانیم متن دلخواه را به الگوریتم وارد کنیم و زمان پردازش متفاوت را تماشا کنیم.
بنابراین، آیا داده های شما در معرض خطر است؟
در عمل، استخراج یک کلید رمزگذاری نیازمند ده ها تا صدها هزار عملیات محاسباتی است، زیرا ما داده ها را به الگوریتم وارد می کنیم و به طور غیرمستقیم وضعیت حافظه پنهان را نظارت می کنیم. این یک حمله مطمئن است، اما بسیار نیازمند منابع است: سرقت یک کلید در بهترین حالت یک ساعت طول می کشد – در بدترین حالت بیش از ده ساعت. و برای تمام این مدت، تلاش محاسباتی دستگاه را تقریباً با ظرفیت کامل کار می کند. وب سایت GoFetch یک نمایش ویدئویی از حمله دارد، جایی که کلید خصوصی ذره ذره استخراج می شود – به معنای واقعی کلمه.
با این حال، این چیزی نیست که حمله را غیرعملی می کند. ما بارها اشاره کردهایم که این حمله مستلزم نصب بدافزار بر روی رایانه قربانی است. همانطور که می توانید تصور کنید، اگر این مورد باشد، داده ها قبلاً طبق تعریف به خطر افتاده اند. احتمالاً راه های بسیار ساده تری برای رسیدن به آن در این مرحله وجود دارد. به همین دلیل است که توسعه دهندگان OpenSSL حتی گزارش محققان را در نظر نمی گیرند: چنین حملاتی خارج از مدل امنیتی آنها است.
تمام مطالعات این چنینی را می توان با مهندسی عمران مقایسه کرد. برای مقاوم ساختن یک سازه، مهندسان باید ویژگیهای مصالح مورد استفاده، ویژگیهای خاک محل مورد نظر را مطالعه کنند، شرایطی را برای خطر زلزله ایجاد کنند و بسیاری از کارهای دیگر را انجام دهند. در بیشتر موارد، حتی یک ساختمان ضعیف برای چندین دهه بدون مشکل باقی خواهد ماند. با این حال، ترکیب نادری از شرایط ممکن است منجر به فاجعه شود. سناریوهای حمله مانند GoFetch برای جلوگیری از چنین بلایایی طراحی شده اند که منجر به افشای گسترده اسرار کاربران می شود.
محققان به مطالعه این مکانیسم نسبتاً جدید پیش واکشی ادامه خواهند داد. پردازندههای اینتل نیز با شروع نسل سیزدهم از آن استفاده میکنند، اما ثابت کردهاند که نسبت به این نوع حمله خاص که در مقاله تحقیقاتی پیشنهاد شده است، حساس نیستند. آنچه مهم است این است که این آسیبپذیری قابل اصلاح نیست: این آسیبپذیری همچنان بر پردازندههای M1 و M2 اپل در تمام طول عمر آنها تأثیر میگذارد. تنها راه جلوگیری از این نوع حمله، اصلاح الگوریتم های رمزگذاری است. یک امکان شامل محدود کردن محاسبات به هستههای «کارآمد انرژی» CPU است، زیرا DMP فقط روی هستههای «با عملکرد بالا» کار میکند. یکی دیگر از موارد مبهم کردن کلیدهای رمزگذاری قبل از بارگیری آنها در RAM است. یکی از عوارض جانبی این روش ها کاهش عملکرد است – اما کاربر به سختی متوجه می شود. به نوبه خود، CPUهای Apple M3 دارای یک پرچم خاص هستند که بهینه سازی DMP را برای عملیات های حساس غیرفعال می کند.
بیایید خلاصه کنیم. هیچ تهدیدی فوری برای داده های ذخیره شده در دستگاه های اپل وجود ندارد – به ندرت کسی سعی می کند از تکنیکی به این پیچیده برای سرقت آن داده ها استفاده کند. با این وجود، کار این محققان آمریکایی همچنان ارزشمند است، زیرا تا حدودی جنبههای عملیاتی ناشناخته نحوه عملکرد آخرین CPUها را روشن میکند. تلاش آنها برای جلوگیری از مشکلات آینده است که ممکن است در صورت کشف یک سوء استفاده آسان تر ایجاد شود.
ترجمه:
پیشگامان تجارت امن ایرانیان