Abusing Roles/ClusterRoles in Kubernetes
Ovde možete pronaći neke potencijalno opasne konfiguracije uloga i ClusterRoles.
Zapamtite da možete dobiti sve podržane resurse sa kubectl api-resources
Povećanje privilegija
Pod povećanjem privilegija se podrazumeva veština dobijanja pristupa drugom principalu unutar klastera sa različitim privilegijama (unutar kubernetes klastera ili ka eksternim oblakama) od onih koje već imate, u Kubernetesu postoje uglavnom 4 glavne tehnike za povećanje privilegija:
Biti u mogućnosti da se predstavite kao drugi korisnik/grupe/SA sa većim privilegijama unutar kubernetes klastera ili ka eksternim oblakama
Biti u mogućnosti da kreirate/izmenite/izvršite podove gde možete pronaći ili povezati SA sa većim privilegijama unutar kubernetes klastera ili ka eksternim oblakama
Biti u mogućnosti da čitate tajne jer se tokeni SA čuvaju kao tajne
Biti u mogućnosti da pobegnete na čvor iz kontejnera, gde možete ukrasti sve tajne kontejnera koji se izvršavaju na čvoru, akreditacije čvora i dozvole čvora unutar oblaka u kojem se izvršava (ako postoje)
Peta tehnika koja zaslužuje pomen je mogućnost pokretanja port-forward u podu, jer možda možete pristupiti zanimljivim resursima unutar tog poda.
Pristup bilo kom resursu ili glagolu (Zvezdica)
Zvezdica (*) daje dozvolu nad bilo kojim resursom sa bilo kojim glagolom. Koristi je administratori. Unutar ClusterRole to znači da napadač može zloupotrebiti bilo koju prostoriju u klasteru.
Pristupite bilo kom resursu sa određenim glagolom
U RBAC-u, određene dozvole predstavljaju značajne rizike:
create
: Omogućava mogućnost kreiranja bilo kog resursa u klasteru, rizikujući eskalaciju privilegija.list
: Dozvoljava listanje svih resursa, potencijalno otkrivajući osetljive podatke.get
: Dozvoljava pristupanje tajnama iz servisnih naloga, predstavljajući sigurnosnu pretnju.
Kreiranje Poda - Krađa Tokena
Napadač sa dozvolama za kreiranje poda, može pridružiti privilegovan Service Account u pod i ukrasti token kako bi se predstavio kao Service Account. Efikasno povećavajući privilegije na njega
Primer poda koji će ukrasti token Service Account-a bootstrap-signer
i poslati ga napadaču:
Kreiranje i Bekstvo Pod-a
Sledeće ukazuje na sve privilegije koje kontejner može imati:
Privilegovan pristup (onemogućavanje zaštite i postavljanje sposobnosti)
Onemogućavanje hostIPC i hostPid namespace-ova koji mogu pomoći u eskalaciji privilegija
Onemogućavanje hostNetwork namespace-a, omogućavajući pristup krađi privilegija oblaka i bolji pristup mrežama
Montiranje / unutar kontejnera hostova
Kreirajte pod sa:
Jedan red iz ovog tvita i sa nekim dodacima:
Sada kada možete da pobegnete do čvora, proverite post-eksploatacione tehnike u:
Skrivanje
Verovatno želite da budete diskretniji, na sledećim stranicama možete videti na šta biste mogli da pristupite ako kreirate pod omogućavajući samo neke od pomenutih privilegija u prethodnom predlošku:
Privilegovani + hostPID
Samo privilegovani
hostPath
hostPID
hostNetwork
hostIPC
Možete pronaći primer kako kreirati/zloupotrebiti prethodne konfiguracije privilegovanih podova na https://github.com/BishopFox/badPods
Kreiranje Poda - Premeštanje u oblak
Ako možete kreirati pod (i opciono servisni nalog), možda ćete moći da dobijete privilegije u oblaku dodeljivanjem oblak uloga podu ili servisnom nalogu, a zatim pristupanjem tome. Osim toga, ako možete kreirati pod sa mrežnim imenikom domaćina, možete ukrasti IAM ulogu instance čvora.
Za više informacija pogledajte:
Pod Escape PrivilegesKreiranje/Patchovanje Deploymenta, Daemonsetova, Statefulsetova, Replicationcontrollera, Replicasetova, Poslova i Cron poslova
Moguće je zloupotrebiti ove dozvole da se kreira novi pod i uspostave privilegije kao u prethodnom primeru.
Sledeći yaml kreira daemonset i eksfiltrira token SA unutar poda:
Izvršavanje u Podovima
pods/exec
je resurs u kubernetesu koji se koristi za izvršavanje komandi u ljusci unutar poda. Ovo omogućava da se izvrše komande unutar kontejnera ili da se dobije ljuska unutar.
Stoga je moguće ući u pod i ukrasti token SA, ili ući u privilegovan pod, pobegnuti na čvor i ukrasti sve tokene podova na čvoru i zloupotrebiti čvor:
port-forward
Ova dozvola omogućava prosleđivanje jednog lokalnog porta na jedan port u određenom podu. Ovo je namenjeno kako bi se omogućilo lako otklanjanje grešaka aplikacija koje se izvršavaju unutar poda, ali napadač može zloupotrebiti ovo kako bi dobio pristup zanimljivim (kao što su baze podataka) ili ranjivim aplikacijama (veb?) unutar poda:
Hostovi sa mogućnošću pisanja /var/log/ bekstvo
Kao što je naznačeno u ovom istraživanju, ako možete pristupiti ili kreirati pod sa hosts /var/log/
direktorijumom montiranim na njega, možete pobegnuti iz kontejnera.
Ovo je uglavnom zato što kada Kube-API pokuša da dobije logove kontejnera (koristeći kubectl logs <pod>
), on zahteva 0.log
fajl poda koristeći /logs/
endpoint Kubelet servisa.
Kubelet servis izlaže /logs/
endpoint koji zapravo izlaže /var/log
fajlsistem kontejnera.
Stoga, napadač sa pristupom pisanja u /var/log/ folder kontejnera može zloupotrebiti ovo ponašanje na 2 načina:
Modifikujući
0.log
fajl svog kontejnera (obično smešten u/var/logs/pods/namespace_pod_uid/container/0.log
) da bude simbolička veza koja pokazuje na/etc/shadow
na primer. Zatim, moći ćete da eksfiltrirate hosts shadow fajl koristeći:
Ako napadač kontroliše bilo koji princip sa dozvolama za čitanje
nodes/log
, može jednostavno kreirati simboličku vezu u/host-mounted/var/log/sym
ka/
, i kada pristupihttps://<gateway>:10250/logs/sym/
biće mu prikazan sadržaj korenskog fajl sistema hosta (menjanje simboličke veze može omogućiti pristup fajlovima).
Laboratorija i automatizovani eksploit mogu se pronaći na https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts
Zaobilazak zaštite samo za čitanje
Ako imate sreće i visoko privilegovani kapacitet CAP_SYS_ADMIN
je dostupan, možete jednostavno ponovo montirati fasciklu kao rw:
Zaobilazak hostPath zaštite u režimu samo za čitanje
Kako je navedeno u ovom istraživanju, moguće je zaobići zaštitu:
Što je trebalo da spreči bekstva poput prethodnih, umesto korišćenja hostPath montaže, koristi PersistentVolume i PersistentVolumeClaim da montira hosts folder u kontejner sa pisanjem pristupa:
Imitiranje privilegovanih naloga
Sa privilegijom imitiranja korisnika, napadač može imitirati privilegovani nalog.
Jednostavno koristite parametar --as=<korisničkoime>
u kubectl
komandi da biste imitirali korisnika, ili --as-group=<grupa>
da biste imitirali grupu:
Ili koristite REST API:
Lista Tajni
Dozvola za listanje tajni može omogućiti napadaču da zapravo pročita tajne pristupajući REST API endpointu:
Čitanje tajne - grubo otkrivanje token ID-ova
Iako napadač koji poseduje token sa dozvolama za čitanje zahteva tačno ime tajne da bi je koristio, za razliku od šire privilegije listanje tajni, i dalje postoje ranjivosti. Podrazumevani servisni nalozi u sistemu mogu biti nabrojani, svaki povezan sa tajnom. Ove tajne imaju strukturu imena: statički prefiks praćen slučajnim alfanumeričkim tokenom od pet karaktera (isključujući određene karaktere) prema izvornom kodu.
Token se generiše iz ograničenog skupa od 27 karaktera (bcdfghjklmnpqrstvwxz2456789
), umesto punog alfanumeričkog opsega. Ovo ograničenje smanjuje ukupan mogući broj kombinacija na 14.348.907 (27^5). Stoga, napadač bi mogao izvoditi grubo sile napade da bi dedukovao token u pitanju u roku od nekoliko sati, što potencijalno može dovesti do eskalacije privilegija pristupom osetljivim servisnim nalozima.
Zahtevi za potpisivanje sertifikata
Ako imate glagole create
u resursu certificatesigningrequests
(ili bar u certificatesigningrequests/nodeClient
). Možete kreirati novi CeSR za novi čvor.
Prema dokumentaciji moguće je automatski odobriti ove zahteve, tako da u tom slučaju ne trebate dodatne dozvole. U suprotnom, morali biste biti u mogućnosti da odobrite zahtev, što podrazumeva ažuriranje u certificatesigningrequests/approval
i approve
u signers
sa resursnim imenom <signerNameDomain>/<signerNamePath>
ili <signerNameDomain>/*
Primer uloge sa svim potrebnim dozvolama je:
Dakle, sa odobrenim novim CSR-om čvora, možete zloupotrebiti posebne dozvole čvorova da ukradete tajne i dignete privilegije.
U ovom postu i ovom GKE K8s TLS Bootstrap konfiguracija je podešena sa automatskim potpisivanjem i zloupotrebljena je za generisanje akreditiva novog K8s čvora, a zatim zloupotrebljena za podizanje privilegija krađom tajni. Ako imate pomenute privilegije, možete uraditi istu stvar. Imajte na umu da prvi primer zaobilazi grešku koja sprečava novi čvor da pristupi tajnama unutar kontejnera jer čvor može pristupiti samo tajnama kontejnera montiranih na njemu.
Način zaobiđavanja ovoga je jednostavno kreiranje akreditiva čvora za ime čvora na kojem je montiran kontejner sa zanimljivim tajnama (ali proverite kako to uraditi u prvom postu):
AWS EKS aws-auth configmaps
Principali koji mogu izmeniti configmaps
u kube-system namespace-u na EKS (mora biti u AWS) klasterima mogu dobiti privilegije administratorskog klastera tako što će prepisati aws-auth configmapu.
Potrebni glagoli su update
i patch
, ili create
ako configmap nije kreiran:
Možete koristiti aws-auth
za upornost dajući pristup korisnicima iz drugih naloga.
Međutim, aws --profile other_account eks update-kubeconfig --name <cluster-name>
ne radi iz drugog naloga. Ali zapravo aws --profile other_account eks get-token --cluster-name arn:aws:eks:us-east-1:123456789098:cluster/Testing
radi ako stavite ARN klastera umesto samo imena.
Da biste omogućili rad kubectl
-a, samo se pobrinite da konfigurišete kubeconfig žrtve i u aws exec argumente dodajte --profile other_account_role
tako da će kubectl koristiti profil drugog naloga za dobijanje tokena i kontaktiranje AWS-a.
Eskalacija u GKE
Postoje 2 načina dodeljivanja K8s dozvola GCP principima. U svakom slučaju, princip takođe mora imati dozvolu container.clusters.get
kako bi mogao prikupiti akreditive za pristup klasteru, ili ćete morati generisati svoju kubectl konfiguracionu datoteku (pratite sledeći link).
Kada razgovarate sa K8s API endpointom, GCP auth token će biti poslat. Zatim, GCP, putem K8s API endpointa, prvo će proveriti da li princip (po e-pošti) ima bilo kakav pristup unutar klastera, a zatim će proveriti da li ima bilo kakav pristup putem GCP IAM. Ako je bilo koji od njih istinit, biće odgovoren. Ako nije, biće prikazana greška koja sugeriše da se daju dozvole putem GCP IAM.
Zatim, prvi metod je korišćenje GCP IAM, K8s dozvole imaju svoje ekvivalentne GCP IAM dozvole, i ako princip to ima, moći će da ih koristi.
GCP - Container PrivescDrugi metod je dodeljivanje K8s dozvola unutar klastera identifikujući korisnika po njegovoj e-pošti (uključeni su GCP servisni nalozi).
Kreirajte token za servisne naloge
Principali koji mogu kreirati TokenRequests (serviceaccounts/token
) Kada razgovaraju sa K8s API endpointom SAs (informacije sa ovde).
ephemeralcontainers
Principali koji mogu ažurirati
ili popraviti
pods/ephemeralcontainers
mogu dobiti izvršenje koda na drugim podovima, i potencijalno izaći na svoj čvor dodavanjem ephemeralnog kontejnera sa privilegovanim securityContext-om
ValidatingWebhookConfigurations ili MutatingWebhookConfigurations
Principali sa bilo kojim glagolima create
, update
ili patch
nad validatingwebhookconfigurations
ili mutatingwebhookconfigurations
možda mogu kreirati jednu od takvih webhook konfiguracija kako bi mogli eskivirati privilegije.
Za mutatingwebhookconfigurations
primer pogledajte ovaj odeljak ovog posta.
Eskalacija
Kao što možete pročitati u sledećem odeljku: Ugrađena prevencija eskalacije privilegija, princip ne može ažurirati niti kreirati uloge ili clusterroles bez posedovanja tih novih dozvola. Osim ako ima glagol escalate
nad roles
ili clusterroles
.
Tada može ažurirati/kreirati nove uloge, clusterroles sa boljim dozvolama od onih koje već ima.
Čvorovi proxy
Principali sa pristupom nodes/proxy
podresursu mogu izvršiti kod na podovima putem Kubelet API-ja (prema ovde). Više informacija o Kubelet autentifikaciji na ovoj stranici:
Imate primer kako dobiti RCE razgovarajući ovlašćeno sa Kubelet API-jem ovde.
Brisanje podova + nepostavljivi čvorovi
Principali koji mogu brisati podove (delete
glagol nad resursom pods
), ili izbaciti podove (create
glagol nad resursom pods/eviction
), ili promeniti status poda (pristup pods/status
) i mogu učiniti druge čvorove nepostavljivim (pristup nodes/status
) ili brisati čvorove (delete
glagol nad resursom nodes
) i imaju kontrolu nad podom, mogu ukrasti podove sa drugih čvorova tako da se izvrše u kompromitovanom čvoru i napadač može ukrasti tokene sa tih podova.
Status usluga (CVE-2020-8554)
Principali koji mogu izmeniti services/status
mogu postaviti polje status.loadBalancer.ingress.ip
kako bi iskoristili neispravljeni CVE-2020-8554 i pokrenuli MiTM napade na klaster. Većina mitigacija za CVE-2020-8554 sprečava samo usluge sa spoljnim IP adresama (prema ovome).
Status čvorova i podova
Principali sa dozvolama za update
ili patch
nad nodes/status
ili pods/status
, mogu izmeniti oznake da bi uticali na ograničenja raspoređivanja.
Ugrađena prevencija privilegovanog eskaliranja
Kubernetes ima ugrađeni mehanizam za sprečavanje privilegovanog eskaliranja.
Ovaj sistem osigurava da korisnici ne mogu povećati svoje privilegije izmenom uloga ili vezivanjem uloga. Sprovođenje ove pravila se dešava na nivou API-ja, pružajući zaštitu čak i kada je RBAC autorizator neaktivan.
Pravilo propisuje da korisnik može samo kreirati ili ažurirati ulogu ako poseduje sve dozvole koje uloga obuhvata. Štaviše, opseg postojećih dozvola korisnika mora se poklapati sa onim što obuhvata uloga koju pokušava da kreira ili izmeni: ili na nivou klastera za ClusterRoles ili ograničeno na isti namespace (ili na nivou klastera) za Roles.
Postoji izuzetak od prethodnog pravila. Ako principali ima glagol escalate
nad roles
ili clusterroles
može povećati privilegije uloga i clusterroles čak i bez posedovanja dozvola.
Dobijanje & Ažuriranje RoleBindings/ClusterRoleBindings
Očigledno je da je ova tehnika funkcionisala ranije, ali prema mojim testovima više ne funkcioniše iz istog razloga objašnjenog u prethodnom odeljku. Ne možete kreirati/izmeniti rolebinding da biste sebi ili drugom SA dali privilegije ako ih već nemate.
Privilegija za kreiranje Rolebindings omogućava korisniku da vezuje uloge za servisni nalog. Ova privilegija potencijalno može dovesti do privilegovanog eskaliranja jer omogućava korisniku da veže administratorske privilegije za kompromitovani servisni nalog.
Ostali napadi
Aplikacija za sporedni proxy
Podrazumevano, nema enkripcije u komunikaciji između podova. Međusobna autentikacija, dvosmerna, od poda do poda.
Kreiranje aplikacije za sporedni proxy
Kreirajte svoj .yaml
Uredite svoj .yaml i dodajte nekomentarisane linije:
Pogledajte dnevnike proxy servera:
Više informacija na: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
Zlonamerni kontroler prijema
Kontroler prijema interceptuje zahteve ka Kubernetes API serveru pre trajnog čuvanja objekta, ali nakon što je zahtev autentifikovan i autorizovan.
Ako napadač na neki način uspe da ubaci kontroler prijema mutacija, biće u mogućnosti da modifikuje već autentifikovane zahteve. Time može potencijalno da ostvari privilegije i češće da se trajno zadrži u klasteru.
Primer sa https://blog.rewanthtammana.com/creating-malicious-admission-controllers:
Proverite status da biste videli da li je spreman:
Zatim implementirajte novi pod:
Kada vidite grešku ErrImagePull
, proverite ime slike pomoću bilo kog od sledećih upita:
Kao što možete videti na gornjoj slici, pokušali smo pokrenuti sliku nginx
, ali krajnja izvršena slika je rewanthtammana/malicious-image
. Šta se upravo desilo!!?
Tehnički detalji
Skripta ./deploy.sh
uspostavlja mutating webhook admission kontroler, koji modifikuje zahteve ka Kubernetes API-ju kako je navedeno u svojim konfiguracionim linijama, utičući na posmatrane rezultate:
Gornji isječak zamjenjuje sliku prvog kontejnera u svakom podu sa rewanthtammana/malicious-image
.
Bypass OPA Gatekeeper
Kubernetes - OPA Gatekeeper bypassNajbolje prakse
Onemogućavanje automatskog montiranja tokena servisnog naloga
Podovi i servisni nalozi: Podovi automatski montiraju token servisnog naloga. Da biste poboljšali sigurnost, Kubernetes omogućava onemogućavanje ove funkcije automatskog montiranja.
Kako primeniti: Postavite
automountServiceAccountToken: false
u konfiguraciji servisnih naloga ili podova počevši od verzije Kubernetes 1.6.
Restriktivno dodeljivanje korisnika u RoleBindings/ClusterRoleBindings
Selektivno uključivanje: Osigurajte da su u RoleBindings ili ClusterRoleBindings uključeni samo neophodni korisnici. Redovno vršite reviziju i uklanjajte irelevantne korisnike kako biste održali visok nivo sigurnosti.
Role specifične za prostor imena umesto globalnih uloga
Role vs. ClusterRoles: Preporučuje se korišćenje uloga i RoleBindings za dozvole specifične za prostor imena umesto ClusterRoles i ClusterRoleBindings, koji se primenjuju globalno. Ovaj pristup nudi precizniju kontrolu i ograničava obim dozvola.
Koristite automatizovane alate
Reference
Last updated