Ja runa nav tikai par Kubernetes ievainojamību...
PiezÄ«me. tulk.: Ŕī raksta autori detalizÄti stÄsta par to, kÄ viÅiem izdevÄs atklÄt ievainojamÄ«bu CVE-2020-8555 in Kubernetes. Lai gan sÄkotnÄji tas neŔķita Ä«paÅ”i bÄ«stams, kombinÄcijÄ ar citiem faktoriem tÄ kritiskums dažiem mÄkoÅa pakalpojumu sniedzÄjiem izrÄdÄ«jÄs maksimÄlais. VairÄkas organizÄcijas dÄsni apbalvoja speciÄlistus par ieguldÄ«to darbu.
Kas mÄs esam
MÄs esam divi franÄu droŔības pÄtnieki, kuri kopÄ«gi atklÄja ievainojamÄ«bu Kubernetes. MÅ«su vÄrdi ir Brice Augras un Christophe Hauquiert, bet daudzÄs Bug Bounty platformÄs mÄs esam attiecÄ«gi pazÄ«stami kÄ Reeverzax un Hach:
Å is raksts ir mÅ«su veids, kÄ pastÄstÄ«t, kÄ parasts pÄtniecÄ«bas projekts negaidÄ«ti izvÄrtÄs par aizraujoÅ”Äko piedzÄ«vojumu kļūdu mednieku dzÄ«vÄ (vismaz pagaidÄm).
KÄ jÅ«s droÅ”i vien zinÄt, kļūdu medniekiem ir dažas ievÄrojamas funkcijas:
viÅi dzÄ«vo no picas un alus;
viÅi strÄdÄ, kad visi pÄrÄjie guļ.
MÄs neesam izÅÄmums no Å”iem noteikumiem: mÄs parasti tiekamies nedÄļas nogalÄs un pavadÄm bezmiega naktis, uzlaužot. TaÄu viena no Ŕīm naktÄ«m beidzÄs ļoti neparasti.
SÄkotnÄji mÄs plÄnojÄm tikties, lai pÄrrunÄtu dalÄ«bu CTF nÄkoÅ”ajÄ dienÄ. Sarunas laikÄ par Kubernetes droŔību pÄrvaldÄ«tÄ servisa vidÄ atcerÄjÄmies veco ideju par SSRF (Servera puses pieprasÄ«juma viltoÅ”ana) un nolÄma mÄÄ£inÄt to izmantot kÄ uzbrukuma skriptu.
11:XNUMX mÄs apsÄdÄmies, lai veiktu pÄtÄ«jumu un agri no rÄ«ta devÄmies gulÄt, ļoti apmierinÄti ar rezultÄtiem. TieÅ”i Ŕī pÄtÄ«juma dÄļ mÄs saskÄrÄmies ar MSRC Bug Bounty programmu un nonÄcÄm pie privilÄÄ£iju eskalÄcijas izmantoÅ”anas.
PagÄja vairÄkas nedÄļas/mÄneÅ”i, un mÅ«su negaidÄ«tais rezultÄts bija viens no augstÄkajiem balvÄm Azure Cloud Bug Bounty vÄsturÄ - papildus tai, ko saÅÄmÄm no Kubernetes!
Pamatojoties uz mÅ«su pÄtniecÄ«bas projektu, Kubernetes produktu droŔības komiteja publicÄja CVE-2020-8555.
Tagad vÄlos pÄc iespÄjas plaÅ”Äk izplatÄ«t informÄciju par atrasto ievainojamÄ«bu. MÄs ceram, ka novÄrtÄsiet atradumu un dalÄ«sieties tehniskajÄ detaÄ¼Ä ar citiem infosec kopienas dalÄ«bniekiem!
TÄtad, lÅ«k, mÅ«su stÄsts...
Konteksts
Lai pÄc iespÄjas labÄk saprastu notikuÅ”o, vispirms apskatÄ«sim, kÄ Kubernetes darbojas mÄkoÅa pÄrvaldÄ«tÄ vidÄ.
Kad Å”ÄdÄ vidÄ izveidojat Kubernetes klasteru, par pÄrvaldÄ«bas slÄni parasti atbild mÄkoÅpakalpojumu sniedzÄjs.
Kontroles slÄnis atrodas mÄkoÅa nodroÅ”inÄtÄja perimetrÄ, savukÄrt Kubernetes mezgli atrodas klienta perimetrÄ
Lai dinamiski pieŔķirtu apjomus, tiek izmantots mehÄnisms, kas tos dinamiski nodroÅ”ina no ÄrÄjÄs krÄtuves aizmugursistÄmas un salÄ«dzina ar PVC (pastÄvÄ«ga apjoma pretenzija, t.i., sÄjuma pieprasÄ«jums).
TÄdÄjÄdi pÄc tam, kad PVC ir izveidots un saistÄ«ts ar StorageClass K8s klasterÄ«, turpmÄkÄs darbÄ«bas, lai nodroÅ”inÄtu skaļumu, pÄrÅem kube/mÄkoÅa kontrollera pÄrvaldnieks (tÄ precÄ«zais nosaukums ir atkarÄ«gs no izlaiduma). (PiezÄ«me. tulk.: MÄs jau rakstÄ«jÄm vairÄk par CCM, izmantojot tÄ ievieÅ”anas piemÄru vienam no mÄkoÅpakalpojumu sniedzÄjiem Å”eit.)
Ir vairÄki nodroÅ”inÄtÄju veidi, kurus atbalsta Kubernetes: lielÄkÄ daļa no tiem ir iekļauti orÄ·estratora kodols, savukÄrt citus pÄrvalda papildu nodroÅ”inÄtÄji, kas ir ievietoti klastera apvidos.
MÅ«su pÄtÄ«jumÄ mÄs koncentrÄjÄmies uz iekÅ”Äjo apjoma nodroÅ”inÄÅ”anas mehÄnismu, kas ir parÄdÄ«ts zemÄk:
SÄjumu dinamiska nodroÅ”inÄÅ”ana, izmantojot iebÅ«vÄto Kubernetes nodroÅ”inÄtÄju
ÄŖsÄk sakot, kad Kubernetes tiek izvietots pÄrvaldÄ«tÄ vidÄ, kontroliera pÄrvaldnieks ir mÄkoÅpakalpojuma sniedzÄja atbildÄ«ba, bet apjoma izveides pieprasÄ«jums (numurs 3 diagrammÄ iepriekÅ”) atstÄj mÄkoÅa nodroÅ”inÄtÄja iekÅ”Äjo tÄ«klu. Un Å”eit lietas kļūst patieÅ”Äm interesantas!
DatorurÄ·ÄÅ”anas scenÄrijs
Å ajÄ sadaÄ¼Ä mÄs paskaidrosim, kÄ mÄs izmantojÄm iepriekÅ” minÄtÄs darbplÅ«smas priekÅ”rocÄ«bas un piekļuvÄm mÄkoÅpakalpojumu sniedzÄja iekÅ”Äjiem resursiem. Tas arÄ« parÄdÄ«s, kÄ varat veikt noteiktas darbÄ«bas, piemÄram, iegÅ«t iekÅ”Äjos akreditÄcijas datus vai palielinÄt privilÄÄ£ijas.
Viena vienkÄrÅ”a manipulÄcija (Å”ajÄ gadÄ«jumÄ Service Side Request Forgery) palÄ«dzÄja iziet Ärpus klienta vides, veidojot dažÄdu pakalpojumu sniedzÄju klasterus pÄrvaldÄ«tajos K8.
MÅ«su pÄtÄ«jumÄ mÄs koncentrÄjÄmies uz GlusterFS nodroÅ”inÄtÄju. Neskatoties uz to, ka Å”ajÄ kontekstÄ ir aprakstÄ«ta turpmÄkÄ darbÄ«bu secÄ«ba, Quobyte, StorageOS un ScaleIO ir pakļauti vienai un tai paÅ”ai ievainojamÄ«bai.
GlabÄÅ”anas klases analÄ«zes laikÄ GlusterFS Golang klienta pirmkodÄ mÄs pamanÄ«jupirmajÄ HTTP pieprasÄ«jumÄ (3), kas nosÅ«tÄ«ts sÄjuma izveides laikÄ, lÄ«dz parametra pielÄgotÄ URL beigÄm resturl ir pievienots /volumes.
MÄs nolÄmÄm atbrÄ«voties no Ŕī papildu ceļa, pievienojot # parametrÄ resturl. Å Ä« ir pirmÄ YAML konfigurÄcija, ko izmantojÄm, lai pÄrbaudÄ«tu daļÄji aklu SSRF ievainojamÄ«bu (jÅ«s varat lasÄ«t vairÄk par daļÄji aklu vai pusaklu SSRF, piemÄram, Å”eit ā apm. tulk.):
PÄc tam mÄs izmantojÄm binÄro failu, lai attÄlinÄti pÄrvaldÄ«tu Kubernetes klasteru kubectl. Parasti mÄkoÅa pakalpojumu sniedzÄji (Azure, Google, AWS utt.) ļauj iegÅ«t akreditÄcijas datus lietoÅ”anai Å”ajÄ utilÄ«tprogrammÄ.
Pateicoties tam, es varÄju izmantot savu āÄ«paÅ”oā failu. Kube-controller-manager izpildÄ«ja iegÅ«to HTTP pieprasÄ«jumu:
kubectl create -f sc-poc.yaml
Atbilde no uzbrucÄja viedokļa
Neilgi pÄc tam mÄs arÄ« varÄjÄm saÅemt HTTP atbildi no mÄrÄ·a servera, izmantojot komandas describe pvc vai get events in kubectl. Un patieÅ”Äm: Å”is noklusÄjuma Kubernetes draiveris savos brÄ«dinÄjumos/kļūdu ziÅojumos ir pÄrÄk precÄ«zs...
Å eit ir piemÄrs ar saiti uz https://www.google.friestatÄ«t kÄ parametru resturl:
Å ajÄ pieejÄ mÄs aprobežojÄmies ar tÄdiem vaicÄjumiem kÄ HTTP POST un nevarÄja iegÅ«t atbildes pamatteksta saturu, ja atgrieÅ”anas kods bija 201. TÄpÄc mÄs nolÄmÄm veikt papildu izpÄti un paplaÅ”inÄjÄm Å”o uzlauÅ”anas scenÄriju ar jaunÄm pieejÄm.
MÅ«su pÄtÄ«juma attÄ«stÄ«ba
1. izvÄrstais scenÄrijs: 302. novirzÄ«Å”anas izmantoÅ”ana no ÄrÄja servera, lai mainÄ«tu HTTP metodi, lai nodroÅ”inÄtu elastÄ«gÄku iekÅ”Äjo datu vÄkÅ”anas veidu.
2. izvÄrstais scenÄrijs: automatizÄjiet LAN skenÄÅ”anu un iekÅ”Äjo resursu atraÅ”anu.
3. izvÄrsts scenÄrijs: HTTP CRLF + kontrabandas izmantoÅ”ana (āpieprasÄ«juma kontrabandaā), lai izveidotu pielÄgotus HTTP pieprasÄ«jumus un izgÅ«tu datus, kas iegÅ«ti no kube kontrollera žurnÄliem.
TehniskÄs specifikÄcijas
PÄtÄ«jumÄ tika izmantots Azure Kubernetes pakalpojums (AKS) ar Kubernetes versiju 1.12 Ziemeļeiropas reÄ£ionÄ.
IepriekÅ” aprakstÄ«tie scenÄriji tika izpildÄ«ti jaunÄkajos Kubernetes laidienos, izÅemot treÅ”o scenÄriju, jo viÅam vajadzÄja Kubernetes, kas uzbÅ«vÄts ar Golang versiju ā¤ 1.12.
1. izvÄrstais scenÄrijs: HTTP POST pieprasÄ«juma novirzÄ«Å”ana uz GET un sensitÄ«vu datu saÅemÅ”ana
SÄkotnÄjÄ metode tika uzlabota ar uzbrucÄja servera konfigurÄciju, lai atgrieztos 302 HTTP Retcodelai pÄrvÄrstu POST pieprasÄ«jumu par GET pieprasÄ«jumu (diagrammas 4. darbÄ«ba):
Pirmais pieprasÄ«jums (3) nÄk no klienta GlusterFS (Controller Manager), ir POST tips. Veicot Ŕīs darbÄ«bas, mÄs to varÄjÄm pÄrvÄrst par GET:
KÄ parametrs resturl StorageClass tas ir norÄdÄ«ts http://attacker.com/redirect.php.
Beigu punkts https://attacker.com/redirect.php atbild ar 302 HTTP statusa kodu ar Å”Ädu atraÅ”anÄs vietas galveni: http://169.254.169.254. Tas var bÅ«t jebkurÅ” cits iekÅ”Äjais resurss - Å”ajÄ gadÄ«jumÄ novirzÄ«Å”anas saite tiek izmantota tikai kÄ piemÄrs.
PÄc noklusÄjuma net/http bibliotÄka Golang novirza pieprasÄ«jumu un pÄrvÄrÅ” POST par GET ar statusa kodu 302, kÄ rezultÄtÄ tiek nosÅ«tÄ«ts HTTP GET pieprasÄ«jums mÄrÄ·a resursam.
Lai izlasÄ«tu HTTP atbildes pamattekstu, kas jums jÄdara describe PVC objekts:
kubectl describe pvc xxx
Å is ir HTTP atbildes piemÄrs JSON formÄtÄ, ko varÄjÄm saÅemt:
AtrastÄs ievainojamÄ«bas iespÄjas tajÄ laikÄ bija ierobežotas Å”Ädu punktu dÄļ:
NespÄja izpildÄ«t POST pieprasÄ«jumu ar parametriem pamattekstÄ (tas ir Ärti pieprasÄ«t atslÄgas vÄrtÄ«bu no etcd instances, kas darbojas 2379 ports, ja tiek izmantots neÅ”ifrÄts HTTP).
NespÄja izgÅ«t atbildes pamatteksta saturu, ja statusa kods bija 200 un atbildei nebija JSON satura tipa.
PÄc tam Ŕī pusaklÄ SSRF metode tika izmantota, lai, pamatojoties uz atbildÄm, skenÄtu mÄkoÅpakalpojumu sniedzÄja iekÅ”Äjo tÄ«klu un aptaujÄtu dažÄdus klausÄ«Å”anÄs pakalpojumus (metadatu instance, Kubelet utt.). kube kontrolieris.
Vispirms tika noteikti Kubernetes komponentu standarta klausÄ«Å”anÄs porti (8443, 10250, 10251 utt.), un pÄc tam mums bija jÄautomatizÄ skenÄÅ”anas process.
Redzot, ka Ŕī resursu skenÄÅ”anas metode ir ļoti specifiska un nav saderÄ«ga ar klasiskajiem skeneriem un SSRF rÄ«kiem, mÄs nolÄmÄm izveidot savus darbiniekus bash skriptÄ, kas automatizÄ visu procesu.
PiemÄram, lai Ätri skenÄtu iekÅ”ÄjÄ tÄ«kla diapazonu 172.16.0.0/12, paralÄli tika palaisti 15 darbinieki. IepriekÅ” minÄtais IP diapazons ir izvÄlÄts tikai kÄ piemÄrs un var tikt mainÄ«ts atkarÄ«bÄ no jÅ«su konkrÄtÄ pakalpojumu sniedzÄja IP diapazona.
Lai skenÄtu vienu IP adresi un vienu portu, jums jÄveic Å”Ädas darbÄ«bas:
Ja papildus tam pakalpojumu sniedzÄjs klientiem piedÄvÄja vecÄs K8s klastera versijas Šø deva viÅiem piekļuvi kube-controller-manager žurnÄliem, efekts kļuva vÄl nozÄ«mÄ«gÄks.
UzbrucÄjam patieÅ”Äm ir daudz ÄrtÄk mainÄ«t HTTP pieprasÄ«jumus, kas paredzÄti, lai pÄc saviem ieskatiem iegÅ«tu pilnu HTTP atbildi.
Lai Ä«stenotu pÄdÄjo scenÄriju, bija jÄizpilda Å”Ädi nosacÄ«jumi:
LietotÄjam ir jÄbÅ«t piekļuvei kube-controller-manager žurnÄliem (kÄ, piemÄram, Azure LogInsights).
Kubernetes klasterim ir jÄizmanto Golang versija, kas ir vecÄka par 1.12.
MÄs izvietojÄm lokÄlo vidi, kas simulÄja komunikÄciju starp GlusterFS Go klientu un viltotu mÄrÄ·a serveri (mÄs pagaidÄm atturÄsimies no PoC publicÄÅ”anas).
Tika atrasts ievainojamÄ«ba, kas ietekmÄ Golang versijas, kas ir vecÄkas par 1.12, un ļauj hakeriem veikt HTTP kontrabandas/CRLF uzbrukumus.
Apvienojot iepriekÅ” aprakstÄ«to pusaklo SSRF Š²Š¼ŠµŃŃŠµ ar to mÄs varÄjÄm nosÅ«tÄ«t pieprasÄ«jumus pÄc saviem ieskatiem, tostarp nomainÄ«t galvenes, HTTP metodi, parametrus un datus, kurus pÄc tam apstrÄdÄja kube kontroliera pÄrvaldnieks.
Å eit ir parÄdÄ«ts parametrÄ strÄdÄjoÅ”as āÄsmasā piemÄrs resturl StorageClass, kas Ä«steno lÄ«dzÄ«gu uzbrukuma scenÄriju:
RezultÄts ir kļūda nevÄlama atbilde, ziÅojums par kuru tiek ierakstÄ«ts kontrollera žurnÄlos. Pateicoties pÄc noklusÄjuma iespÄjotai daudzvÄrdÄ«bai, tur tiek saglabÄts arÄ« HTTP atbildes ziÅojuma saturs.
Å Ä« bija mÅ«su visefektÄ«vÄkÄ āÄsmaā koncepcijas pierÄdÄ«juma ietvaros.
Izmantojot Å”o pieeju, mÄs varÄjÄm veikt dažus no Å”iem uzbrukumiem dažÄdu pÄrvaldÄ«tu k8s nodroÅ”inÄtÄju klasteriem: privilÄÄ£iju eskalÄcija ar akreditÄcijas datiem metadatu gadÄ«jumos, galvenais DoS, izmantojot (neÅ”ifrÄtus) HTTP pieprasÄ«jumus etcd galvenajos gadÄ«jumos utt.
efekti
Kubernetes oficiÄlajÄ paziÅojumÄ par mÅ«su atklÄto SSRF ievainojamÄ«bu tÄ tika novÄrtÄta CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Ja Åemam vÄrÄ tikai ievainojamÄ«bu, kas saistÄ«ta ar Kubernetes perimetru, integritÄtes vektoru (integritÄtes vektors) tas kvalificÄjas kÄ neviens.
TomÄr, novÄrtÄjot iespÄjamÄs sekas pÄrvaldÄ«tas pakalpojumu vides kontekstÄ (un Ŕī bija mÅ«su pÄtÄ«juma visinteresantÄkÄ daļa!), mÅ«s mudinÄja pÄrklasificÄt ievainojamÄ«bu par vÄrtÄjumu. Kritiskais CVSS10/10 daudziem izplatÄ«tÄjiem.
TÄlÄk ir sniegta papildu informÄcija, kas palÄ«dzÄs jums izprast mÅ«su apsvÄrumus, novÄrtÄjot iespÄjamo ietekmi mÄkoÅa vidÄ.
IntegritÄte
Izpildiet komandas attÄlinÄti, izmantojot iegÅ«tos iekÅ”Äjos akreditÄcijas datus.
IepriekÅ” minÄtÄ scenÄrija reproducÄÅ”ana, izmantojot metodi IDOR (nedroÅ”a tieÅ”Ä objekta atsauce) ar citiem resursiem, kas atrodami vietÄjÄ tÄ«klÄ.
KonfidencialitÄte
Uzbrukuma veids SÄnu kustÄ«ba pateicoties mÄkoÅa akreditÄcijas datu zÄdzÄ«bai (piemÄram, metadatu API).
Apkopojiet informÄciju par gadÄ«jumu un infrastruktÅ«ru, aptaujÄjot iekÅ”ÄjÄs API, piemÄram, metadatu API (http://169.254.169.254,ā¦).
Klientu datu zagÅ”ana, izmantojot mÄkoÅa akreditÄcijas datus.
Pieejamība
Visi ekspluatÄcijas scenÄriji, kas saistÄ«ti ar uzbrukuma vektoriem integritÄte, var izmantot destruktÄ«vÄm darbÄ«bÄm un novest pie tÄ, ka galvenÄs instances no klienta perimetra (vai jebkura cita) nav pieejamas.
TÄ kÄ mÄs atradÄmies pÄrvaldÄ«tÄ K8 vidÄ un novÄrtÄjÄm ietekmi uz integritÄti, varam iedomÄties daudzus scenÄrijus, kas varÄtu ietekmÄt pieejamÄ«bu. Papildu piemÄri ietver etcd datu bÄzes sabojÄÅ”anu vai kritisku Kubernetes API izsaukumu.
Laika skala
6. gada 2019. decembris: MSRC Bug Bounty tika ziÅots par ievainojamÄ«bu.
3. gada 2020. janvÄris: treÅ”Ä puse informÄja Kubernetes izstrÄdÄtÄjus, ka mÄs strÄdÄjam pie droŔības problÄmas. Un lÅ«dza viÅus uzskatÄ«t SSRF par iekÅ”Äju (iekÅ”Äjo) ievainojamÄ«bu. PÄc tam mÄs sniedzÄm vispÄrÄ«gu ziÅojumu ar tehnisku informÄciju par problÄmas avotu.
15. gada 2020. janvÄris: mÄs nodroÅ”inÄjÄm tehniskos un vispÄrÄ«gos ziÅojumus Kubernetes izstrÄdÄtÄjiem pÄc viÅu pieprasÄ«juma (izmantojot platformu HackerOne).
15. gada 2020. janvÄris: Kubernetes izstrÄdÄtÄji mÅ«s informÄja, ka pusaklÄ SSRF + CRLF injekcija iepriekÅ”Äjiem laidieniem tiek uzskatÄ«ta par galveno ievainojamÄ«bu. MÄs nekavÄjoties pÄrtraucÄm citu pakalpojumu sniedzÄju perimetru analÄ«zi: K8s komanda tagad nodarbojÄs ar galveno cÄloni.
15. gada 2020. janvÄris: MSRC atlÄ«dzÄ«ba saÅemta, izmantojot HackerOne.
16. gada 2020. janvÄris: Kubernetes PSC (Produktu droŔības komiteja) atzina ievainojamÄ«bu un lÅ«dza to paturÄt noslÄpumÄ lÄ«dz marta vidum, Åemot vÄrÄ lielo potenciÄlo upuru skaitu.
11. gada 2020. februÄris: saÅemta Google VRP atlÄ«dzÄ«ba.
4. gada 2020. marts: Kubernetes atlÄ«dzÄ«ba saÅemta, izmantojot HackerOne.
15. gada 2020. marts: sÄkotnÄji plÄnotÄ publiskoÅ”ana tika atlikta Covid-19 situÄcijas dÄļ.
1. gada 2020. jÅ«nijs: Kubernetes un Microsoft kopÄ«gs paziÅojums par ievainojamÄ«bu.
TL; DR
Dzeram alu un Ädam picu :)
MÄs atklÄjÄm Kubernetes iekÅ”Äjo ievainojamÄ«bu, lai gan mums nebija nodoma to darÄ«t.
MÄs veicÄm papildu analÄ«zi dažÄdu mÄkoÅpakalpojumu sniedzÄju klasteriem un varÄjÄm palielinÄt ievainojamÄ«bas radÄ«to kaitÄjumu, lai saÅemtu papildu satriecoÅ”us bonusus.
Å ajÄ rakstÄ jÅ«s atradÄ«sit daudz tehnisko informÄciju. MÄs labprÄt tos apspriestu ar jums (Twitter: @ReeverZax & @__hach_).
IzrÄdÄ«jÄs, ka visu veidu formalitÄÅ”u kÄrtoÅ”ana un ziÅoÅ”ana prasÄ«ja daudz ilgÄku laiku, nekÄ bija paredzÄts.