it-swarm.dev

Bir retpoline nedir ve nasıl çalışır?

Çekirdek veya çapraz işlem belleği bildirimini azaltmak için ( Spectre saldırısı), Linux çekirdeği1 yeni bir seçenekle derlenecek , -mindirect-branch=thunk-externgcc 'a tanıtıldı, dolaylı çağrılar retpoline ile gerçekleştirildi.

Bu, Google aramalarının yalnızca çok yeni kullanımlara (genellikle 2018’de) döndüğü için yeni icat edilmiş bir terim gibi görünüyor.

Bir retpolin nedir ve son çekirdek bilgi ifşa saldırılarını nasıl önler?


1 Ancak Linux'a özgü değildir, ancak benzer veya aynı yapı, diğer işletim sistemlerinde azaltma stratejileri öğesinin bir parçası olarak kullanılmış görünmektedir.

221
BeeOnRope

Google’ın Paul Turner tarafından yazılan yorumlarda sgbj tarafından belirtilen makalesi, aşağıdakileri çok daha ayrıntılı olarak açıklıyor;

Bunu şu anda sınırlı bilgiden bir araya getirebildiğim kadarıyla, bir retpolin a return trambolin , CPU'nun dolaylı bir atlama hedefinde spekülasyon yapmasını engellemek için asla çalıştırılmayan sonsuz bir döngü kullanıyor. .

Temel yaklaşım Andi Kleen'in çekirdek dalında görülebilir:

Hafıza adresinin (ADDRarayacağım) yığının üstünde depolanan çağrı hedefini yükleyen ve RETkomutunu kullanarak atlamayı yürüten yeni __x86.indirect_thunk çağrısını tanıtır. Thunk'un kendisi, NOSPEC_JMP/CALL makrosunu kullanarak çağrılır; bu, birçok (tümü değilse) dolaylı aramaların ve atlayışların yerine kullanı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

callname__'nin sonuna yerleştirilmesi, dolaylı çağrı tamamlandığında, kontrol akışının NOSPEC_CALL makrosunun kullanımının arkasına devam etmesi için gereklidir, böylece normal bir callyerine kullanılabilir.

Thunk kendisi aşağıdaki gibi 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 şunu açıklığa kavuşturmama izin verin:

  • callgeçerli komut göstergesini (etiket 2) yığına iter.
  • leaname__, en son döndürülen adres olan (2 etiketine) en son basılan quadword'i etkin bir şekilde atarak, stack pointer öğesine 8 ekler. Bundan sonra, yığının en üst kısmı tekrar ADDR gerçek dönüş adresini işaret eder.
  • retname__, *ADDR öğesine atlar ve yığın işaretçisini çağrı yığınının başına sıfırlar.

Sonunda, bu davranış tam olarak doğrudan *ADDR 'ya atlamakla eşdeğerdir. Elde ettiğimiz tek yarar, callkomutunu çalıştırırken return ifadeleri (Return Stack Buffer, RSB) için kullanılan şube belirleyicisinin, karşılık gelen retifadesinin 2. etikete atlayacağını varsaymasıdır.

Etiket 2'den sonraki kısım aslında hiçbir zaman gerçekleşmez, yalnızca teoride komut satırını JMPkomutları ile dolduracak sonsuz bir döngüdür. LFENCEname __, PAUSEveya daha genel olarak komut satırının durmasına neden olan bir komut kullanılması, işlemcinin bu spekülatif uygulamada herhangi bir güç ve zaman harcamasını önler. Bunun nedeni, retpoline_call_target çağrısının normal şekilde dönmesi durumunda, LFENCEname__, bir sonraki çalıştırılacak komut olacaktır. Bu aynı zamanda şube belirleyicisinin orijinal iade adresine (etiket 2) dayanarak tahmin edeceği şeydir.

Intel'in mimarlık el kitabından alıntı yapmak için:

Bir LFENCE'dan sonraki talimatlar LFENCE'dan önce bellekten alınabilir, ancak LFENCE tamamlanana kadar yürütülmezler.

Bununla birlikte, spesifikasyonun LFENCE ve PAUSE'nin boru hattının durmasına neden olduğunu asla söylemediğini unutmayın, bu yüzden buradaki satırları biraz okuyorum.

Şimdi asıl sorunuza geri dönün: Çekirdek hafıza bilgilerinin açıklanması, iki fikrin birleşimi nedeniyle mümkündür:

  • Spekülatif uygulama, spekülasyon yanlış olduğu zaman yan etkisiz olsa da, spekülatif uygulama yine de önbellek hiyerarşisini etkiler. Bu, bir bellek yükünün spekülatif olarak yürütülmesi durumunda, yine de bir önbellek hattının boşaltılmasına neden olmuş olabileceği anlamına gelir. Önbellek hiyerarşisindeki bu değişiklik, aynı önbellek kümesinde eşlenen belleğe erişim süresi dikkatlice ölçülerek belirlenebilir.
    Okunan belleğin kaynak adresinin kendisi çekirdek bellekten okunduğunda, bazı rasgele bellek parçalarını bile sızdırabilirsiniz.

  • Intel CPU'ların dolaylı dal tahmincisi, kaynak komutunun sadece en düşük 12 bitini kullanır, bu nedenle 2 ^ 12 olası tahmin geçmişini kullanıcı tarafından kontrol edilen adreslerle zehirlemek kolaydır. Bunlar daha sonra, dolaylı sıçrama çekirdek içinde tahmin edildiğinde, spekülatif olarak çekirdek ayrıcalıklarıyla gerçekleştirilebilir. Önbellek zamanlaması yan kanalını kullanarak rastgele çekirdek hafızasını sızdırabilirsiniz.

GÜNCELLEME: çekirdek posta listesinde , geri dönüş Tamponu (RSB) boşaldığında, daha yakın zamanda olduğu gibi, retpolinlerin şube tahmini sorunlarını tam olarak azaltmadığına inanmamı sağlayan devam eden bir tartışma var. Intel mimarileri (Skylake +) savunmasız Şube Hedef Tamponuna (BTB) geri döndü:

Bir azaltma stratejisi olarak retpoline, saldırgan tarafından zehirlenebileceği için BTB'den gelen tahminleri kullanmaktan kaçınmak için dolaylı dalları 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.

145
Tobias Ribizel

A retpolinebranş hedef enjeksiyonuna (CVE-2017-5715) istismara karşı korumak için tasarlanmıştır. Bu, çekirdekteki dolaylı bir dal komutunun, rasgele bir kod topluluğunun spekülatif uygulamasını zorlamak için kullanıldığı bir saldırıdır. Seçilen kod, saldırgan için bir şekilde yararlı olan bir "gadget" tır. Örneğin, kod, önbelleği nasıl etkileyeceği konusunda çekirdek verilerini sızdıracak şekilde seçilebilir. Retpoline, tüm dolaylı branş talimatlarını iade talimatı ile değiştirerek bu istismarın önüne geçer.

Retpoline için anahtarın sadece "ret" kısmı olduğunu düşünüyorum, dolaylı dalın bir geri dönüş talimatı ile değiştirildiğini ve böylece CPU'nun sömürülebilir dal tahmincisi yerine return yığın belirleyicisini kullandığını söyledi. Bunun yerine basit bir Push ve return komutu kullanılırsa, spekülatif olarak yürütülecek kod, saldırgan için yararlı bir gadget değil, nihayetinde fonksiyonun sonunda döneceği kod olacaktır. Trambolin kısmının asıl faydası, geri dönüş yığını korumak gibi görünmektedir, böylece işlev gerçekte arayanına geri döndüğünde, bu doğru bir şekilde tahmin edilir.

Dal hedef enjeksiyonunun arkasındaki temel fikir basittir. İşlemcinin şubelerin kaynağının tam adresini ve hedeflerini şube hedef tamponlarında kaydetmemesinden yararlanır. Böylece saldırgan, çekirdek adres alanında belirli bir dolaylı atlama yapıldığında tahmin isabetlerine yol açacak olan kendi adres alanındaki atlamaları kullanarak tamponu doldurabilir.

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

Kâğıt Spectre Saldırıları: Spekülatif Uygulamalardan Yararlanma Paul Kocher, Daniel Genkin, Daniel Gruss, Werner Haas, Mike Hamburg, Moritz Lipp, Stefan Mangard, Thomas Prescher, Michael Schwarz ve Yuval Yarom’un nasıl dolaylı olduğuna genel bakış şubelerden yararlanılabilir:

Dolaylı Dalları Kullanma. İade yönelimli programlamadan (ROP) çizim, bu yöntemde saldırgan mağdurun adres alanından bir gadget seçer ve mağduru gadget'ı spekülatif olarak yürütmesini etkiler. ROP'un aksine, saldırgan kurban kodundaki bir güvenlik açığına güvenmiyor. Bunun yerine, saldırgan, bir dalı dolaylı bir dal komutundan gadget'ın adresine doğru yönlendirmek için Şubenin Hedef Tamponunu (BTB) eğiterek gadget'ın spekülatif bir şekilde yürütülmesini sağlar. Spekülatif olarak yürütülen talimatlar terk edilmekle birlikte, önbellek üzerindeki etkileri geri alınmaz. Bu etkiler, gadget tarafından hassas bilgileri sızdırmak için kullanılabilir. Dikkatli bir alet seçimi ile bu yöntemin kurbandan keyfi hafıza okumak için nasıl kullanılabileceğini gösteriyoruz.

Saldırgan, BTB'yi yanlışlamak için mağdurun adres alanında gadget'ın sanal adresini bulur, ardından bu adrese dolaylı dallar uygular. 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; tek gerekli olan, eğitim dalları için aynı hedef sanal adresi kullanacak dalın kullanılmasıdır. (Aslında, saldırgan istisnalar dışında kaldığı sürece, saldırganın adres alanındaki aracın sanal adresinde eşlenen kod olmasa bile saldırı çalışabilir.) Ayrıca kaynak adresin tam eşleşmesine gerek yoktur. Eğitim için kullanılan şubenin hedefi ve hedeflenen şubenin adresi. Bu nedenle, saldırgan eğitimin kurulmasında önemli bir esnekliğe sahiptir.

Bir yan kanalla ayrıcalıklı belleği okumak / Google'daki Project Zero ekibi tarafından yapılan bir blog girişi, şube hedefi enjeksiyonunun çalışan bir istismar oluşturmak için nasıl kullanılabileceğinin başka bir örneğini sunar.

42
Ross Ridge

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

Yönetici Özeti :

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

" ret poline " sözcüğü "return" ve "tramplen" kelimelerinin bir portmantea 'sidir. ", iyileştirme gibi" rel poline "" göreceli çağrı "ve" trambolin "den üretilmiştir. Aynı zamanda spekülatif uygulamaların sınırsızca “sıçramasını” mecazi olarak sağlayan iade işlemleri kullanılarak yapılan bir trambolin yapısıdır.

Linux çekirdeği veya çapraz işlem bellek ifşasına (Spectre saldırısı) karşı hafifletmek için [1] yeni bir seçenekle derlenecek, -mindirect-branch=thunk-extern sözde bir retpoline üzerinden dolaylı çağrılar yapmak için gcc'ye tanıtıldı.

[1] Ancak Linux’a özgü değil - benzer veya aynı yapı, diğer işletim sistemlerinde azaltma stratejilerinin bir parçası olarak kullanılıyor gibi görünüyor.

Bu derleyici seçeneğinin kullanımı sadece , CVE-2017- için gerekli olan mikro kod güncellemesine sahip etkilenen işlemcilerde Spectre V2 'e karşı koruma sağlar 5715. Herhangi bir kod üzerinde ' çalışacak ' (yalnızca bir çekirdek değil), ancak yalnızca "sırları" içeren kod saldırmaya değer.

Bu, Google aramalarının yalnızca çok yeni kullanımlara (genellikle 2018’de) döndüğü için yeni icat edilmiş bir terim gibi görünüyor.

LLVM derleyici , --- 4 Ocak 2018'den önce 'den beri -mretpoline anahtarına sahipti. Bu tarih, güvenlik açığının ilk olarak genel olarak bildirildi olduğu zamandır. GCC yamalarını kullanıma sunmuştur 7 Ocak 2018.

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

Bir retpolin nedir ve son çekirdek bilgi ifşa saldırılarını nasıl önler?

İlk olarak, birkaç tanım:

  • Trambolin - Bazen dolaylı atlama vektörleri olarak da adlandırılan trambolinler, servis rutinlerini, G/Ç rutinlerini, vb. Kesmeyi işaret eden adresleri tutan hafıza konumlarıdır. trambolin terimi. GCC geleneksel olarak iç içe geçmiş bir işlevin adresi alındığında çalışma zamanında yürütülebilir bir trambolin oluşturarak iç içe geçmiş işlevleri destekler. Bu normalde yığın üzerinde, içerme fonksiyonunun yığın çerçevesinde yer alan küçük bir kod parçasıdır. Trambolin statik zincir kaydını yükler ve sonra iç içe geçmiş işlevin gerçek adresine atlar.

  • Thunk - Thunk, başka bir alt programa ek bir hesaplama enjekte etmek için kullanılan bir alt programdır. Thunks, temel olarak sonucu gerekli olana kadar bir hesaplamayı geciktirmek veya diğer alt rutinin başlangıcına veya sonuna işlemler eklemek için kullanılır.

  • Memoization - Notlandırılmış bir işlev, belirli girdiler kümesine karşılık gelen sonuçları "hatırlar". Hatırlanan girişleri olan sonraki çağrılar, yeniden hesaplamak yerine hatırlanan sonucu döndürür, böylece belirli parametrelerle yapılan bir çağrının birincil maliyetini, bu parametrelerle işleve yapılan ilk çağrıdan çıkarır.

Çok kabaca, bir bir retpoline bir trambolin Bir dönüş olarak bir thunk ile ' yağma ' dolaylı branşta dekontu belirleyicisi.

Source : Retpoline, Intel için bir DURAKLATMA talimatı içerir, ancak AMD için bir LFENCE talimatı gereklidir, çünkü bu işlemcide PAUSE talimatı seri hale getirme talimatı değildir, bu nedenle pause/jmp döngüsü aşırı güç kullanacaktır. yanlış hedefin doğru hedefe geri dönmesini beklemek üzerine spekülasyon yapmıştır.

Arstechnica sorunun basit bir açıklaması var:

“Her bir işlemcinin bir mimari davranışı (talimatların nasıl çalıştığını ve programcıların programlarını yazmaya bağlı olduğunu tanımlayan belgelenmiş davranış) ve bir mikro mimari davranış (mimarinin gerçek bir uygulamasının nasıl davrandığı gibi) vardır. Bunlar ince şekillerde ayrılabilir. Örneğin, mimari olarak, hafızada belirli bir adresten bir değer yükleyen bir program, yükü gerçekleştirmeye çalışmadan önce adres bilinene kadar bekleyecektir .. Ancak, mimari açıdan, işlemci, adreste spekülatif bir şekilde tahminde bulunmaya çalışabilir. değeri hangi bellekten kullanması gerektiğinden kesinlikle emin olmadan bile (yavaş olan) bellekten yüklemek.

İşlemci yanlış tahmin ederse, tahmin edilen değeri dikkate almaz ve bu kez doğru adresle yükü tekrar gerçekleştirir. Mimari olarak tanımlanan davranış bu şekilde korunur. Ancak bu hatalı tahmin işlemcinin diğer bölümlerini, özellikle de önbellek içeriğini rahatsız edecektir. Bu mikro mimari bozulmalar, kötü amaçlı bir programın bellekte depolanan değerler hakkında çıkarımlar yapmasına izin vererek, önbellekte olması gereken (veya olmamalı) verilere erişimin ne kadar sürdüğünü zamanlayarak tespit edilebilir ve ölçülebilir. ".

Intel'in makalesinden: " Retpoline: Bir Dal Hedef Enjeksiyonu Azaltma " ( . PDF ):

"Bir retpolin dizisi, işlemcinin spekülatif uygulamasının" dolaylı dal kestirici "(program akışını tahmin etmenin bir yolu) kullanmasını, bir dallanma hedefi tarafından kontrol edilen bir adrese (doygunluğu artırıcı beş elementin tatmin edici element 4'ü) kullanmasını engeller (Spectre varyant 2) "yukarıda listelenen kompozisyondan yararlanın".

Unutmayın, eleman 4: "Açık artırma, bu dolaylı dalın bir aracı belirli şekilde yanlış tahmin etmesi ve yürütmesi için başarıyla etkilemesi gerekir. Açık artırma tarafından seçilen bu araç, gizli verileri bir yan kanaldan, genellikle önbellek zamanlamasıyla sızdırıyor.".

7
Rob