
به گزارش XDA Developers، پردازندههای مدرن میتوانند صدها میلیارد دستور را در هر ثانیه پردازش کنند و یکی از عوامل اصلی این سرعت خیرهکننده، ویژگیای به نام اجرای حدسی (Speculative Execution) است. در این روش، پردازنده نتیجه یک برنامه را پیشبینی و آن را پیش از موعد اجرا میکند تا عملکرد سیستم بهطور محسوسی افزایش یابد.
اجرای خارج از ترتیب (Out-of-Order Execution) از دهه ۱۹۶۰ در فناوری پردازندهها حضور داشته، اما اجرای حدسی واقعی تنها از دهه ۱۹۹۰ به پردازندههای مصرفی راه یافته است. بدون اجرای حدسی، کارهای روزمره بسیار کندتر میشدند؛ با این حال، همین بهینهسازی سختافزاری درهای آسیبپذیریهای امنیتی جدی مانند Spectre و Meltdown را نیز باز کرده است.
اجرای حدسی چگونه سرعت پردازنده را افزایش میدهد؟
پردازندهها دادهها را بسیار سریعتر از آنی پردازش میکنند که حافظه رم (RAM) یا حافظه ذخیرهسازی بتواند اطلاعات را به آنها برساند. به همین دلیل، پردازنده از پیشبینی شاخه (Branch Prediction) استفاده میکند تا حدس بزند یک تابع یا برنامه در ادامه چه مسیری را طی میکند. سپس این حدس را اجرا و نتیجه را تا روشن شدن کامل برنامه در حافظه پنهان (Cache) نگه میدارد.
اگر پیشبینی درست باشد، نتیجه در حافظه ثبت میشود (Commit) و اگر نادرست باشد، نتایج پاک و وضعیت پردازنده بازگردانی میشود (Flush) و جریمه زمانی کوچکی به عملکرد سیستم وارد میشود. همین اجرای خارج از ترتیب و نگاه به جلو، هسته اصلی عملکرد چشمگیر پردازندههای امروزی است.
از CDC 6600 تا پنتیوم پرو؛ تاریخچهای کوتاه
پیش از آنکه ابررایانههایی مانند CDC 6600 در سال ۱۹۶۴ مفاهیم پردازش موازی و اجرای خارج از ترتیب را معرفی کنند، رایانهها عملیات را به شکلی کاملاً خطی انجام میدادند. اجرای خارج از ترتیب در CDC 6600 که «scoreboarding» نامیده میشد، به پردازنده اجازه میداد در صورت تأخیر یک دستور، به دستور مستقل بعدی بپردازد. این روش هنوز به معنای اجرای حدسی نبود، زیرا پردازنده مطمئن بود دستور بعدی در نهایت مورد نیاز خواهد بود.
با وجود استفاده از بهینهسازیهایی مانند خط لولهکشی (Pipelining) و اجرای ابرپردازهای (Superscalar Execution) از دهه ۱۹۶۰، اولین پردازنده x86 که اجرای حدسی را بهطور کامل پیادهسازی کرد، اینتل پنتیوم پرو در سال ۱۹۹۵ بود. از دهه ۱۹۷۰ تا ۱۹۹۰، اجرای حدسی تنها در ابررایانههای چندمیلیون دلاری یافت میشد و با امکان قرار دادن دهها میلیون ترانزیستور روی یک تراشه سیلیکونی در دهه ۱۹۹۰، این فناوری به پردازندههای رومیزی رسید.
Spectre چگونه از پیشبینی نادرست سوءاستفاده میکند؟
در ژوئن ۲۰۱۷، پژوهشگران امنیتی آسیبپذیری Spectre را کشف کردند و پیش از افشای عمومی در ژانویه ۲۰۱۸، سازندگان تراشه مانند اینتل، AMD و ARM را در جریان گذاشتند. خوشبختانه هیچ مورد مستند و موفق حمله Spectre در دنیای واقعی ثبت نشده است؛ زیرا پژوهشگران پیش از بهرهبرداری، آسیبپذیری را شناسایی کردند. سازندگان تراشه محافظتهایی را در سطح سختافزار و BIOS پیادهسازی کردند و شرکتهای سیستمعامل و مرورگر نیز بخش نرمافزاری را پوشش دادند.
Spectre در تئوری با آموزش پیشبینیکننده شاخه پردازنده کار میکند تا آن را وادار کند مسیر نادرستی را حدس بزند. مهاجم با ارسال هزاران باره ورودیهای معتبر و قانونی، پردازنده را طوری تربیت میکند که حتی هنگام دریافت ورودی نامعتبر و مخرب نیز به همان شکل حدس بزند. به این ترتیب، مهاجم میتواند پردازنده را فریب دهد تا دادههای محرمانه هسته (Kernel) را در رجیستر (Register) ذخیره کند. هرچند پردازنده در یک میکروثانیه پیشبینی نادرست را کنار میگذارد، ردپای دادههای محرمانه در حافظه پنهان (Cache) باقی میماند.
سپس هکرها با حملات پیچیده کانال جانبی (Side-Channel Attacks) میتوانند بایتبهبایت دادههای محرمانهای را که پردازنده بهصورت حدسی به آنها دسترسی پیدا کرده است، بازسازی کنند. آنها میتوانند رمزهای عبور، کلیدهای رمزنگاری و اسناد حساس را بازیابی کنند. با اینکه حملات Spectre بسیار پیچیدهاند و پاداش آنها همیشه تضمینشده نیست، اما ردپایی از خود باقی نمیگذارند و به همین دلیل نمیتوان بهسادگی گفت آیا عملیات بزرگ دولتی در گذشته موفق به اجرای آن شدهاند یا نه.
ویندوز و وصلههای نرمافزاری چه نقشی دارند؟
از زمان شناسایی آسیبپذیری Spectre، ویندوز محافظتهای گوناگونی را پیادهسازی کرده است. این محافظتها اساساً اجرای حدسی را مختل یا غیرفعال میکنند و بهطور مستقیم بر عملکرد پردازنده اثر میگذارند. بارهای کاری (Workloads) که از مرز میان برنامهها و هسته (Kernel) عبور میکنند، بیشترین تأثیر عملکردی را احساس میکنند. سایر کارهایی که عمدتاً روی هستههای پردازنده اجرا میشوند و تعامل زیادی با هسته سیستمعامل ندارند، چندان تحت تأثیر قرار نمیگیرند.
تستهای خود مایکروسافت نشان داده است که در پردازندههای اینتل هسول (Haswell) نسل چهارم و مدلهای قدیمیتر، تأثیر عملکردی میتواند قابل توجه باشد. تغییرات رجیستری (Registry) و ابزارهای رایگان شخص ثالث میتوانند محافظتهای سمت سیستمعامل را غیرفعال کنند و در برخی بارهای کاری افزایش عملکرد به همراه داشته باشند. با این حال، احتمالاً پردازنده شما از تغییرات محسوس سود نمیبرد، زیرا محافظتهای سطح سیلیکون و روشهای کمهزینهای مانند Retpoline دارد که میتوان آنها را فعال نگه داشت.
آیا غیرفعال کردن محافظتها توصیه میشود؟
افراد دارای پردازندههای قدیمیتر ممکن است وسوسه شوند برای افزایش عملکرد، محافظتهای Spectre را غیرفعال کنند، اما این کار توصیه نمیشود. با وجود اینکه حملات Spectre به کد پیچیده و زمانبندی دقیق نیاز دارند، رها کردن سیستم در حالت آسیبپذیر منطقی نیست. هکرها همچنان نسخههای جدید Spectre را توسعه میدهند و همین موضوع بهروزرسانیهای دورهای ریزکد (Microcode) و هسته (Kernel) را ضروری میکند. نادیده گرفتن یا غیرفعال کردن چنین محافظتهایی میتواند دادههای حساس را تهدید کند، حتی اگر احتمال آن بسیار کم باشد.
جمعبندی
اجرای حدسی از دنیای پردازندهها حذفشدنی نیست و آسیبپذیریهای امنیتی مرتبط با آن نیز همینطور. سازندگان رایانه و بازیگران مخرب همیشه در یک بازی موش و گربه برای بهرهبرداری و وصله کردن آسیبپذیریها درگیر خواهند بود. کاربران باید مطمئن شوند که از همه ویژگیهای امنیتی در دسترس استفاده میکنند؛ زیرا حتی اگر احتمال حمله به یک سیستم خاص کم باشد، حملات فراگیر میتوانند شمار زیادی از رایانهها را در صورت ساده بودن اجرا تحت تأثیر قرار دهند.