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

This commit is contained in:
Translator 2025-08-19 21:11:20 +00:00
parent fd3b80e23d
commit 9afdec91e6
2 changed files with 15 additions and 15 deletions

View File

@ -189,13 +189,13 @@ python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/nul
# With rp++ ≥ 1.0.9 (arm64 support)
rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn
```
Oba alata razumeju **AArch64** kodiranja i će navesti kandidate `mov x8, 0x8b ; svc #0` sekvence koje se mogu koristiti kao *SROP gadget*.
Oba alata razumeju **AArch64** kodiranja i će navesti kandidate za sekvence `mov x8, 0x8b ; svc #0` koje se mogu koristiti kao *SROP gadget*.
> Napomena: Kada su binarni fajlovi kompajlirani sa **BTI**, prva instrukcija svake važeće mete indirektne grane je `bti c`. `sigreturn` trampolini koje postavlja linker već uključuju ispravnu BTI platformu, tako da gadget ostaje upotrebljiv iz neprivilegovanog koda.
> Napomena: Kada su binarni fajlovi kompajlirani sa **BTI**, prva instrukcija svake važeće mete indirektne grane je `bti c`. `sigreturn` trampolini koje postavlja linker već uključuju ispravnu BTI platformu za sletanje, tako da gadget ostaje upotrebljiv iz neprivilegovanog koda.
## Povezivanje SROP-a sa ROP-om (pivot preko `mprotect`)
`rt_sigreturn` nam omogućava kontrolu *svih* opštih registara i `pstate`. Uobičajen obrazac na x86 je: 1) koristiti SROP za pozivanje `mprotect`, 2) pivotirati na novu izvršnu stek koja sadrži shell-code. Ista ideja funkcioniše na ARM64:
`rt_sigreturn` nam omogućava kontrolu *svih* registara opšte namene i `pstate`. Uobičajen obrazac na x86 je: 1) koristiti SROP za pozivanje `mprotect`, 2) pivotirati na novu izvršnu stek koja sadrži shell-code. Ista ideja funkcioniše na ARM64:
```python
frame = SigreturnFrame()
frame.x8 = constants.SYS_mprotect # 226
@ -207,7 +207,7 @@ frame.pc = svc_call # will re-enter kernel
```
Nakon slanja okvira možete poslati drugu fazu koja sadrži sirovi shell-kod na `0x400000+0x100`. Pošto **AArch64** koristi *PC-relative* adresiranje, ovo je često pogodnije od izgradnje velikih ROP lanaca.
## Validacija kernela, PAC i Shadow-Stacks
## Validacija kernela, PAC & Shadow-Stacks
Linux 5.16 je uveo strožu validaciju korisničkih signalnih okvira (commit `36f5a6c73096`). Kernel sada proverava:
@ -217,7 +217,7 @@ Linux 5.16 je uveo strožu validaciju korisničkih signalnih okvira (commit `36f
`pwntools>=4.10` automatski kreira usklađene okvire, ali ako ih pravite ručno, obavezno inicijalizujte *rezervisano* na nulu i izostavite SVE zapis osim ako vam zaista nije potreban—inače će `rt_sigreturn` isporučiti `SIGSEGV` umesto da se vrati.
Počevši od mainstream Android 14 i Fedora 38, korisnički prostor se kompajlira sa **PAC** (*Pointer Authentication*) i **BTI** omogućeno po defaultu (`-mbranch-protection=standard`). *SROP* sam po sebi nije pogođen jer kernel direktno prepisuje `PC` iz kreiranog okvira, zaobilazeći autentifikovani LR sačuvan na steku; međutim, svaki **sledeći ROP lanac** koji vrši indirektne granice mora skakati na BTI-omogućene instrukcije ili PACed adrese. Imajte to na umu prilikom odabira gadgeta.
Počevši od mainstream Android 14 i Fedora 38, korisnički prostor se kompajlira sa **PAC** (*Pointer Authentication*) i **BTI** omogućeni po defaultu (`-mbranch-protection=standard`). *SROP* sam po sebi nije pogođen jer kernel direktno prepisuje `PC` iz kreiranog okvira, zaobilazeći autentifikovani LR sačuvan na steku; međutim, svaki **sledeći ROP lanac** koji vrši indirektne granice mora skakati na BTI-omogućene instrukcije ili PACed adrese. Imajte to na umu prilikom izbora gadgeta.
Shadow-Call-Stacks uvedeni u ARMv8.9 (i već omogućeni na ChromeOS 1.27+) su mitigacija na nivou kompajlera i *ne ometaju* SROP jer se ne izvršavaju instrukcije povratka—tok kontrole se prenosi od strane kernela.

View File

@ -10,7 +10,7 @@ Postoje 3 načina da se označi sadržaj stranice unutar iframe-a:
- Putem `src` koji označava sadržaj koristeći `data:` protokol
- Putem `srcdoc` koji označava sadržaj
**Pristupanje Parent & Child varijablama**
**Pristupanje roditeljskim i dečijim varijablama**
```html
<html>
<script>
@ -46,12 +46,12 @@ alert(parent.secret)
</script>
```
Ako pristupite prethodnom html-u putem http servera (kao što je `python3 -m http.server`), primetićete da će svi skripti biti izvršeni (pošto ne postoji CSP koji to sprečava). **roditelj neće moći da pristupi `secret` varijabli unutar bilo kog iframe-a** i **samo iframe-ovi if2 i if3 (koji se smatraju istim sajtom) mogu pristupiti tajni** u originalnom prozoru.\
Obratite pažnju kako se if4 smatra da ima `null` poreklo.
Obratite pažnju na to kako se if4 smatra da ima `null` poreklo.
### Iframes sa CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
> [!TIP]
> Molimo vas, obratite pažnju kako u sledećim zaobilaženjima odgovor na iframed stranicu ne sadrži nijedan CSP header koji sprečava izvršavanje JS-a.
> Molimo vas, obratite pažnju na to kako u sledećim zaobilaženjima odgovor na iframed stranicu ne sadrži nijedan CSP header koji sprečava izvršavanje JS-a.
`self` vrednost `script-src` neće dozvoliti izvršavanje JS koda koristeći `data:` protokol ili `srcdoc` atribut.\
Međutim, čak i `none` vrednost CSP-a će dozvoliti izvršavanje iframe-ova koji stavljaju URL (potpun ili samo putanju) u `src` atribut.\
@ -105,9 +105,9 @@ app.run()
```
#### Nove (2023-2025) CSP bypass tehnike sa iframovima
Istraživačka zajednica nastavlja da otkriva kreativne načine zloupotrebe iframova kako bi prevazišla restriktivne politike. Ispod možete pronaći najznačajnije tehnike objavljene tokom poslednjih nekoliko godina:
Istraživačka zajednica nastavlja da otkriva kreativne načine zloupotrebe iframova kako bi se savladale restriktivne politike. Ispod možete pronaći najznačajnije tehnike objavljene tokom poslednjih nekoliko godina:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Kada aplikacija reflektuje HTML, ali jaka CSP blokira izvršavanje skripti, još uvek možete iscuriti osetljive tokene injektovanjem *dangling* `<iframe name>` atributa. Kada se delimični markup analizira, napadačka skripta koja se izvršava u odvojenom poreklu navigira okvir na `about:blank` i čita `window.name`, koji sada sadrži sve do sledećeg karaktera navodnika (na primer, CSRF token). Pošto se JavaScript ne izvršava u kontekstu žrtve, napad obično izbegava `script-src 'none'`. Minimalni PoC je:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Kada aplikacija reflektuje HTML, ali jaka CSP blokira izvršavanje skripti, i dalje možete iscuriti osetljive tokene injektovanjem *dangling* `<iframe name>` atributa. Kada se delimični markup analizira, napadačka skripta koja se izvršava u odvojenom poreklu navigira okvir na `about:blank` i čita `window.name`, koji sada sadrži sve do sledećeg karaktera navodnika (na primer, CSRF token). Pošto se JavaScript ne izvršava u kontekstu žrtve, napad obično izbegava `script-src 'none'`. Minimalni PoC je:
```html
<!-- Tačka injekcije neposredno pre osetljivog <script> -->
@ -137,7 +137,7 @@ top.document.body.appendChild(s);
1. Uvek šaljite *sve* CSP direktive koje kontrolišu sekundarne kontekste (`form-action`, `frame-src`, `child-src`, `object-src`, itd.).
2. Ne oslanjajte se na to da su nonces tajni—koristite `strict-dynamic` **i** eliminišite tačke injekcije.
3. Kada morate da ugradite nepouzdane dokumente, koristite `sandbox="allow-scripts allow-same-origin"` **veoma pažljivo** (ili bez `allow-same-origin` ako vam je potrebna samo izolacija izvršavanja skripti).
4. Razmotrite implementaciju odbrane u dubini COOP+COEP; novi `<iframe credentialless>` atribut (§ ispod) vam omogućava da to uradite bez kršenja trećih strana.
4. Razmotrite implementaciju COOP+COEP kao odbranu u dubini; novi `<iframe credentialless>` atribut (§ ispod) vam omogućava da to uradite bez kršenja trećih strana.
### Ostali payload-ovi pronađeni u divljini <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
```html
@ -160,7 +160,7 @@ Kada se koristi, `sandbox` atribut nameće nekoliko ograničenja:
- Sadržaj se tretira kao da potiče iz jedinstvenog izvora.
- Svaki pokušaj slanja formi je blokiran.
- Izvršavanje skripti je zabranjeno.
- Pristup određenim API-ima je onemogućen.
- Pristup određenim API-jima je onemogućen.
- Sprečava interakciju linkova sa drugim kontekstima pretraživanja.
- Korišćenje dodataka putem `<embed>`, `<object>`, `<applet>`, ili sličnih oznaka je zabranjeno.
- Navigacija sadržajem najvišeg nivoa pretraživačkog konteksta od strane samog sadržaja je sprečena.
@ -177,7 +177,7 @@ Vrednost atributa može biti ostavljena prazna (`sandbox=""`) da bi se primenila
Kao što je objašnjeno u [ovom članku](https://blog.slonser.info/posts/make-self-xss-great-again/), `credentialless` oznaka u iframe-u se koristi za učitavanje stranice unutar iframe-a bez slanja kredencijala u zahtevu, dok se održava politika istog porekla (SOP) učitane stranice u iframe-u.
Pošto je **Chrome 110 (februar 2023) ova funkcija omogućena po defaultu** i specifikacija se standardizuje među pretraživačima pod imenom *anonymous iframe*. MDN to opisuje kao: “mehanizam za učitavanje iframe-a trećih strana u potpuno novom, ephemernom skladišnom delu tako da se nijedni kolačići, localStorage ili IndexedDB ne dele sa pravim poreklom”. Posledice za napadače i odbrambene strane:
Pošto je **Chrome 110 (februar 2023) ova funkcija omogućena po defaultu** i specifikacija se standardizuje među pretraživačima pod imenom *anonymous iframe*. MDN to opisuje kao: “mehanizam za učitavanje iframe-a trećih strana u potpuno novoj, ephemernoj skladišnoj particiji tako da se nijeki kolačići, localStorage ili IndexedDB ne dele sa pravim poreklom”. Posledice za napadače i odbrambene strane:
* Skripte u različitim credentialless iframe-ima **i dalje dele isto vrhunsko poreklo** i mogu slobodno da komuniciraju putem DOM-a, što čini multi-iframe self-XSS napade izvodljivim (vidi PoC ispod).
* Pošto je mreža **bez kredencijala**, svaki zahtev unutar iframe-a se efektivno ponaša kao neautentifikovana sesija CSRF zaštićene tačke obično ne uspevaju, ali javne stranice koje se mogu otkriti putem DOM-a su i dalje u opsegu.
@ -189,7 +189,7 @@ alert(window.top[2].document.cookie); // read -> foo=bar
```
- Primer eksploatacije: Self-XSS + CSRF
U ovom napadu, napadač priprema zloćudnu veb stranicu sa 2 iframe-a:
U ovom napadu, napadač priprema zlonamernu veb stranicu sa 2 iframe-a:
- Iframe koji učitava stranicu žrtve sa `credentialless` oznakom sa CSRF-om koji pokreće XSS (Zamislite Self-XSS u korisničkom imenu korisnika):
```html
@ -250,5 +250,5 @@ Proverite sledeće stranice:
## Reference
* [PortSwigger Research Korišćenje otmice formi za zaobilaženje CSP (mart 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe bez kredencijala: Lako umetnite iframe u COEP okruženja (februar 2023)](https://developer.chrome.com/blog/iframe-credentialless)
* [Chrome Developers Iframe bez kredencijala: Lako umetnite iframe u COEP okruženja (feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)
{{#include ../../banners/hacktricks-training.md}}