حمله زمانبندی

در رمزنگاری، حمله زمانبندی یا حملات زمانی یک نوع حمله کانال جانبی میباشد که در آن مهاجم در تلاش است تا با تحلیل زمان اجرای الگوریتم های رمز نگاری، یک سیستم رمزنگاری بسازد.در هر کامپیوتر هر عمل منطقی نیاز به زمان برای اجرا شدن دارد و این زمان میتواند بر اساس ورودی متفاوت باشد. با اندازه‌گیری دقیق زمان هر عملیات، مهاجم میتواند به صورت معکوس عمل کرده و به ورودی دسترسی پیدا کند.  

اطلاعات یک سیستم میتواند به وسیله  اندازه گیری زمان مورد نیاز برای پاسخ به درخواست‌ها فاش شود. میزان کمکی که این اطلاعات به مهاجم می‌کند، بستگی به متغیرهای فراوانی دارد. طراحی سیستم رمزنگاری، پردازنده‌ای که سیستم را اجرا می‌کند، الگوریتم‌های مورد استفاده، جزئیات پیاده‌سازی، اقدامات متقابل حمله زمان‌بندی، میزان دقت اندازه‌گیری زمان از این موارد بشمار میروند. 

حمله‌های زمانبندی معمولاً در فاز طراحی نادیده گرفته میشوند، زیرا این حمله‌ها به نحوه پیاده سازی بستگی دارند و معمولاً به طور ناخواسته توسط ابزارهای بهینه‌سازی کامپایلر  ( compiler optimization ) ایجاد میشوند. پیشگیری از حمله‌های زمانبندی شامل طراحی توابع با زمان ثابت و بررسی و آزمایش دقیق کد اجرایی نهایی میباشد.  

 مفهوم 
حمله زمانبندی نمونه‌ی یک حمله است که در آن ویژگی‌های رفتاری وابسته به داده در پیاده سازی یک الگوریتم را به جای خواص ریاضیاتی الگوریتم، به کار میگیرد. 

اکثر الگوریتم‌های رمزنگاری میتوانند به گونه‌ای پیاده‌سازی شوند که در آن، وابستگی زمانی داده کاهش داده و یا حذف شود. بعنوان مثال پیاده سازی‌ای را در نظر بگیرید که در آن هر زیربرنامه‌ای در زمان x ثانیه پاسخ خواهد داد، که x بیشترین زمان ممکن برای پاسخ دادن به هر ورودی مجاز برای آن زیربرنامه میباشد. در اینگونه پیاده‌سازی زمانبندی الگوریتم، هیچ گونه اطلاعاتی در مورد داده‌های فراهم شده را فاش نمی‌سازد. نکته منفی این پیاده‌سازی این است که پیچیدگی زمانی اجرای همه‌ی دستورها در بدترین حالت قرار میگیرد که باعث کاهش کارایی توابع خواهد شد. 

حملات زمانی در نمونه‌های زیادی کاربردی هستند: 
 حملات زمانی میتواند بر روی هر الگوریتمی که وابستگی زمانی داده دارد، اعمال شود. نرم‌افزازی که برروی پردازنده همراه با یک حافظه cache اجرا می‌شود، گوناگونی وابستگی زمانی داده را به عنوان نتیجه بررسی کَش توسط مموری نشان میدهد. برخی از عملیات‌ها، مانند عمل ضرب، با توجه به ورودی آن‌ها ممکن است زمان اجرای مختلفی داشته باشند. حذف کردن وابستگی زمانی در الگوریتم هایی که از عملیات های سطح پایین که زمان اجرای گوناگونی دارند، کار دشواری خواهد بود.
 دستیابی به اسرار سیستم رمزنگاری از طریق اطلاعات زمانی میتواند به طور چشمگیری آسان‌تر از تحلیل رمز متن اصلی و متن رمز شده معادل باشد. در برخی موارد، اطلاعات زمانی با تحلیل رمز درآمیخته می‌شود تا میزان اطلاعات فاش شده را افزایش دهد.

 مثال ها 
زمان مورد نیاز برای اجرای الگوریتم توان رسانی دودویی که در به توان رسانی پیمانه‌ای به کار رفته، به طور خطی به تعداد یک های به کار رفته در کلید وابستگی دارد. در حالی که تعداد یک های بکار رفته، به تنهایی اطلاعات کافی‌ای برای راحت‌تر ساختن دستیابی به کلید به ما نمی‌دهد، اجرا های تکرار شده به‌وسیله همان کلید یکسان و ورودی های متفاوت میتوانند نمونه های خوبی برای تحلیل های مرتبط با همبستگی آماری از اطلاعات زمانی باشند که برای بازیابی کامل کلید حتی در هنگام مواجهه با یک مهاجم مجهول مؤثر خواهند بود. اندازه‌گیری زمان مشاهده شده معمولاً حاوی نویز هستند (از طریق تاخیر موجود در شبکه یا منبع، یا زمان دسترسی به حافظه مختلف و یا از طریق تکنیک های تشخیص و تصحیح خطا که برای خطاهای انتقال استفاده میشود). با این وجود، حملات زمانبندی در مقابل شماری از الگوریتم های رمزنگاری کاربردی می‌باشد، الگوریتم هایی مانند رمزنگاری الجمل، آراس‌ای  و الگوریتم امضای دیجیتال. 

در سال ۲۰۰۳ میلادی بونه و برملی یک حمله زمانبندی بر اساس شبکه به یک وب سرور که از لایه سوکت‌های امن برخوردار بود را تدارک دیدند که اساس این حمله، آسیب پذیری های مختلفی است که آراس‌ای با بهینه سازی قضیه باقی مانده چینی دارد، میباشد. اندازه واقعی شبکه در آزمایش آن‌ها کوچک بود اما حمله‌ی آن‌ها تنها در چند ساعت موفق به دستیابی به کلید سری سرور شد. این اتفاق منجر شد تا در پیاده سازی لایه سوکت های امن، از تکنیک نابینایی استفاده شود. در اینجا، منظور از استفاده از نابینایی ، از بین بردن همبستگی بین کلید و زمان رمزگذاری است. 

برخی از نسخه های یونیکس، از پیاده سازی نسبتاً پر هزینه‌ای برای توابع کتابخوانه crypt برخوردار میباشند تا یک رشته رمز ۱۱ حرفی را با استفاده از یک رمز ۸ حرفی تولید کنند. در سخت افزارهای قدیمی تر، این عملیات به طور محسوسی و عمداً زمان زیادی برای اجرا نیاز داشت، به طوری که برای انجام برخی عملیات ها به دو یا سه ثانیه زمان نیاز بود. برنامه مربوط به ورود به سیستم در نسخه های اولیه یونیکس‌ها تنها زمانی از توابع crypt استفاده میکردند که نام ورودی توسط سیستم شناخته میشد. که این روند، اطلاعاتی مربوط به معتبر بودن نام ورودی را از طریق زمانبندی فاش میکرد، حتی زمانی که رمز کاربری اشتباه وارد میشد این اتفاق می‌افتاد. در این شرایط، مهاجم میتوانست با بکار گیری این اطلاعات فاش شده و اعمال حمله‌ی جستجوی فراگیر، یک لیست از نام‌هایی که معتبر بودند تولید کند و در ادامه به وسیله ترکیب کردن این اسامی با مجموعه‌ای عظیم از کلمات عبور که بیشتر از بقیه استفاده شده بودند، تلاش برای دسترسی به سیستم کند. بدون داشتن هیچگونه اطلاعاتی مبنی بر معتبر بودن یا نبودن نام کاربری، زمان مورد نیاز برای اجرای چنین حمله‌ای بسیار افزایش خواهد یافت و عملاً آن را بلا استفاده میکند. در نسخه‌های بعدی یونیکس، مشکل نشتی چنین اطلاعاتی رفع شده و این کار با اجرای توابع crypt بر روی همه‌ی نام کاربری های ورودی، با صرف نظر از معتبر بودن یا نبودن نام ورودی، انجام میشود.    

دو پروسه‌ی ایزوله و امن دیگر که بر روی یک سیستم به همراه حافظه نهان و یا حافظه مجازی اجرا میشوند میتوانند به وسیله بروز عمدی خطا در خطای صفحه و عدم دسترسی حافظه نهان در یک پروسه ارتباط برقرار کنند و سپس تغییرات حاصل را در زمان دسترسی را مورد مشاهده و بررسی قرار دهد. به همین صورت اگر یک برنامه مورد تائید باشد اما اگر caching و یا paging آن توسط منطق شاخه شاخه (منشعب ) تحت تاثیر واقع شده باشد، این امکان وجود دارد که یک اپلیکیشن دیگری بتواند مقادیر داده های را در مقایسه با شرایط شاخه تعین کند و این کار را به وسیله مشاهده و بررسی تغیرات در زمان دسترسی انجام میدهد. در نمونه‌های فراوانی، این روش اجازه بازیابی بیت های کلید رمزنگاری را میدهد. See Percival, Colin, Cache Missing for Fun and Profit, 2005. Bernstein, Daniel J., Cache-timing attacks on AES, 2005. 

در سال ۲۰۱۷ حمله های ملتداون و spectre تولید کنندگان پردازنده ( مانند Intel, AMD, ARM و IBM)را مجبور ساخت، تا پردازنده‌های خود را بازطراحی کنند. تا اوایل ۲۰۱۸ تقریباً تمام سیستم‌های کامپیوتری در دنیا توسط spectre تحت تاثیر واقع شده بودند، که این امر آن را قدرتمند ترین نمونه از حمله زمانبندی در طول تاریخ میسازد. https://spectreattack.com/#faq-systems-spectre https://www.reuters.com/article/us-cyber-intel/security-flaws-put-virtually-all-phones-computers-at-risk-idUSKBN1ES1BO https://www.ibm.com/blogs/psirt/potential-impact-processors-power-family/ 

کدهای ویژوال بیسیک زیر نمایانگر یک مقایسه کننده معمول رشته هستند و روش کار آن ها به گونه‌ایست که به محض مشاهد تفاوت در رشته ها متوقف میشوند. بعنوان مثلاً برای مقایسه دو رشته ABCDE و ABxDE، بعد از سه باز طی کردن حلقه، تابع متوقف میشود. Function InsecureCompare(StrA As String, StrB As String, length As Integer) As Boolean
 Dim result As Boolean
 For i = 1 To length
  If Mid(StrA, i, 1) <> Mid(StrB, i, 1) Then Exit For
 Next
 result = (i> length)
 InsecureCompare = result
End Function برای مقایسه، کد زیر در زمان ثابت اجرا میشود و تمام کاراکتر ها بررسی میشوند و از عملیات بیتی استفاده میشود. Function SecureCompare(StrA As String, StrB As String, length As Integer) As Boolean
 Dim result As Boolean
 For i = 1 To length
  result = result Or (Asc(Mid(StrA, i, 1)) Xor Asc(Mid(StrB, i, 1)))
 Next
 SecureCompare = Not result
End Function

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

 منابع 

 خواندن بیشتر 
 پل سی کوچر: حملات زمانبندی بر اجرای سیستمهای Diffie-Hellman ، RSA ، DSS و سایر سیستمها. CRYPTO 1996: 104–113 ( https://paulkocher.com/doc/TimingAttacks.pdf پرونده پی دی اف]) 
 دیوید بروملی و دن بونه: حملات از راه دور از راه دور عملی هستند. سمپوزیوم امنیتی USENIX ، آگوست 2003. پرونده pdf 
 Colin Percival: حافظه نهان سرگرمی و سرگرمی ، 13 مه 2005 ( پرونده pdf ) 

رده:حمله‌های کانال جانبی