Meltdown & Spectre Zafiyetlerinin Detaylı Analizi - Part II Spectre

1.    Giriş

Şekil 1 - Sırasıyla Meltdown ve Spectre zafiyetlerinin logoları.

          Meltdown ve Spectre zafiyetlerinin detaylı analizini yaptığımız yazı dizisinin ilkinde, bu iki zafiyetin de daha iyi anlaşılabilmesi için, hakim olunması gerektiğine inandığımız kavramlara değinmiş, ardından da Meltdown'u anlatmaya çalışmıştık. Ön bellek mimarisi, spekülatif yürütme veya yan kanal atakları hakkında bilgi sahibi değilseniz, öncelikle ilk blog yazısını okumanızı tavsiye ederiz.

          Bu yazıda ise Google Project Zero ve çeşitli bağımsız araştırma grupları tarafından keşfedilen bir diğer zafiyeti ele alacağız: Spectre[1][2]. Meltdown’a göre istismar edilmesi çok daha güç. Fakat sadece Intel’i değil, son 20 yılda çıkmış, muhtemelen çoğu işlemciyi etkiliyor. Javascript ile de çalışabilmesi, online bankacılık işlemi yaptığımız bilgisayardan gireceğimiz kötü niyetli bir sitenin, ilgili zafiyeti istismar ederek bütün kullandığımız bankacılık bilgilerine erişebileceği manasına geliyor. Bu da durumu çok daha ciddileştiriyor.

2.    Sözlük

Bu yazıda aşağıda belirtilen İngilizce terimler yerine Türkçe karşılıkları kullanılacaktır:
  • CacheÖn bellek
  • Cache hitÖn bellek isabeti
  • Cache missÖn bellek kaybı
  • ProcessSüreç
  • Speculative executionSpekülatif yürütme
  • Out of order executionSırasız yürütme
  • Side channel attackYan kanal atağı
  • Kernel spaceÇekirdek alanı
  • User spaceKullanıcı alanı
  • Process spaceSüreç alanı
  • InstructionKomut
  • Architectural stageMimari durum
  • Micro-architectural stageMikro mimari durum
  • Return Oriented Programming: Geri dönüş odaklı programlama 
  • Executable Space Protection: Yürütülebilir alan koruması 
  • Stack: Yığın 
  • Stack Smashing: Yığın parçalama 
  • Sandbox: Kum havuzu 
  • Conditional Branch: Şartlı dallanma 
  • Indirect Branch: Dolaylı dallanma 
  • Microcode: Mikro kod 
  • Site Isolation: Site izolasyonu

3.    Gerekli Konseptler

3.1.  Geri Dönüş Odaklı Programlama (ROP)

          Genellikle kullanıcının kontrolündeki verilerin, uzunluklarının kontrol edilmeden belleğe kaydedilmesinden kaynaklanan hataları istismar ederek, programın geri dönüş adreslerinin kontrol edilmesiyle yürütme akışının ele geçirilmesine yığın parçalama atağı denir[3]. Yürütülmesi istenilen komut kümesi yığına kaydedilir ve program akışının bu adresten devam etmesi sağlanır. Donanım ve işletim sistemi üreticileri, bu tür atakları engellemek amacıyla çeşitli güvenlik yöntemleri geliştirmişlerdir. Yürütülebilir alan koruması, kullanıcı alanında komut çalıştırmasına izin vermez ve saldırganların bahsedilen zafiyetleri istismar etmelerini önlemeyi amaçlar[4]. Geri dönüş odaklı programlama da bu çeşit güvenlik önlemlerini atlatan ileri seviye yığın parçalama yöntemidir[5]. Programın kendi komutlarından ve işletim sistemi kütüphane kodlarından, sonu geri dönüş ile veya o işlevi yerine getiren komutlarla biten komut kümecikleri bulunur ve program akışı elde edildikten sonra yapılmak istenen işlem, bu kod kümeciklerinin zincir şeklinde birleştirilmesi ile yapılmaya çalışır.

4.    Spectre

          Spectre, programın normal akışında çalışmayacak komutların spekülatif olarak çalışmasına neden olup hassas bilgilerin yan kanal atağı ile ele geçirilmesine imkan veren donanımsal bir zafiyettir. Meltdown zafiyeti gibi yazılımdan bağımsız olması nedeniyle işletim sisteminden de bağımsızdır. Meltdown zafiyetine kıyasla Spectre atağı Intel, Amd ve Arm işlemcilerinde çalışmaktadır. Javascript kodu ile de hassas verilerin ele geçirilebildiği, dolayısıyla tarayıcının kum havuzu güvenlik engelini aşabildiği gözlemlenmiştir. Yayımlanan makalelerde Spectre, 2 varyasyon şeklinde anlatılmıştır.

4.1.  Varyasyon I – Limit Kontrol Atlatma (CVE-2017-5753)

          Bu varyasyon programın şartlı dallanma kontrollerini atlatarak, normalde yürütülmemesi gereken kod bölümünü çalıştırır ve sonucunda hedeflenen veriler ele geçirilir.

Toplam 3 adımdan oluşmaktadır:
  1. İşlemcinin dallanma tahmini yanlış eğitilir,
  2. Saldırganın kontrolünde olan değişken, hedeflenen hassas veriye göre sisteme girilir,
  3. İşlemcinin mikro mimari durumu yan kanal atağı kullanılarak mimari duruma yansır. Böylece hedeflenen veri ele geçirilmiş olur.
Şekil 2 - Spectre varyasyon I'in detaylarını incelemek amacıyla örnek olarak kullandığımız kod. Spectre makalesinden [2] alınarak düzenlenmiştir.

          Şekil 2'deki C kodunun bir fonksiyona ait olduğunu ve ‘x’ değişkeninin güvensiz kaynaklardan alındığını varsayalım. ‘array1’ dizisinden ‘x’ değerine bağlı olarak veri okunmaktadır. Okunan verinin de hesaba katılmasıyla hesaplanan sonuç kullanılarak ‘array2’ dizisinden veri okunur ve ‘y’ değerine atanır. Başlangıçta ‘x’ değerinin ‘array1’ dizisinin boyutundan küçük olduğu ‘if’ sorgusu ile kontrol edilerek bir güvenlik kontrolü yapılmaktadır. ‘x’ değerinin ‘array1’ dizisinin boyutundan büyük olması durumunda süreç, normalde erişmemesi gereken verilere erişebilir.

          ‘array1_size’ değerinin ön bellekte bulunmama durumunda, gerekli değer bellekten çekilmek istenir. Bellekten verinin işlemciye ulaşması yüzlerce işlemci döngüsüne eşdeğerdir ve işlemcinin beklemede kalması bir performans sorunudur. Bu nedenle işlemci bir yolu tahmin eder ve spekülatif olarak yürütmeye yani çalışmaya devam eder. Yol tahmini yaparken işlemci daha önceleri aynı kod bölümünün devam ettiği yolu da dikkate alarak sofistike hesaplamalar yapar. ‘x’ değeri belli oranda ‘array1’ dizisinin boyutundan küçük geldiyse daha önceki yürütmelerde, ‘array1_size’ değerinin ön bellekte bulunmaması durumunda bellekten verinin gelmesini beklerken yine ‘x’ değerinin dizinin boyutundan küçük olduğunu farz eder ve ilgili kod bloğunu çalıştırmaya başlar. ‘x’ değerinin büyük olması durumunda normalde ulaşılmaması gereken değerlere ulaşılabilir. Şekil 2'deki kod için, hedef hassas veriyi elde etmek için, ‘x’ değeri aşağıdaki formüle göre ayarlanabilir:

          x = (okunmak istenilen hassas verinin adresi) – (‘array1’in başlangıç adresi)   
       
          Spectre atağını tam olarak gerçekleştirebilmek için, öncelikle işlemcinin ‘x’ değerinin ‘array1’in boyutundan düşük olduğuna inandırmak gereklidir. Ardından yukarıdaki formül kullanılarak bir ‘x’ değeri hesaplanır. Burada dikkat edilmesi gereken nokta, atağın yapıldığı sırada sistemin bulunması gereken durumdur.
  • ‘array1_size’ değişkeni ön bellekte bulunmamalı, 
  • ‘array2’ dizisi ön bellekte bulunmamalı, 
  • Hedef veri ise ön bellekte bulunmalıdır.
          Gereklilikler sağlandıktan sonra, işlemci ‘x’ değerine bağlı olmadan 'if' kod bloğunu spekülatif olarak çalıştırmaya başlayacaktır. Böylece hedef veri okunup, 256 ile çarpılarak, ‘array2’ dizisinden veri okunacaktır. ‘array1_size’ verisi bellekten geldiğinde işlemci yanlış dallanmayı tahmin ettiğini anlayıp bütün hesaplamaları yok saysa bile mikro ölçekte oluşan etkiler, saldırganın hedeflediği veriyi ele geçirmesi için yeterlidir. Bundan sonra yapması gereken tek şey, mikro mimarideki durumun yan kanal atağı kullanılarak mimari duruma taşınması, yani gizli verinin ele geçirilmesinden ibarettir. İlk durumda herhangi bir ‘array2’ dizisinin değeri ön bellekte bulunmamaktaydı. Son durumda ön bellekte bulunan ‘array2’ dizisindeki değerin adresi, gizli veri kullanılarak hesaplandığı için gizli veriyi açığa çıkartacaktır.

4.2.  Varyasyon II – Hedef Dallanma Enjeksiyonu (CVE-2017-5715)

          Programın çalışma anında adresleri hesaplanan dallanmalara dolaylı dallanma denir. Çalışırken hesaplandığı için de akışın devam edeceği adresin hazır olmasını beklerken, işlemci yine spekülatif olarak çalışmaya devam eder. Spectre’nin hedef dallanma enjeksiyonu ile normalde çalışmaması gereken ve çalıştığında da hassas veriler ile işlemcinin mikro ölçeğini değiştirecek komut kümelerinin spekülatif olarak yürütülmesi ile hassas veriler ele geçirilmeye çalışılır. Geri dönüş odaklı programlamadaki mantığı burada da görüyoruz. Sonu geri dönüş veya o işlevi yerine getiren komutlarla biten komut kümecikleri bulunur. Fakat geri dönüş odaklı programlamadan farklı olarak, Spectre programdaki bir zafiyeti istismar etmeye çalışmaz.

Bu varyasyon toplam 3 adımdan oluşmaktadır:
  1. Saldırgan, süreç adres alanından, çalışması sonucunda hedef sürecin bellek içeriğini açığa çıkaracak komut kümecikleri belirler, 
  2. İşlemcinin spekülatif olarak bu kod kümeciklerine dallanmasını sağlar, 
  3. Yan kanal atağı yöntemi kullanılarak mikro mimari durumdaki değişiklik mimari duruma taşınır, böylece gizli bilgi erişilebilir hale gelir.

5.    Spectre’ye Karşı Önlemler

          Spectre atağının varyasyonlarına ve Meltdown atağına topluca güvenlik sağlayacak bir teknoloji bulunmamaktadır ve her biri için ayrı ayrı güvenlik önlemleri alınmalı, geliştirilmedir. Dolayısıyla Meltdown saldırısına koruma sağlayan KAISER sistemi, Spectre’nin varyasyonlarını durduramamaktadır. Varyasyon I için, kaynak kodun tekrar elden geçirilmesi ve gerekli müdahalelerin yapılması gerekmektedir. Intel’in yayımladığı dokümanda spekülatif yürütmenin devre dışı bırakılması gerekilen yerlerde LFENCE komutunun kullanılması gerektiği belirtiyor[6]. Varyasyon II için ise; işlemci firmalarının yayımladığı mikro kod güncelleştirmelerinin yüklenmesi gerekmektedir[7]. İlgili zafiyetler hakkında halkın bilgilendirilmesinin ardından Intel’in varyasyon II’yi yamamak için yayımladığı mikro kod güncelleştirmesinin, yüklenilen sistemlerde beklenmedik davranışlara neden olmuştur (yeniden başlatma vs.)[8]. Intel durumun farkına vardıktan sonra sağlam mikro kod güncellemesi yayımladı. Varyasyon II’nin yazılım çözümlerinden biri ise Google tarafından geliştirilen ‘Retpoline’ sistemi[9]. Temel amacı ise; dolaylı dallanmaların spekülatif yürütmeden izolasyonu. Kendi deyimleriyle spekülatif yürütmeyi aşırı hiperaktif 7 yaşındaki bir çocuğa benzetiyorlar ve retpoline ile ona trambolinler ile çevrili bir depo yaptıklarını belirtiyorlar.

          Javascript ataklarını engelleyebilmek amacıyla tarayıcılara da çeşitli güncellemeler geldi. Mozilla 2018 yılı başında, Firefox tarayıcısı için zamansal önlemler aldı ve Firefox’un zaman kaynaklarının doğruluk oranını düşürerek, saldırganların yan kanal atağı yapabilmesinin önüne geçmeyi amaçladı[10]. Google ise, Chrome tarayıcı için site izolasyonu özelliği geliştirdi[11]. Site izolasyonunun aktif olup olmayacağı kullanıcılar tarafından belirlenebileceğini ve aktif olduğunda ilgili saldırılara karşı güvenlik önlemi sağlayacağını belirtiyor.

6.    Meltdown ve Spectre Zafiyetlerinin Etkileri

          Şüphesiz ki iki zafiyette teknoloji dünyasını geri dönüşü mümkün olmayacak biçimde değiştirdi. Teknolojinin dev isimleri olan işlemci üreticileri, işletim sistemi geliştirici firmaları, bulut sistemi sağlayıcıları 2017 yılının ortasından beri güvenlik önlemleri alabilmek için halkın bilgilendirilmesine kadar 6 ay boyunca çalıştılar. Çeşitli güncelleştirmelerle sistemleri yamadılar. Fakat sorunun esas kaynağı işlemcilerin performans optimizasyon teknolojisi olduğu için, yazılımsal önlemlerin yeterli olmayacağı aşikar. Asıl sorunun kaynaklandığı yerde çözülmesi gerekmektedir. Bu da işlemci üreticilerini, önümüzdeki dönemde çıkaracakları işlemcilerde tasarımsal değişiklikler yapmaya zorlayacaktır. İstismar edilen bölüm, işlemcinin performans optimizasyon teknolojisi olduğu için de yapılan güncelleştirmeler işlemci performans değerlerinde düşüşlere neden oldu[12].

          Keşfedilmesi 2017 yılının ortasında, halkın bilgilendirilmesi de 2018 yılı başında olsada, farklı varyasyonlarla birlikle, Meltdown ve Spectre’yi daha uzun süre duyacağız gibi görünüyor[13].

7.    Referanslar

[1].      https://googleprojectzero.blogspot.com.tr/2018/01/reading-privileged-memory-with-side.html?m=1
[2].      https://spectreattack.com/spectre.pdf
[3].      https://en.wikipedia.org/wiki/Stack_buffer_overflow
[4].      https://en.wikipedia.org/wiki/Executable_space_protection
[5].      https://www.exploit-db.com/docs/english/28479-return-oriented-programming-(rop-ftw).pdf
[6].      https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf, Intel Analysis of Speculative Execution Side Channels
[7].      https://security.googleblog.com/2018/01/more-details-about-mitigations-for-cpu_4.html
[8].      https://arstechnica.com/gadgets/2018/02/intel-releases-new-spectre-microcode-update-for-skylake-other-chips-remain-in-beta/
[9].      https://support.google.com/faqs/answer/7625886, Retpoline: a software construct for preventing branch-target-injection
[10].    https://blog.mozilla.org/security/2018/01/03/mitigations-landing-new-class-timing-attack/
[11].    https://www.chromium.org/Home/chromium-security/ssca
[12].    https://cloudblogs.microsoft.com/microsoftsecure/2018/01/09/understanding-the-performance-impact-of-spectre-and-meltdown-mitigations-on-windows-systems/, Understanding the performance impact of Spectre and Meltdown mitigations on Windows Systems
[13].    https://arxiv.org/pdf/1802.03802.pdf, MeltdownPrime and SpectrePrime: Automatically-Synthesized Attacks Exploiting Invalidation-Based Coherence Protocols



Mert Değirmenci
Cyber Security Expert
CRYPTTECH - Cyber Security Intelligence

Yorumlar

Bu blogdaki popüler yayınlar

1. Geleneksel Stajyer CTF Soru ve Cevapları

B*-Tree (BTree, BPlusTree) Veri Yapısı ile Veri İndeksleme

2. Geleneksel Stajyer CTF Soru ve Cevapları - 2017