Translated ['src/binary-exploitation/rop-return-oriented-programing/srop

This commit is contained in:
Translator 2025-08-19 21:12:48 +00:00
parent 0696a5dd78
commit 6c8f9765f1
2 changed files with 20 additions and 20 deletions

View File

@ -191,11 +191,11 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
```
Her iki araç da **AArch64** kodlamalarını anlar ve *SROP gadget* olarak kullanılabilecek `mov x8, 0x8b ; svc #0` dizilerini listeleyecektir.
> Not: Binaries **BTI** ile derlendiğinde, her geçerli dolaylı dalış hedefinin ilk talimatı `bti c` olur. Bağlayıcı tarafından yerleştirilen `sigreturn` trampolinleri zaten doğru BTI iniş padini içerdiğinden, gadget yetkisiz koddan kullanılabilir durumda kalır.
> Not: Binaries **BTI** ile derlendiğinde, her geçerli dolaylı dal hedefinin ilk talimatı `bti c` olur. Bağlayıcı tarafından yerleştirilen `sigreturn` trampolinleri zaten doğru BTI iniş padini içerdiğinden, gadget yetkisiz koddan kullanılabilir durumda kalır.
## SROP'u ROP ile Zincirleme (pivot `mprotect` aracılığıyla)
`rt_sigreturn` bize *tüm* genel amaçlı kayıtları ve `pstate`'i kontrol etme imkanı verir. x86'da yaygın bir desen: 1) `mprotect` çağrısı için SROP kullanmak, 2) shell-code içeren yeni bir çalıştırılabilir yığına geçmek. Aynı fikir ARM64'te de çalışır:
`rt_sigreturn` bize *tüm* genel amaçlı kayıtları ve `pstate`'i kontrol etme imkanı verir. x86'da yaygın bir desen: 1) `mprotect` çağrısı için SROP kullanmak, 2) shell-code içeren yeni bir çalıştırılabilir yığına geçiş yapmak. Aynı fikir ARM64'te de çalışır:
```python
frame = SigreturnFrame()
frame.x8 = constants.SYS_mprotect # 226
@ -205,25 +205,25 @@ frame.x2 = 7 # PROT_READ|PROT_WRITE|PROT_EXEC
frame.sp = 0x400000 + 0x100 # new pivot
frame.pc = svc_call # will re-enter kernel
```
`0x400000+0x100` adresinde ham shell-code içeren ikinci bir aşama gönderebilirsiniz. **AArch64** *PC-relative* adresleme kullandığı için bu genellikle büyük ROP zincirleri oluşturmaktan daha kullanışlıdır.
After sending the frame you can send a second stage containing raw shell-code at `0x400000+0x100`. Because **AArch64** uses *PC-relative* addressing this is often more convenient than building large ROP chains.
## Kernel doğrulaması, PAC & Shadow-Stacks
## Kernel validation, PAC & Shadow-Stacks
Linux 5.16, kullanıcı alanı sinyal çerçevelerinin daha sıkı bir doğrulamasını tanıttı (commit `36f5a6c73096`). Kernel artık şunları kontrol eder:
Linux 5.16, kullanıcı alanı sinyal çerçevelerinin daha sıkı bir şekilde doğrulanmasını tanıttı (commit `36f5a6c73096`). Kernel artık şunları kontrol eder:
* `uc_flags`, `extra_context` mevcut olduğunda `UC_FP_XSTATE` içermelidir.
* `struct rt_sigframe` içindeki ayrılmış kelime sıfır olmalıdır.
* *extra_context* kaydındaki her işaretçi hizalanmış olmalı ve kullanıcı adres alanı içinde bir yere işaret etmelidir.
`pwntools>=4.10`, uyumlu çerçeveleri otomatik olarak oluşturur, ancak bunları manuel olarak oluşturursanız *reserved*'ı sıfırla başlatmayı ve gerçekten ihtiyaç duymadıkça SVE kaydını atlamayı unutmayın—aksi takdirde `rt_sigreturn`, döndürmek yerine `SIGSEGV` ile sonuçlanır.
`pwntools>=4.10`, uyumlu çerçeveleri otomatik olarak oluşturur, ancak bunları manuel olarak oluşturursanız, *reserved*'ı sıfırla başlatmayı ve gerçekten ihtiyaç duymadıkça SVE kaydını atlamayı unutmayın—aksi takdirde `rt_sigreturn`, döndürmek yerine `SIGSEGV` ile sonuçlanır.
Ana akım Android 14 ve Fedora 38 ile birlikte, kullanıcı alanı varsayılan olarak **PAC** (*Pointer Authentication*) ve **BTI** etkin olarak derlenmektedir (`-mbranch-protection=standard`). *SROP* kendisi etkilenmez çünkü kernel, yığın üzerinde kaydedilen doğrulanmış LR'yi atlayarak, oluşturulan çerçeveden doğrudan `PC`'yi yazar; ancak, dolaylı dallanmalar gerçekleştiren herhangi bir **sonraki ROP zinciri**, BTI etkin talimatlara veya PAC'li adreslere atlamak zorundadır. Gadget'ları seçerken bunu aklınızda bulundurun.
Ana akım Android 14 ve Fedora 38 ile başlayarak, kullanıcı alanı varsayılan olarak **PAC** (*Pointer Authentication*) ve **BTI** etkin olarak derlenir (`-mbranch-protection=standard`). *SROP* kendisi etkilenmez çünkü kernel, oluşturulan çerçeveden doğrudan `PC`'yi yazarak, yığında kaydedilen kimlik doğrulamalı LR'yi atlar; ancak, dolaylı dallanmalar gerçekleştiren herhangi bir **sonraki ROP zinciri**, BTI etkin talimatlara veya PAC'li adreslere atlamak zorundadır. Gadget'ları seçerken bunu aklınızda bulundurun.
ARMv8.9'da tanıtılan Shadow-Call-Stacks (ve zaten ChromeOS 1.27+ üzerinde etkin) bir derleyici düzeyinde hafifletme yöntemidir ve *SROP* ile *müdahale etmez* çünkü hiçbir dönüş talimatı yürütülmez—kontrol akışı kernel tarafından aktarılır.
ARMv8.9'da tanıtılan Shadow-Call-Stacks (ve zaten ChromeOS 1.27+ üzerinde etkin) bir derleyici düzeyinde hafifletme yöntemidir ve *SROP* ile çelişmez çünkü hiçbir dönüş talimatı yürütülmez—kontrol akışı kernel tarafından aktarılır.
## Referanslar
## References
* [Linux arm64 sinyal işleme belgeleri](https://docs.kernel.org/arch/arm64/signal.html)
* [Linux arm64 signal handling documentation](https://docs.kernel.org/arch/arm64/signal.html)
* [LWN "AArch64 branch protection comes to GCC and glibc" (2023)](https://lwn.net/Articles/915041/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -46,7 +46,7 @@ alert(parent.secret)
</script>
```
Eğer önceki html'ye bir http sunucusu (örneğin `python3 -m http.server`) aracılığıyla erişirseniz, tüm scriptlerin çalıştırılacağını göreceksiniz (çünkü bunu engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **sadece if2 ve if3 iframe'leri (aynı site olarak kabul edilenler) orijinal penceredeki secret'a erişebilir**.\
if4'ün `null` kökenine sahip olduğu not edilmelidir.
if4'ün `null` kökenine sahip olduğu dikkate alın.
### CSP ile Iframe'ler <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
@ -81,7 +81,7 @@ Ancak, **yalnızca `if1` ve `if2` script'leri çalıştırılacak, fakat yalnız
![](<../../images/image (372).png>)
Bu nedenle, **eğer bir JS dosyasını sunucuya yükleyip iframe aracılığıyla yükleyebiliyorsanız CSP'yi atlatmak mümkündür, hatta `script-src 'none'` ile bile**. Bu, **aynı site JSONP uç noktasını kötüye kullanarak da potansiyel olarak yapılabilir**.
Bu nedenle, **eğer bir JS dosyasını sunucuya yükleyip iframe aracılığıyla yükleyebiliyorsanız CSP'yi atlatmak mümkündür, hatta `script-src 'none'` ile bile**. Bu, **potansiyel olarak aynı site JSONP uç noktasını kötüye kullanarak da yapılabilir**.
Bunu, `script-src 'none'` ile bile bir çerezin çalındığı aşağıdaki senaryo ile test edebilirsiniz. Uygulamayı çalıştırın ve tarayıcınızla erişin:
```python
@ -120,7 +120,7 @@ victim.location = 'about:blank';
console.log(victim.name); // → sızdırılan değer
```
* **Aynı kök iframeden nonce çalınması (2024)** CSP nonceleri DOM'dan kaldırılmaz; yalnızca DevTools'ta gizlenir. Bir saldırgan *aynı kök* bir iframe enjekte edebilirse (örneğin HTML'yi siteye yükleyerek), çocuk çerçeve basitçe `document.querySelector('[nonce]').nonce` sorgulayabilir ve politikayı karşılayan yeni `<script nonce>` düğümleri oluşturabilir, bu da `strict-dynamic` olmasına rağmen tam JavaScript yürütümü sağlar. Aşağıdaki gadget, bir markup enjesini XSS'ye yükseltir:
* **Aynı kök iframeden nonce çalınması (2024)** CSP nonceleri DOM'dan kaldırılmaz; yalnızca DevTools'ta gizlenir. Bir saldırgan *aynı kök* iframeyi enjekte edebilirse (örneğin HTML'yi siteye yükleyerek), çocuk çerçeve basitçe `document.querySelector('[nonce]').nonce` sorgulayabilir ve politikayı karşılayan yeni `<script nonce>` düğümleri oluşturabilir, bu da `strict-dynamic` olmasına rağmen tam JavaScript yürütümü sağlar. Aşağıdaki gadget, bir markup enjesini XSS'ye yükseltir:
```javascript
const n = top.document.querySelector('[nonce]').nonce;
@ -130,7 +130,7 @@ s.nonce = n;
top.document.body.appendChild(s);
```
* **Form-action kaçırma (PortSwigger 2024)** `form-action` direktifini atlayan bir sayfanın giriş formu, enjekte edilmiş bir iframe veya satır içi HTML'den *yeniden hedeflenebilir*, böylece şifre yöneticileri kimlik bilgilerini otomatik olarak doldurup dış bir domaine gönderebilir, hatta `script-src 'none'` mevcut olduğunda bile. Her zaman `default-src`'yu `form-action` ile tamamlayın!
* **Form-action kaçırma (PortSwigger 2024)** `form-action` direktifini atlayan bir sayfanın giriş formu, enjekte edilmiş bir iframe veya satır içi HTML'den *yeniden hedeflenebilir*, böylece şifre yöneticileri otomatik olarak dış bir alana kimlik bilgilerini doldurup gönderebilir, hatta `script-src 'none'` mevcutken bile. Her zaman `default-src`'yu `form-action` ile tamamlayın!
**Savunma notları (hızlı kontrol listesi)**
@ -158,7 +158,7 @@ Iframe içindeki içerik, `sandbox` niteliği kullanılarak ek kısıtlamalara t
Kullanıldığında, `sandbox` niteliği birkaç sınırlama getirir:
- İçerik, benzersiz bir kaynaktan geliyormuş gibi muamele görür.
- Form gönderme girişimleri engellenir.
- Formları göndermeye yönelik herhangi bir girişim engellenir.
- Scriptlerin çalıştırılması yasaktır.
- Belirli API'lere erişim devre dışı bırakılır.
- Bağlantıların diğer tarayıcı bağlamlarıyla etkileşimde bulunması engellenir.
@ -168,7 +168,7 @@ Kullanıldığında, `sandbox` niteliği birkaç sınırlama getirir:
İpucu: Modern tarayıcılar, `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation` gibi ayrıntılı bayrakları destekler. Gömülü uygulamanın ihtiyaç duyduğu minimum yetenekleri sağlamak için bunları birleştirin.
Nitelik değeri, yukarıda belirtilen tüm kısıtlamaları uygulamak için boş bırakılabilir (`sandbox=""`). Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan, boşlukla ayrılmış belirli değerler listesi olarak ayarlanabilir.
Nitelik değeri boş bırakılabilir (`sandbox=""`) ve yukarıda belirtilen tüm kısıtlamalar uygulanır. Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan boşlukla ayrılmış özel değerler listesine ayarlanabilir.
```html
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
@ -179,8 +179,8 @@ As explained in [this article](https://blog.slonser.info/posts/make-self-xss-gre
Since **Chrome 110 (Şubat 2023) bu özellik varsayılan olarak etkin** ve spesifikasyon, *anonymous iframe* adı altında tarayıcılar arasında standart hale getirilmektedir. MDN bunu şöyle tanımlıyor: “gerçek kökenle hiçbir çerez, localStorage veya IndexedDB paylaşılmayacak şekilde üçüncü taraf iframeleri yüklemek için yeni, geçici bir depolama bölümü oluşturma mekanizması”. Saldırganlar ve savunucular için sonuçlar:
* Farklı credentialless iframelerdeki **scriptler hala aynı üst düzey kökeni paylaşır** ve DOM aracılığıyla serbestçe etkileşimde bulunabilir, bu da çoklu iframe self-XSS saldırılarını mümkün kılar (aşağıdaki PoC'ye bakın).
* Ağ **credential-stripped** olduğu için, iframedeki herhangi bir istek etkili bir şekilde kimlik doğrulaması yapılmamış bir oturum gibi davranır CSRF korumalı uç noktalar genellikle başarısız olur, ancak DOM aracılığıyla sızdırılabilir kamu sayfaları hala kapsamda kalır.
* Farklı credentialless iframelerdeki scriptler **hala aynı üst düzey kökeni paylaşır** ve DOM aracılığıyla serbestçe etkileşimde bulunabilir, bu da çoklu iframe self-XSS saldırılarını mümkün kılar (aşağıdaki PoC'ye bakın).
* Ağ **credential-stripped** olduğu için, iframe içindeki herhangi bir istek etkili bir şekilde kimlik doğrulaması yapılmamış bir oturum gibi davranır CSRF korumalı uç noktalar genellikle başarısız olur, ancak DOM aracılığıyla sızdırılabilir kamu sayfaları hala kapsamda kalır.
* Credentialless iframeden oluşturulan pop-up'lar, bazı OAuth akışlarını bozarak örtük bir `rel="noopener"` alır.
```javascript
// PoC: two same-origin credentialless iframes stealing cookies set by a third
@ -217,7 +217,7 @@ alert(window.top[1].document.cookie);
[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) belirtildiği gibi, `fetchLater` API'si bir isteğin daha sonra (belirli bir süre sonra) yürütülmesi için yapılandırılmasına olanak tanır. Bu nedenle, örneğin, bir kurbanı bir saldırganın oturumu içinde (Self-XSS ile) oturum açmak, bir `fetchLater` isteği ayarlamak (örneğin, mevcut kullanıcının şifresini değiştirmek için) ve saldırganın oturumundan çıkmak için kötüye kullanılabilir. Ardından, kurban kendi oturumuna giriş yapar ve `fetchLater` isteği yürütülerek, kurbanın şifresi saldırgan tarafından ayarlanan şifreye değiştirilir.
Bu şekilde, kurban URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir.
Bu şekilde, kurbanın URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir.
```javascript
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
const minute = 60000
@ -250,5 +250,5 @@ Aşağıdaki sayfalara göz atın:
## Referanslar
* [PortSwigger Araştırma CSP'yi aşmak için form kaçırma kullanma (Mart 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Geliştiricileri Iframe kimlik bilgisi olmadan: COEP ortamlarında iframe'leri kolayca gömme (Şub 2023)](https://developer.chrome.com/blog/iframe-credentialless)
* [Chrome Geliştiricileri Iframe kimlik bilgisi olmadan: COEP ortamlarına iframe'leri kolayca gömün (Şub 2023)](https://developer.chrome.com/blog/iframe-credentialless)
{{#include ../../banners/hacktricks-training.md}}