Retpolin nedir ve nasıl çalışır?


244

Kernel veya çapraz işlem bellek açıklamaya (olasılığını azaltmak amacıyla Spectre saldırı), Linux çekirdek 1 yeni seçenekle derlenmiş olacak , -mindirect-branch=thunk-externtanıtıldı gccsözde aracılığıyla dolaylı görüşmeleri gerçekleştirmek için retpoline .

Google araması yalnızca çok yeni bir kullanıma (genellikle 2018'de) dönüştüğünden, bu yeni icat edilmiş bir terim gibi görünüyor.

Retpoline nedir ve son çekirdek bilgisi ifşa saldırılarını nasıl önler?


1 Ancak Linux'a özgü değildir - benzer veya özdeş yapı , diğer işletim sistemlerindeki azaltma stratejilerinin bir parçası olarak kullanılmaktadır .


6
Google'dan ilginç bir destek makalesi .
sgbj

2
oh, bu yüzden telaffuz / ˌtræmpəˈlin / (Amerikan) veya / ˈtræmpəˌliːn / (İngiliz)
Walter Tross

2
Bunun Linux çekirdeği olduğunu söyleyebilirsiniz , ancak gccbu şekilde işaret ediyor! Linux Çekirdek Posta Listesi sitesinde olduğu gibi lkml.org/lkml/2018/1/3/780'i tanımadım , oraya baktığımda bile (ve çevrimdışı olduğu için anlık görüntü sunuldu ).
PJTraill

@PJTraill - Linux çekirdek etiketi eklendi
RichVel

@PJTraill - iyi bir nokta, soru metnini güncelledim. Linux çekirdeğinde nispeten açık geliştirme süreci nedeniyle ilk gördüğümü, ancak şüphesiz aynı veya benzer teknikler açık ve kapalı kaynak OS'ların spektrumunda hafifletmeler olarak kullanılıyor. Bu yüzden bunu Linux'a özgü görmüyorum, ancak bağlantı kesinlikle.
BeeOnRope

Yanıtlar:


158

Google'ın Paul Turner tarafından yazılan yorumlarda sgbj tarafından bahsedilen makale , aşağıdakileri çok daha ayrıntılı olarak açıklıyor, ancak bir şans vereceğim:

Bunu şu anda sınırlı bilgilerden bir araya getirebildiğim kadarıyla, bir retpoline, CPU'nun dolaylı bir atlama hedefi üzerinde spekülasyon yapmasını önlemek için asla yürütülmeyen sonsuz bir döngü kullanan bir dönüş trambolindir .

Temel yaklaşım Andi Klein'ın bu konuyu ele alan çekirdek dalında görülebilir :

__x86.indirect_thunkHafıza adresi (arayacağım ADDR) yığının üstünde saklanan çağrı hedefini yükleyen ve bir RETtalimat kullanarak atlamayı yürüten yeni çağrıyı tanıtır . Daha sonra thunk'ın kendisi, birçok (hepsi değilse de) dolaylı çağrı ve atlamaların yerini almak için kullanılan NOSPEC_JMP / CALL makrosu kullanılarak çağrılır . Makro, çağrı hedefini yığına yerleştirir ve gerekirse dönüş adresini doğru şekilde ayarlar (doğrusal olmayan kontrol akışına dikkat edin):

.macro NOSPEC_CALL target
    jmp     1221f            /* jumps to the end of the macro */
1222:
    push    \target          /* pushes ADDR to the stack */
    jmp __x86.indirect_thunk /* executes the indirect jump */
1221:
    call    1222b            /* pushes the return address to the stack */
.endm

callSonuna yerleştirilmesi , dolaylı çağrı bittiğinde, kontrol akışının NOSPEC_CALLmakronun kullanımının arkasında devam etmesi için gereklidir, böylece düzenli bir şekilde kullanılabilircall

Thunk'ın kendisi şöyle görünüyor:

    call retpoline_call_target
2:
    lfence /* stop speculation */
    jmp 2b
retpoline_call_target:
    lea 8(%rsp), %rsp 
    ret

Kontrol akışı burada biraz kafa karıştırıcı olabilir, bu yüzden açıklığa kavuşturalım:

  • call geçerli talimat işaretçisini (etiket 2) yığına iter.
  • leayığın işaretçisine 8 ekler , son dönüş adresi (etiket 2'ye) en son itilen dört kelimeyi etkili bir şekilde atar. Bundan sonra, yığının üst kısmı gerçek ADDR adresini tekrar gösterir.
  • ret*ADDRyığın işaretçisini arama yığınının başına atlar ve sıfırlar.

Sonuçta, tüm bu davranış pratik olarak doğrudan zıplamaya eşdeğerdir *ADDR. Elde ettiğimiz bir fayda, calltalimatı yürütürken iade ifadeleri (Dönüş Yığını Tamponu, RSB) için kullanılan dal tahmin edicisinin karşılık gelen retifadenin etikete 2 atlayacağını varsaymasıdır .

Etiket 2'den sonraki kısım aslında asla yürütülmez, teorik olarak talimat boru hattını talimatlarla dolduracak sonsuz bir döngüdür JMP. Kullanarak LFENCE, PAUSEya da daha genel bir talimat talimat boru hattı durak olmasını neden bu spekülatif yürütme herhangi bir güç ve zaman israf gelen CPU durur. Bunun nedeni, retpoline_call_target çağrısının normal şekilde dönmesi LFENCEdurumunda, yürütülecek bir sonraki yönerge olmasıdır. Şube öngörücüsünün orijinal dönüş adresine (etiket 2) dayalı olarak tahmin edeceği de budur.

Intel'in mimari kılavuzundan alıntı yapmak için:

Bir LFENCE'ı izleyen talimatlar, LFENCE'tan önce bellekten getirilebilir, ancak LFENCE tamamlanana kadar yürütülmezler.

Ancak belirtim asla LFENCE ve PAUSE boru hattının durmasına neden olduğundan bahsetmez, bu yüzden buradaki satırlar arasında biraz okuyorum.

Şimdi orijinal sorunuza geri dönün: İki fikrin birleşimi nedeniyle çekirdek bellek bilgilerinin açıklanması mümkündür:

  • Her ne kadar spekülatif yürütme spekülasyon yanlışken yan etkisiz olsa da spekülatif yürütme hala önbellek hiyerarşisini etkiler . Bu, bir bellek yükü spekülatif olarak yürütüldüğünde, yine de bir önbellek hattının çıkmasına neden olmuş olabileceği anlamına gelir. Önbellek hiyerarşisindeki bu değişiklik, aynı önbellek kümesine eşlenen belleğe erişim süresini dikkatlice ölçerek belirlenebilir.
    Okunan belleğin kaynak adresinin kendisi çekirdek belleğinden okunduğunda, bazı rastgele bellek parçalarını bile sızdırabilirsiniz.

  • Intel CPU'ların dolaylı dal tahmincisi, kaynak komutunun yalnızca en alt 12 bitini kullanır, bu nedenle tüm 2 ^ 12 olası tahmin geçmişini kullanıcı tarafından kontrol edilen bellek adresleriyle zehirlemek kolaydır. Bunlar daha sonra, çekirdek içinde dolaylı sıçrama tahmin edildiğinde, spekülatif olarak çekirdek ayrıcalıklarıyla yürütülebilir. Önbellek zamanlaması yan kanalını kullanarak, rasgele çekirdek belleğini sızdırabilirsiniz.

GÜNCELLEME: Çekirdek posta listesinde , Retpolin'lerin Dönüş Yığını Tamponu (RSB) boş olduğunda, daha yeni Intel mimarileri (Skylake +) geri düştüğü gibi, şube tahmin sorunlarını tamamen azaltmadığına inanmamı sağlayan sürekli bir tartışma var. savunmasız Şube Hedef Tamponuna (BTB):

Bir azaltma stratejisi olarak retpoline, bir saldırgan tarafından zehirlenebileceğinden BTB'den gelen tahminleri kullanmaktan kaçınmak için dolaylı şubeleri geri dönüşler için değiştirir. Skylake + ile ilgili sorun, bir RSB alt akışının, saldırganın spekülasyonun kontrolünü ele geçirmesine izin veren bir BTB tahmini kullanmaya geri dönmesidir.


LFENCE talimatının önemli olduğunu düşünmüyorum, Google'ın uygulaması bunun yerine bir PAUSE talimatı kullanıyor. support.google.com/faqs/answer/7625886 Alıntıladığınız belgelerin "yürütülmeyecek" değil "spekülatif olarak yürütülmeyeceğini" söylediğini unutmayın.
Ross Ridge

1
Bu Google SSS sayfasından: "Yukarıdaki spekülatif döngülerimizdeki duraklatma talimatları, doğruluk için gerekli değildir. Ancak, üretken olmayan spekülatif yürütmenin işlemcide daha az işlevsel birime sahip olduğu anlamına gelir." Yani LFENCE'ın burada kilit nokta olduğu sonucunu desteklemiyor.
Ross Ridge

@RossRidge Kısmen katılıyorum, bana bu, CPU'nun PAUSE / LFENCE'ı izleyen kodu spekülatif olarak yürütmemesini ima eden sonsuz bir döngünün iki olası uygulaması gibi görünüyor. Bununla birlikte, LFENCE spekülatif olarak yürütülürse ve spekülasyon doğru olduğu için geri alınmazsa , bu sadece bellek yükleri bittikten sonra yürütüleceği iddiasıyla çelişir. (Aksi takdirde, spekülatif olarak yürütülen talimatların tamamı geri alınmalı ve spesifikasyonları yerine getirmek için tekrar uygulanmalıdır)
Tobias Ribizel

1
Bu avantajı, push/ ' reto değil dönüş adres belirleyici yığın dengesizliği. Bir yanlış tahmin var ( lfencegerçek dönüş adresi kullanılmadan önce olana kadar ), ancak bunu dengeleyen bir call+ modifikasyonu kullanarak . rspret
Peter Cordes

1
ayy, avantaj üzerinde push / ret(benim son yorumunda). re: senin düzenleme: RSB underflow imkansız olmalıdır çünkü retpoline bir içerir call. Eğer çekirdek ön değerlendirmesi orada bir bağlam değişikliği yapmış olsaydı, RSB ile callzamanlayıcı içine hazırlanmış bir şekilde çalıştırmaya devam edecektik . Ancak bir kesme işleyicisi retRSB'yi boşaltmak için yeterli s ile bitebilir.
Peter Cordes

46

Bir retpolin , dal hedef enjeksiyonundan ( CVE-2017-5715 ) istismardan korunmak için tasarlanmıştır . Bu, çekirdekte dolaylı bir dal talimatının keyfi bir kod yığınının spekülatif yürütülmesini zorlamak için kullanıldığı bir saldırıdır. Seçilen kod saldırgan için bir şekilde yararlı bir "gadget" dır. Örneğin, çekirdek verilerini önbelleği nasıl etkileyeceği konusunda sızdıracak şekilde kod seçilebilir. Retpoline, tüm dolaylı şube talimatlarını bir iade talimatı ile değiştirerek bu istismarı önler.

Bence retpoline ile ilgili anahtar sadece "ret" kısmı, dolaylı dalı bir iade talimatı ile değiştirir, böylece CPU sömürülebilir dal tahmincisi yerine dönüş yığını öngörücüsünü kullanır. Bunun yerine basit bir itme ve bir dönüş talimatı kullanılmışsa, spekülatif olarak çalıştırılacak olan kod, işlevin saldırgan için yararlı olan bazı gadget'lar değil, sonuçta yine de döneceği kod olacaktır. Trambolin parçasının ana yararı, geri dönüş yığınını korumak gibi görünmektedir, bu nedenle işlev aslında arayana geri döndüğünde, bu doğru tahmin edilir.

Şube hedef enjeksiyonunun arkasındaki temel fikir basittir. CPU'nun, şube hedef tamponlarındaki dalların kaynağının ve hedefinin tam adresini kaydetmemesi avantajından yararlanır. Böylece saldırgan, çekirdek adres alanında belirli bir dolaylı atlama yürütüldüğünde tahmin isabetlerine yol açacak şekilde kendi adres alanındaki atlamaları kullanarak arabelleği doldurabilir.

Retpoline'nin çekirdek bilgilerinin doğrudan açığa çıkmasını engellemediğini, yalnızca dolaylı şube talimatlarının bilgileri ifşa edecek bir aracı spekülatif olarak yürütmesini önlediğini unutmayın. Saldırgan, gadget'ı spekülatif olarak yürütmek için başka yollar bulabilirse, retpoline saldırıyı engellemez.

Kağıt Spectre Saldırılar: Spekülatif Yürütme Kötüye Paul Kocher, Daniel GENKIN Daniel Gruss Werner Haas, Mike Hamburg, Moritz Lipp Stefan Mangard Thomas Prescher Michael Schwarz ve Yuval Yarom tarafından nasıl dolaylı şube aşağıdaki genel bilgi vermek istismar edilebilir :

Dolaylı Şubelerden Yararlanma. Dönüş yönelimli programlamadan (ROP) yararlanarak, bu yöntemde saldırgan bir gadget seçerve kurbanı spekülatif olarak yürütmek için kurbanı etkiler. ROP'den farklı olarak, saldırgan kurban kodundaki bir güvenlik açığına güvenmez. Bunun yerine, saldırgan bir şubeyi dolaylı bir şube talimatından gadget'ın adresine doğru yanlış tahmin etmek için Şube Hedef Tamponunu (BTB) eğitir ve bu da gadget'ın spekülatif yürütülmesine neden olur. Spekülatif olarak yürütülen talimatlar terk edilirken, önbellek üzerindeki etkileri geri alınmaz. Bu efektler, gadget tarafından hassas bilgileri sızdırmak için kullanılabilir. Dikkatlice bir gadget seçimi ile bu yöntemin kurbandan keyfi belleği okumak için nasıl kullanılabileceğini gösteriyoruz.

BTB'yi yok etmek için saldırgan, gadget'ın sanal adresini kurbanın adres alanında bulur ve ardından bu adrese dolaylı dallar gerçekleştirir. Bu eğitim, saldırganın adres alanından yapılır ve saldırganın adres alanındaki gadget adresinde ne olduğu önemli değildir; gerekli olan tek şey, eğitim dallarının aynı hedef sanal adresi kullanması için kullanılan dalın olmasıdır. (Aslında, saldırgan istisnaları ele aldığı sürece, saldırganın adres alanındaki gadget'ın sanal adresinde eşlenmiş bir kod olmasa bile saldırı çalışabilir.) Kaynak adresle tam olarak eşleşmeye de gerek yoktur. eğitim için kullanılan şubenin ve hedeflenen şubenin adresi. Böylece, saldırgan eğitimin kurulumunda önemli bir esnekliğe sahiptir.

Google'daki Project Zero ekibi tarafından bir yan kanalla ayrıcalıklı belleğin okunması başlıklı bir blog girişi , şube hedef enjeksiyonunun çalışan bir istismar oluşturmak için nasıl kullanılabileceğine başka bir örnek sağlar.


9

Bu soru bir süre önce soruldu ve daha yeni bir cevabı hak ediyor.

Yönetici Özeti :

“Retpoline” dizileri dolaylı dalların spekülatif uygulamadan izole edilmesini sağlayan bir yazılım yapısıdır. Bu, hassas ikili dosyaları (işletim sistemi veya hipervizör uygulamaları gibi) dal hedef enjeksiyon saldırılarından dolaylı dallarına karşı korumak için uygulanabilir.

" Ret poline " kelimesi "geri dönüş" ve "trambolin" kelimelerinin bir portmantıdır , tıpkı " rel poline " ifadesinin "göreli çağrı" ve "trambolin" den elde edildiği gibi. Ayrıca, herhangi bir ilgili spekülatif uygulamanın sonsuz bir şekilde “zıplamasını” zorunlu kılan geri dönüş işlemleri kullanılarak inşa edilen bir trambolin yapısıdır.

Çekirdek veya çapraz işlem belleği açıklamasına (Spectre saldırısı) karşı hafifletmek için Linux çekirdeği [1] yeni bir seçenekle derlenecek,-mindirect-branch=thunk-extern retpoline denilen dolaylı çağrıları gerçekleştirmek için gcc'ye sunulan derlenecektir.

Bununla birlikte, Linux'a özgü değildir - benzer veya özdeş yapı, diğer işletim sistemlerindeki azaltma stratejilerinin bir parçası olarak kullanılmaktadır.

Bu derleyici seçeneğinin kullanımı yalnızca CVE-2017-5715 için gerekli mikro kod güncellemesine sahip etkilenen işlemcilerde Spectre V2'ye karşı koruma sağlar. Öyle olacak ' çalışma herhangi bir kod (sadece bir çekirdek) üzerine' ama "sırları" içeren tek kod değerinde hücum olduğunu.

Google araması yalnızca çok yeni bir kullanıma (genellikle 2018'de) dönüştüğünden, bu yeni icat edilmiş bir terim gibi görünüyor.

LLVM derleyici bir etti -mretpolineberi anahtarı Jan 4 2018 tarihinden önce . Bu tarih, güvenlik açığının ilk kez genel olarak bildirildiği zamandır . GCC , yamalarını kullanılabilir hale getirdi 7 Ocak 2018'de .

CVE tarihi, güvenlik açığının 2017 yılında ' keşfedildiğini ', ancak son yirmi yılda üretilen bazı işlemcileri etkilediğini gösteriyor (bu nedenle uzun zaman önce keşfedildi).

Retpoline nedir ve son çekirdek bilgisi ifşa saldırılarını nasıl önler?

İlk olarak, birkaç tanım:

  • Trambolin - Bazen dolaylı atlama vektörleri olarak adlandırılan trambolin, servis rutinlerini, G / Ç rutinlerini, vb. İşaret eden adresleri tutan hafıza konumlarıdır. GCC, yuvalanmış bir işlevin adresi alındığında çalışma zamanında yürütülebilir bir trambolin oluşturarak geleneksel olarak yuvalanmış işlevleri desteklemiştir. Bu, normalde yığının üzerinde, içeren işlevin yığın çerçevesinde bulunan küçük bir kod parçasıdır. Trambolin statik zincir kaydını yükler ve daha sonra iç içe fonksiyonun gerçek adresine atlar.

  • Thunk - Thunk , başka bir alt rutine ek bir hesaplama enjekte etmek için kullanılan bir alt rutindir. Thunks öncelikle bir hesaplamaya, sonuç gerekene kadar ertelemek veya diğer alt rutinin başına veya sonuna işlemler eklemek için kullanılır

  • Memoization - Memoized işlevi, bazı belirli girdi kümelerine karşılık gelen sonuçları "hatırlar". Hatırlanan girişleri takip eden çağrılar, hatırlanan sonucu yeniden hesaplamak yerine geri döndürür, böylece bu parametrelerle fonksiyona yapılan ilk çağrı dışındaki tüm parametrelerden belirli bir çağrının birincil maliyetini ortadan kaldırır.

Çok kabaca, bir retpoline bir olan trambolin bir ile dönüş bir şekilde thunk 'için yağma ' memoization dolaylı şube önbelirleyicisi içinde.

Kaynak : Retpoline, Intel için bir PAUSE talimatı içerir, ancak AMD için bir LFENCE talimatı gereklidir, çünkü bu işlemcide PAUSE talimatı bir serileştirme talimatı değildir, bu nedenle pause / jmp döngüsü, dönüş beklerken spekülasyon olarak fazla güç kullanacaktır. doğru hedefi yanlış tahmin etmek.

Arstechnica'nın sorunun basit bir açıklaması var:

"Her işlemcinin bir mimari davranışı (talimatların nasıl çalıştığını ve programcıların programlarını yazmaya bağlı olduğunu açıklayan belgelenmiş davranış) ve bir mikro mimari davranışı (mimarinin gerçek bir uygulamasının davranış şekli) vardır. Örneğin, mimari olarak, bellekteki belirli bir adresten bir değer yükleyen bir program, yükü gerçekleştirmeye çalışmadan önce adres bilinene kadar bekler, ancak, mimari olarak, işlemci başlayabilmesi için adreste spekülatif olarak tahmin etmeye çalışabilir. hangi adresin kullanılması gerektiğinden kesinlikle emin olmadan önce değeri bellekten (yavaş olan) yüklemek.

İşlemci yanlış tahmin ederse, tahmin edilen değeri göz ardı eder ve yükü bu kez doğru adresle tekrar yapar. Böylece mimari olarak tanımlanan davranış korunur. Ancak bu hatalı tahmin, işlemcinin diğer bölümlerini, özellikle de önbelleğin içeriğini rahatsız edecektir. Bu mikro mimari bozukluklar, önbellekte olması gereken (veya olmaması gereken) verilere erişmenin ne kadar sürdüğünü belirleyerek ve kötü niyetli bir programın bellekte depolanan değerler hakkında çıkarımlarda bulunmasına izin verilerek tespit edilebilir ve ölçülebilir. "

Intel'in makalesinden: " Retpoline: Bir Şube Hedef Enjeksiyon Azaltma " ( .PDF ):

"Bir retpoline sekansı, işlemcinin spekülatif yürütülmesinin, bir istismar tarafından kontrol edilen bir adrese (dal hedef enjeksiyonu beş elementinin tatmin edici elemanı 4'ü tatmin eden bir adrese) spekülasyon yapmak için" dolaylı dal öngörücüsünü "(program akışını tahmin etmenin bir yolu) kullanmasını engeller. ) yukarıda listelenen kompozisyonlardan yararlanma). "

Not 4, şudur: "İstismar, bir dolaylı dalı spekülatif olarak yanlış tahmin etmek ve yürütmek için bu dolaylı dalı başarıyla etkilemelidir. İstismar tarafından seçilen bu gadget, genellikle önbellekleme yoluyla bir yan kanaldan gizli verileri sızdırıyor."

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.