diff --git a/src/pentesting-cloud/confidential-computing/luks2-header-malleability-null-cipher-abuse.md b/src/pentesting-cloud/confidential-computing/luks2-header-malleability-null-cipher-abuse.md new file mode 100644 index 000000000..5b72d7eec --- /dev/null +++ b/src/pentesting-cloud/confidential-computing/luks2-header-malleability-null-cipher-abuse.md @@ -0,0 +1,141 @@ +# LUKS2 Header Malleability and Null-Cipher Abuse in Confidential VMs + +{{#include ../../banners/hacktricks-training.md}} + +## TL;DR + +- Mnoge Linux-based Confidential VMs (CVMs) koje rade na AMD SEV-SNP ili Intel TDX koriste LUKS2 za persistent storage. On-disk LUKS2 header je malleable i nije zaštićen integritetom protiv napadača sa pristupom disku. +- Ako je enkripcija data segmenta zaglavlja podešena na null cipher (npr. "cipher_null-ecb"), cryptsetup to prihvata i guest transparentno čita/piše plaintext dok veruje da je disk enkriptovan. +- Pre i uključujući cryptsetup 2.8.0, null ciphers su mogli da se koriste za keyslots; od 2.8.1 su odbijeni za keyslots sa ne-praznim lozinkama, ali null ciphers ostaju dozvoljeni za volume segments. +- Remote attestation obično meri VM code/config, ne mutabilna eksternih LUKS header-a; bez eksplicitne validacije/measurement-a, napadač sa pravom pisanja na disk može naterati plaintext I/O. + +## Background: LUKS2 on-disk format (what matters for attackers) + +- LUKS2 uređaj počinje zaglavljem, nakon čega sledi enkriptovani data. +- Zaglavlje sadrži dve identične kopije binarnog dela i JSON metadata sekciju, plus jedan ili više keyslots. +- JSON metadata definiše: + - enabled keyslots i njihov wrapping KDF/cipher + - segments koji opisuju data area (cipher/mode) + - digests (npr. hash of the volume key za verifikaciju passphrases) +- Tipične sigurne vrednosti: keyslot KDF argon2id; keyslot i enkripcija data segmenta aes-xts-plain64. + +Quickly inspect the segment cipher directly from JSON: +```bash +# Read JSON metadata and print the configured data segment cipher +cryptsetup luksDump --type luks2 --dump-json-metadata /dev/VDISK \ +| jq -r '.segments["0"].encryption' +``` +## Uzrok + +- LUKS2 headers nisu autentifikovani protiv menjanja na skladištu. Napadač sa strane hosta/skladišta može prepisati JSON metadata koje prihvata cryptsetup. +- Počevši od cryptsetup 2.8.0, zaglavlja koja postavljaju enkripciju segmenta na cipher_null-ecb se prihvataju. null cipher ignoriše ključeve i vraća plaintext. +- Do 2.8.0, null ciphers su se takođe mogli koristiti za keyslots (keyslot se otvara sa bilo kojim passphrase). Od 2.8.1, null ciphers se odbacuju za keyslots sa ne-praznim lozinkama, ali ostaju dozvoljeni za segments. Promena samo segment cipher i dalje daje plaintext I/O posle 2.8.1. + +## Model pretnje: zašto attestation nije spasilo po defaultu + +- CVMs imaju za cilj da obezbede poverljivost, integritet i autentičnost na nepouzdanom hostu. +- Remote attestation obično meri VM image i launch configuration, a ne promenljivi LUKS header koji se nalazi na nepouzdanom skladištu. +- Ako vaš CVM veruje on-disk headeru bez robusne validacije/measurement, napadač sa skladišta može ga izmeniti u null cipher i vaš guest će mountovati plaintext volume bez greške. + +## Eksploatacija (zahteva write pristup storage-u) + +Preduslovi: +- Pristup za pisanje na LUKS2-enkriptovani block device CVM-a. +- Guest koristi on-disk LUKS2 header bez robusne validacije/attestation. + +Koraci (visok nivo): +1) Pročitajte header JSON i identifikujte definiciju data segmenta. Primer ciljnog polja: segments["0"].encryption. +2) Postavite enkripciju data segmenta na null cipher, npr. cipher_null-ecb. Ostavite keyslot parametre i digest strukturu neizmenjenim tako da uobičajeni passphrase gosta i dalje „radi“. +3) Ažurirajte obe kopije headera i pripadajuće header digeste tako da je header samokonzistentan. +4) Pri narednom boot-u, guest pokreće cryptsetup, uspešno otvara postojeći keyslot svojim passphrase-om i mountuje volumen. Pošto je segment cipher null cipher, svi čitanja/pisanja su plaintext. + +Varijanta (pre-2.8.1 keyslot abuse): ako je area.encryption keyslota null cipher, on se otvara sa bilo kojim passphrase-om. Kombinujte to sa null segment cipher-om za neprimetni plaintext pristup bez poznavanja guest tajne. + +## Robusne mitigacije (izbegnite TOCTOU sa detached headers) + +Uvek tretirajte on-disk LUKS headers kao nepouzdan ulaz. Koristite detached-header mode tako da validacija i otvaranje koriste iste pouzdane bajtove iz zaštićenog RAM-a: +```bash +# Copy header into protected memory (e.g., tmpfs) and open from there +cryptsetup luksHeaderBackup --header-backup-file /tmp/luks_header /dev/VDISK +cryptsetup open --type luks2 --header /tmp/luks_header /dev/VDISK --key-file=key.txt +``` +Zatim primenite jedno (ili više) od: + +1) Primeni MAC na celo zaglavlje +- Izračunaj/proveri MAC preko celog zaglavlja pre upotrebe. +- Otvaraj volumen samo kada se MAC verifikuje. +- Primeri u praksi: Flashbots tdx-init i Fortanix Salmiac su usvojili MAC-based verification. + +2) Stroga JSON validacija (kompatibilno unazad) +- Dump JSON metadata i validiraj strogi allowlist parametara (KDF, ciphers, segment count/type, flags). +```bash +#!/bin/bash +set -e +# Store header in confidential RAM fs +cryptsetup luksHeaderBackup --header-backup-file /tmp/luks_header $BLOCK_DEVICE +# Dump JSON metadata header to a file +cryptsetup luksDump --type luks2 --dump-json-metadata /tmp/luks_header > header.json +# Validate the header +python validate.py header.json +# Open the cryptfs using key.txt +cryptsetup open --type luks2 --header /tmp/luks_header $BLOCK_DEVICE --key-file=key.txt +``` +
+Primer validatora (primenjuje bezbedna polja) +```python +from json import load +import sys +with open(sys.argv[1], "r") as f: +header = load(f) +if len(header["keyslots"]) != 1: +raise ValueError("Expected 1 keyslot") +if header["keyslots"]["0"]["type"] != "luks2": +raise ValueError("Expected luks2 keyslot") +if header["keyslots"]["0"]["area"]["encryption"] != "aes-xts-plain64": +raise ValueError("Expected aes-xts-plain64 encryption") +if header["keyslots"]["0"]["kdf"]["type"] != "argon2id": +raise ValueError("Expected argon2id kdf") +if len(header["tokens"]) != 0: +raise ValueError("Expected 0 tokens") +if len(header["segments"]) != 1: +raise ValueError("Expected 1 segment") +if header["segments"]["0"]["type"] != "crypt": +raise ValueError("Expected crypt segment") +if header["segments"]["0"]["encryption"] != "aes-xts-plain64": +raise ValueError("Expected aes-xts-plain64 encryption") +if "flags" in header["segments"]["0"] and header["segments"]["0"]["flags"]: +raise ValueError("Segment contains unexpected flags") +``` +
+ +3) Izmerite/potvrdite zaglavlje +- Uklonite nasumične soli/digeste i izmerite sanitizovano zaglavlje u TPM/TDX/SEV PCR-ove ili stanje KMS politike. +- Izdajte ključeve za dešifrovanje samo kada izmereno zaglavlje odgovara odobrenom, sigurnom profilu. + +Operativne smernice: +- Obavezno koristite odvojeno zaglavlje + MAC ili strogu validaciju; nikada direktno ne verujte zaglavljima na disku. +- Konsumenti attestacije treba da odbace pre-patch verzije framework-a iz allow-listi. + +## Napomene o verzijama i stavu održavaoca + +- održavaoci cryptsetup-a pojasnili su da LUKS2 nije dizajniran da obezbedi integritet protiv manipulacije skladištem u ovom okruženju; null ciphers su zadržani radi kompatibilnosti unazad. +- cryptsetup 2.8.1 (Oct 19, 2025) odbacuje null ciphers za keyslots sa ne-praznim lozinkama, ali i dalje dozvoljava null ciphers za segments. + +## Brze provere i trijaža + +- Proverite da li je enkripcija bilo kog segmenta postavljena na null cipher: +```bash +cryptsetup luksDump --type luks2 --dump-json-metadata /dev/VDISK \ +| jq -r '.segments | to_entries[] | "segment=" + .key + ", enc=" + .value.encryption' +``` +- Proverite keyslot i segment algoritme pre otvaranja volumena. Ako ne možete da verifikujete MAC, primenite strogu JSON validaciju i otvorite koristeći detached header iz zaštićene memorije. + +## References + +- [Vulnerabilities in LUKS2 disk encryption for confidential VMs (Trail of Bits)](https://blog.trailofbits.com/2025/10/30/vulnerabilities-in-luks2-disk-encryption-for-confidential-vms/) +- [cryptsetup issue #954 (null cipher acceptance and integrity considerations)](https://gitlab.com/cryptsetup/cryptsetup/-/issues/954) +- [CVE-2025-59054](https://nvd.nist.gov/vuln/detail/CVE-2025-59054) +- [CVE-2025-58356](https://nvd.nist.gov/vuln/detail/CVE-2025-58356) +- [Related context: CVE-2021-4122 (auto-recovery path silently decrypting disks)](https://www.cve.org/CVERecord?id=CVE-2021-4122) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/pentesting-cloud-methodology.md b/src/pentesting-cloud/pentesting-cloud-methodology.md index 7a04c2d84..cc2b551e9 100644 --- a/src/pentesting-cloud/pentesting-cloud-methodology.md +++ b/src/pentesting-cloud/pentesting-cloud-methodology.md @@ -1,4 +1,4 @@ -# Pentesting Cloud Metodologija +# Pentesting Metodologija oblaka {{#include ../banners/hacktricks-training.md}} @@ -6,39 +6,39 @@ ## Osnovna metodologija -Svaki cloud ima svoje osobenosti, ali generalno postoji nekoliko **zajedničkih stvari koje pentester treba da proveri** kada testira cloud okruženje: +Svaki cloud ima svoje specifičnosti, ali generalno postoji nekoliko **uobičajenih stvari koje pentester treba da proveri** kada testira cloud okruženje: -- **Benchmark provere** -- Ovo će vam pomoći da **razumete veličinu** okruženja i **korišćene servise** -- Takođe će vam omogućiti da pronađete neke **brze greške u konfiguraciji** pošto većinu ovih testova možete izvršiti pomoću **automatizovanih alata** -- **Enumeracija servisa** -- Verovatno nećete naći mnogo više grešaka u konfiguraciji ovde ako ste pravilno izvršili benchmark testove, ali možete naći neke koje se nisu tražile u benchmark testu. -- Ovo će vam omogućiti da znate **šta se tačno koristi** u cloud okruženju -- Ovo će mnogo pomoći u narednim koracima -- **Provera izloženih resursa** -- Ovo može biti urađeno tokom prethodnog dela, potrebno je da **otkrijete sve što je potencijalno izloženo** Internetu na neki način i kako se može pristupiti. -- Ovde mislim na **ručno izloženu infrastrukturu** kao što su instance sa web stranicama ili drugim izloženim portovima, i takođe na druge **cloud managed services koje se mogu konfigurisati** da budu izložene (kao što su DBs ili buckets) -- Zatim treba da proverite **da li taj resurs može biti izložen ili ne** (poverljive informacije? ranjivosti? greške u konfiguraciji izloženog servisa?) -- **Provera dozvola** -- Ovde treba da **utvrdite sve dozvole svake uloge/korisnika** u cloud-u i kako se koriste -- Previše **visoko privilegovanih** (kontrolišu sve) naloga? Generisani ključevi se ne koriste?... Većina ovih provera bi već trebalo da je urađena u benchmark testovima -- Ako klijent koristi OpenID, SAML ili neku drugu **federation**, možda ćete morati da od njih zatražite dodatne **informacije** o **kako se svaka uloga dodeljuje** (nije isto da je admin uloga dodeljena jednom korisniku ili 100) -- Nije dovoljno da se utvrdi koji korisnici imaju **admin** dozvole "*:*". Postoji mnogo **ostalih dozvola** koje, u zavisnosti od korišćenih servisa, mogu biti veoma **osetljive**. -- Štaviše, postoje **potencijalni privesc** načini koji se mogu ispratiti zloupotrebom dozvola. Sve ovo treba uzeti u obzir i prijaviti **što više privesc puteva koliko je moguće**. -- **Provera integracija** -- Veoma je verovatno da su **integracije sa drugim cloud-ovima ili SaaS** korišćene unutar cloud okruženja. -- Za **integracije cloud-a koje auditirate** sa drugim platformama treba da obavestite **ko ima pristup da (zloupotrebi) tu integraciju** i treba da pitate **koliko je osetljiva** akcija koja se izvršava.\ -Na primer, ko može da upisuje u AWS bucket iz kojeg GCP dobija podatke (pitajte koliko je osetljiva ta radnja u GCP prilikom obrade tih podataka). -- Za **integracije unutar cloud-a koji auditirate** iz eksternih platform, treba da pitate **ko ima eksterni pristup da (zloupotrebi) tu integraciju** i proverite kako se ti podaci koriste.\ -Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitate ko ima pristup da modifikuje taj image i koje osetljive informacije i pristupe će taj image dobiti kada se izvrši unutar AWS cloud-a. +- **Benchmark checks** +- Ovo će vam pomoći da **shvatite veličinu** okruženja i **korišćene servise** +- Takođe će vam omogućiti da pronađete neke **quick misconfigurations** pošto većinu ovih testova možete izvesti pomoću **automated tools** +- **Services Enumeration** +- Verovatno nećete pronaći mnogo više misconfigurations ovde ako ste ispravno izvršili benchmark tests, ali možda ćete pronaći neke koji nisu bili obuhvaćeni benchmark testom. +- Ovo će vam omogućiti da znate **šta se tačno koristi** u cloud env +- Ovo će puno pomoći u narednim koracima +- **Check exposed assets** +- Ovo se može raditi tokom prethodnog dela; treba da **otkrijete sve što je potencijalno izloženo** na Internet na neki način i kako se može pristupiti. +- Ovde podrazumevam **manually exposed infrastructure** kao instance sa web stranicama ili drugim portovima izloženim, kao i druge **cloud managed services** koje se mogu konfigurisati da budu izložene (kao DBs ili buckets) +- Zatim treba da proverite **da li taj resurs može biti izložen ili ne** (poverljive informacije? vulnerabilities? misconfigurations in the exposed service?) +- **Check permissions** +- Ovde treba da **otkrijete sve permissions svakog role/user** unutar clouda i kako se koriste +- Previše **highly privileged** (control everything) naloga? Generated keys not used?... Većina ovih provera bi trebala biti urađena u benchmark tests već +- Ako klijent koristi OpenID ili SAML ili neku drugu federaciju možda ćete morati da tražite dodatne **informacije** o **kako se dodeljuje svaka uloga** (nije isto ako je admin uloga dodeljena 1 korisniku ili 100) +- Nije dovoljno da pronađete koji korisnici imaju **admin permissions** "*:*". Postoji mnogo drugih **permissions** koji, u zavisnosti od korišćenih servisa, mogu biti veoma **osetljivi**. +- Štaviše, postoje potencijalni privesc načini za zloupotrebu permissions. Sve ovo treba uzeti u obzir i **prijaviti što više privesc paths** koliko je moguće. +- **Check Integrations** +- Veoma je verovatno da se koriste **integrations with other clouds or SaaS** unutar cloud okruženja. +- Za **integrations of the cloud you are auditing** sa drugim platformama treba da obavestite **ko ima pristup da (ab)use tu integraciju** i treba da pitate **koliko je osetljiva** akcija koja se izvodi.\ +Na primer, ko može da piše u jedan AWS bucket iz kog GCP uzima podatke (pitati koliko je ta akcija osetljiva u GCP pri obradi tih podataka). +- Za **integrations inside the cloud you are auditing** iz eksternih platforma, treba da pitate **ko ima spoljašnji pristup da (ab)use tu integraciju** i proverite kako se ti podaci koriste.\ +Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitate ko ima pristup da modifikuje taj image i koje osetljive informacije i pristupe će taj image dobiti kada se pokrene unutar AWS clouda. -## Multi-Cloud alati +## Alati za Multi-Cloud -Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom delu. +Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom odeljku. ### [PurplePanda](https://github.com/carlospolop/purplepanda) -Alat za **identifikovanje loših konfiguracija i privesc path u cloud-ovima i između cloud-ova/SaaS.** +Alat za **identifikovanje loših konfiguracija i privesc path u cloud-ovima i između cloud/SaaS.** {{#tabs }} {{#tab name="Install" }} @@ -71,7 +71,7 @@ python3 main.py -e -p google #Enumerate the env ### [Prowler](https://github.com/prowler-cloud/prowler) -Podržava **AWS, GCP & Azure**. Pogledajte kako konfigurisati svakog provajdera na [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws) +Podržava **AWS, GCP & Azure**. Pogledajte kako konfigurisati svakog provajdera u [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws) ```bash # Install pip install prowler @@ -168,9 +168,9 @@ steampipe check all ```
-Proverite sve projekte +Proveri sve projekte -Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte koje treba testirati. Možete jednostavno slediti uputstva iz sledećeg skripta +Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte za testiranje. Možete jednostavno pratiti uputstva iz sledećeg skripta ```bash FILEPATH="/tmp/gcp.spc" rm -rf "$FILEPATH" 2>/dev/null @@ -196,9 +196,9 @@ echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generate Za proveru **ostalih GCP uvida** (korisno za nabrajanje servisa) koristite: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights) -Za pregled Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance) +Za proveru Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance) -Više GCP plugina za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp) +Više GCP plugin-ova za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp) {{#endtab }} {{#tab name="AWS" }} @@ -238,11 +238,11 @@ Zahteva python2.7 i izgleda neodržavano. ### Nessus -Nessus ima _**Audit Cloud Infrastructure**_ skeniranje koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su neke dodatne konfiguracije u **Azure** kako bi se dobio **Client Id**. +Nessus ima _**Audit Cloud Infrastructure**_ skeniranje koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su neke dodatne konfiguracije u **Azure** da bi se dobio **Client Id**. ### [**cloudlist**](https://github.com/projectdiscovery/cloudlist) -Cloudlist je **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) from Cloud Providers. +Cloudlist je **multi-cloud alat za prikupljanje Assets** (Hostnames, IP Addresses) od Cloud Providers. {{#tabs }} {{#tab name="Cloudlist" }} @@ -265,7 +265,7 @@ cloudlist -config ### [**cartography**](https://github.com/lyft/cartography) -Cartography je Python alat koji objedinuje infrastrukturne resurse i veze između njih u intuitivnom grafičkom prikazu zasnovanom na Neo4j bazi podataka. +Cartography je Python alat koji konsoliduje infrastrukturne resurse i odnose između njih u intuitivnom grafičkom prikazu koji pokreće Neo4j database. {{#tabs }} {{#tab name="Install" }} @@ -302,7 +302,7 @@ ghcr.io/lyft/cartography \ ### [**starbase**](https://github.com/JupiterOne/starbase) -Starbase prikuplja resurse i odnose iz servisa i sistema, uključujući cloud infrastrukturu, SaaS aplikacije, sigurnosne kontrole i još mnogo toga, u intuitivan grafički prikaz koji koristi Neo4j bazu podataka. +Starbase prikuplja resurse i veze iz servisa i sistema — uključujući cloud infrastrukturu, SaaS aplikacije, bezbednosne kontrole i drugo — i prikazuje ih u intuitivnom grafu zasnovanom na Neo4j bazi podataka. {{#tabs }} {{#tab name="Install" }} @@ -361,7 +361,7 @@ uri: bolt://localhost:7687 ### [**SkyArk**](https://github.com/cyberark/SkyArk) -Otkriva najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell. +Otkrijte najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell. ```bash Import-Module .\SkyArk.ps1 -force Start-AzureStealth @@ -376,11 +376,11 @@ Alat za pronalaženje infrastrukture kompanije (cilja), fajlova i aplikacija na ### [CloudFox](https://github.com/BishopFox/cloudfox) -- CloudFox je alat za pronalaženje iskoristivih puteva napada u cloud infrastrukturi (trenutno podržani samo AWS & Azure, a GCP dolazi uskoro). -- To je alat za enumeraciju koji je namenjen da dopuni manualni pentesting. -- Ne kreira niti menja bilo koje podatke unutar cloud okruženja. +- CloudFox je alat za pronalaženje iskoristivih putanja napada u cloud infrastrukturi (trenutno podržani samo AWS & Azure, GCP uskoro). +- To je alat za enumeraciju namenjen da dopuni manualni pentesting. +- Ne kreira niti menja bilo kakve podatke unutar cloud okruženja. -### Više spiskova alata za cloud sigurnost +### More lists of cloud security tools - [https://github.com/RyanJarv/awesome-cloud-sec](https://github.com/RyanJarv/awesome-cloud-sec) @@ -410,13 +410,12 @@ aws-security/ azure-security/ {{#endref}} -### Attack Graph +## Zajedničke funkcije bezbednosti u cloudu -[**Stormspotter** ](https://github.com/Azure/Stormspotter) kreira „attack graph“ resursa u Azure pretplati. Omogućava red teams i pentesters da vizualizuju površinu napada i mogućnosti pivotovanja unutar tenant-a, i ubrzava vaše odbrambene timove da se brzo orijentišu i daju prioritet radu na odgovoru na incidente. - -### Office365 - -Potrebno je imati **Global Admin** ili bar **Global Admin Reader** (ali imajte na umu da je Global Admin Reader pomalo ograničen). Međutim, ta ograničenja se pojavljuju u nekim PS modulima i mogu se zaobići pristupanjem funkcijama **preko web aplikacije**. +### Confidential Computing +{{#ref}} +confidential-computing/luks2-header-malleability-null-cipher-abuse.md +{{#endref}} {{#include ../banners/hacktricks-training.md}}