Side-Channel Attacks ve VHDL ile Pratik Savunmalar (1 Viewer)

Side Channel Atacks: Constant-Time Mini Crypto Core Bilgisayar mimarisi tarihinde uzun süre boyunca işlemciler, matematiksel birer kara kutu olarak görülüyordu. Bir komut...

Side Channel Atacks: Constant-Time Mini Crypto Core

Bilgisayar mimarisi tarihinde uzun süre boyunca işlemciler, matematiksel birer kara kutu olarak görülüyordu. Bir komut verirseniz, işlemci onu işler ve sonucu verirdi. Ancak siber güvenlik dünyasında acı bir gerçek keşfedildi; işlemciler işlem yaparken ses çıkartır, ve bu sesler her komut için farklı ancak her zaman aynı sesler ve zamanlardı. Bir nevi hangi komutun hangi işlemi ne kadar sürede yaptığı sabit bir şey idi. İşte bu fiziksel tepkiler, yani işlemcinin bir işlemi yaparken ne kadar elektrik harcadığı veya ne kadar zamanda bu işlemi gerçekleştirdiği , içeride dönen gizli şifreleri dışarıya sızdıran birer Yan-Kanal(Side Channel) haline gelir. Bir hırsınız, kasanın şifresini kırmak yerine kilit dönerken çıkan metal sesini dinlemesi gibi; bir saldırgan da işlemcinin yaydığı elektromanyetik dalgalar vasıtası ile senin gizli verilerini okuyabilir.

Constant-Time Execution

Makalenin odak noktası olan yere gelmiş bulunmaktayız. Aslına bakarsak Yan Kanal saldırılarının en tehlikeli olan ama bir o kadar da en basit olan türü “Timing-Atack” yani zamanlama saldırılarıdır. Yukarıda da biraz bahsettiğim gibi; eğer bir toplama işlemi 1 nanosaniye, veya bir üs alma işlemi 10 nanosaniye sürüyorsa(sayıları rastgele seçtim) saldırgan kronometreyi tuttuğu an senin ne yaptığını anlar. Bu yüzden modern işlemcilerin ilk kuralı şudur: Her ne yapıyorsan yap, aynı sürede bitir. Bir örnekle gösterelim:

add_res <= A + B;

sub_res <= A-B;

xor_res <= A xor B;

process(clk)

if rising_edge(clk) then;

case ALU_sel is

when “000” => Result <= add_res;

when “001” => Result <= sub_res;

end case;

end if;

end process;



Örneğin bu güvenli bir koddur. Yazılım dünyasındaki if-else yapılarında, program sadece doğru olanı çalıştırır. Donanımda ise biz güvenlik için hepsini aynı anda çalıştırıyoruz. Toplama da yapılsa, çıkarma da yapılsa veya başka herhangi bir işlem yapılsa da her işlem eşit sürede yapıldığı için saldırganın kronometresi burada çaresiz kalır çünkü bütün işlemler eşit sürede yapılmıştır. Buna karşın tüm devreler de bunun sonucunda aynı miktarda güç tüketeceği için işlemcinin güç profilinde hangi işlemin seçildiğine dair bir pik oluşmaz. Her zaman aynı miktarda gürültü üretilir ve bunun sonucunda da Timing veya güç tüketimi saldırıları önlenmiş olur. Ne kadar verim azalsa da, güvenlik için bu bir zorunluluk diyebiliriz.

Şimdi aslında bir düşünecek olursak zamanlama saldırılarına karşı güvenliğin neredeyse tamamen sağlandığını düşünürüz değilmi bu savunmadan sonra? Ama burada karşımıza şöyle sorunlar çıkıyor. Evet teorik olarak tüm devreleri eşzamanlı olarak çalıştırıyor olabiliriz ama gerçek fiziksel dünyada bir toplama devresindeki transitörlerin geçiş hızı ve çektiği akım, bir NOT kapısı veya bir XOR kapısı için aynı değildir. Yani biz aslında tüm devreleri eşzamanlı olarak çalıştırsak bile, eğer saldırganın elinde hassas bir osiloskop varsa milimetrik zaman farkları ve güç tüketimi farkları ile bu mikro farkları “DPA-Diferansiyel Güç Analizi” ile açıklayabilir.

Ayrıyeten şu da var; herkesin bildiği üzere donanım çalıştıkça ısınır. Toplama devresi, XOR devresine göre 0.0001 derece daha fazla ısı yayıyorsa bile, uzun vadede bu ısı farkı işlemcinin davranışını veya hızını etkileyebilir. Yani en kısa hali ile ısı da bir sızıntıdır.

Bu bölümü bitirmeden önce son olarak şu notu bırakmak istiyorum; Constant-Time tasarımı, saldırganın işini 1 birim zorluktan 1 milyon birim zorluğa çıkartır. Ama zaten siber güvenlikte amaç kapıyı kırılamaz yapmak değil, açılması için gereken maliyeti ve zamanı saldırganın ömür boyu karşılayamayacağı kadar arttırmaktır. Fazla uzatmadan diğer bölüme geçelim



Power Consumption Obfuscation



Bir benzetme ile söyleyecek olursak şöyle düşünün; eğer bir casus duvar arkasından senin kalp atışını dinleyerek heyecanlanıp heyecanlanmadığını, veya korkup korkmadığını anlamaya çalışıyorsa, yapacağın en mantıklı şey odada bir gürültü, bir ses oluşturmaktır. Donanım dünyasında biz buna Gürültü Enjeksiyonu diyoruz. Bunu yapmak için ise iki yol vardır.

Dummy Operations(Yalancı İşlemler): Sadece asıl işlemi yapmak işe yaramaz. Asıl işlemci A + B yaparken yan tarafa ise ayrıyeten bir tane daha ekstra gizli işlemci koyarız. Bu ekstra birim, tamamen rastgele sayılarla anlamsız çarpma, bölme gibi işlemler yapar. Buradaki amaç ise saldırganın osiloskop ile gördüğü güç grafiğini tamamen anlamsız kılıp karman çorman etmektir.

Dual-Rail Pre-Charge Logic(Simetrik Yükleme): Bunu olayı da şudur ki, normalde bir hat ‘0’ dan ‘1’ e geçerken elektrik harcarken tam tersi durumda ise elektrik harcamaz veya daha farklı bir şekilde harcar. Çözüm olarak ta her sinyal hattının yanına bir tersini koyarız. Eğer asıl hat 0 oluyorsa, tersi olan hat 1 olur. Toplamda ise her zaman bir hat 1 olmuş olacağı için, çekilen akım her zaman sabit kalır. İşlemci adeta dümdüz bir kalem gibi elektrik çeker.

Mesela asıl kodumuz çalışırken(ALU, CU, fark etmez) arkada çöp üreten bir örnek modül gösteriyim size vhdl ile

Process(clk)

Begin

İf rising_edge(clk) then

Dummy_signal <= random_val_1 xor random_val_2;

Dummy_reg <= Dummy_signal + 1;

end if;

end process;



Ama bir de dürüst olmamız lazım burada; bu yöntem işlemcinin çok daha fazla ısınmasına ve daha çok elektrik çekmesine neden olur. Çünkü burada sadece işi yapmak için değil, iz bırakmamak için de elektrik harcıyoruz, ama konu güvenlik ise güvenlik, verimlilikten önde gelir.



Cache Timing Noise Engine(Önbellek Zamanlama Gürültüsü)



Önce ilk başta problemi tanıyalım; bir hırsız, önbelleğe bir veri bırakır ve sonra senin o veriye dokunup dokunmadığını kontrol eder. Eğer veri hala oradaysa ve hızlı geliyorsa burada işlemcinin hangi adresi kullandığı belli olur. Buna Flush+Reload veya Prime+Probe saldırıları denir. Bu zaman farkını yok etmek için ise kullanmamız gereken iki farklı savunma yolu bulunur.

Jitter İnjection: Önbellekten bir veri çekileceği zaman, donanım araya rastgele bir gecikme sokar. Mesela örneğin veri normalde 2 nanosaniye içerisinde geliyor ise gürültü motoru ile bazen 1, bazen 3 ve bazen de 5 gibi farklı değerler gelir. Sonuç olarak ta saldırgan kronometreyi tutsa bile elde doğru düzgün ve tutarlı veriler olmamış olacağı için analiz yapamaz. Ve burada biz saldırganı bilinçli şekilde kandırıyoruz.



Prefetching Deception: Bu savunma yolunda ise biz gerçek bir veriyi önbelleğe çağırdığımız zaman motor aynı zamanda arka planda 3-4 farklı anlamsız çöp veriyi de kendi içine çeker. Buradaki amaç ise saldırgan kronometresini tutsa bile verilerden hangisi gerçek veri ve hangisinin tuzak olduğunu bilemeyeceği için saldırganın bundan vazgeçmesini sağlamaktır. Bunun için ise örnek olarak göstermek gerekirse vhdl ile şöyle bir geciktirme katmanı eklememiz lazım gelir.



Process(clk)

begin

if rising_edge(clk) then

if cache_request = ‘1’ then

wait_counter <= random_noise_val;

if wait_counter = ‘0’ then

data_out <= real_cache_data;

ready <= ‘1’;

end if;

end if;

end if;

end process;



Önbelleğin bütün bu esprisi hızlı olmasıdır. Biz araya gürültü ve gecikme sokarak aslında bilgisayarı bir miktar yavaşlatıyoruz. Ama bir kripto anahtarının çalınması, bilgisayarın az da olsa yavaşlamasından çok daha büyük bir sorundur.



Self-Randomizing Cache



Önceki bölümlerde zamanı ve gücü maskeledik. Ama hala bir sorunumuz var: Adresleme. Klasik bir sistemde, veri her zaman RAM’deki X adresinden Cache’deki Y indeksine gider. Saldırgan da bunu bildiği için verinin hangi adrese dokunduğunu tahmin edebilir. Bizim de buna karşın iki farklı savunmamız var

Dinamik Adres Karıştırma: Bu donanım katmanı, RAM’den gelen veriyi önbelleğe yerleştirirken araya bir karıştırma fonksiyonu sokar. Yani şöyle ki klasik bir sistem RAM’deki mesela sallıyorum 100 adresinden aldığı veriyi önbellekteki 10. satıra taşır. Ancak Randomizing sistemde ise bu önbellek satırı sürekli olarak değişir ve rastgele sayılar atanır. Sonuç olarak yani saldırgan önbellekteki 10.satırı izlese bile, orada ne olduğunu asla bilmez çünkü her periyotta ve her resetlemede bu satır değişecektir.



Önbellek Kimlik Değişimi: Sistem, her farklı uygulama ve her farklı işlem için önbelleği sanal parçalara böler ve bu parçaların sınırlarını sürekli değiştirir. Yani sonuç olarak bir uygulamanın verisi diğerinin yan kanalına taşamaz.

Ve eğer bu mantığı vhdl kodlarına dökersek işte şöyle:

Normalde

İndex <= address(7 downto 0);

Ve bunun savunmalı hali ise şöyle

İndex <= address(7 downto 0) xor random_key;

Ve random key her clock’ta veya her işlemde değişeceği için saldırganın elindeki veri çöpe gitmiş olur.



Hafıza Güvenliği



Makalemizin finalinde, modern işlemcilerin en büyük kabusu olan tahmin hatalarına ve RAM güvenliğine odaklanıyoruz.

Tahmin Güvenliği: Modern işlemciler hızlanmak için bir benzetme ile söyleyecek olursak geleceği tahmin eder. Ama spectre saldırısı bize gösterdi ki işlemci yanlış bir tahmin yaptığında bile arkasında bir iz yani yan kanal bırakıyor. Bunun çözümü ise Hassas veri içeren işlemlerde işlemcinin "kafasına göre" tahmin yürütmesini engelleyen bariyerler (Fence) eklemek. Yani bir nevi işlemci tahmin yapacağı zaman onu durdurup gerçek veriyi beklemesi gerektiğini söylüyoruz.



Secure-RAM Access Monitor

RAM'e giden yolları izleyen bir özel güvenlik hayal edin. Eğer bir saldırgan yan kanal verisi toplamak için RAM'in belli bölgelerine çok hızlı ve şüpheli erişimler yapıyorsa (mesela Rowhammer saldırısı gibi), bu monitör durumu fark eder ve o işlemi anında bloklar.

Side-channel saldırıları bize şunu öğrettir: Bir sistemi sadece kodla koruyamazsın; onu atom seviyesinde, transistör seviyesinde savunman gerekir. Bu makalede incelediğimiz yöntemler (Constant-Time, Power Obfuscation, Randomizing Cache), bir donanım tasarımcısının sadece bir "mühendis" değil, aynı zamanda bir "dijital kale mimarı" olduğunu kanıtlar. Kırılamaz sistem yoktur, ama saldırganı pes ettirecek kadar karmaşık ve güvenli sistemler vardır.
 
💬 SpyHackerz Telegram — Anlık tartışmalar ve duyurular için katıl
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.

Users who are viewing this thread

133,291Konular
3,280,402Mesajlar
320,055Kullanıcılar
e7hackSon Üye
Üst Alt