Inā ʻaʻole ia e pili ana i nā nāwaliwali o Kubernetes ...
Nānā. unuhi.: nā mea kākau o kēia ʻatikala e kamaʻilio kikoʻī e pili ana i ka hiki ʻana iā lākou ke ʻike i ka nāwaliwali CVE-2020–8555 ma Kubernetes. ʻOiai i ka wā mua ʻaʻole ia he mea weliweli loa, i ka hui pū ʻana me nā mea ʻē aʻe, ua lilo kona koʻikoʻi i mea kiʻekiʻe loa no kekahi mau mea hoʻolako kapua. Nui nā hui i uku nui i nā loea no kā lākou hana.
ʻO wai mākou
ʻElua mākou mau mea noiʻi palekana Farani i ʻike pū i kahi nāwaliwali ma Kubernetes. ʻO ko mākou mau inoa ʻo Brice Augras lāua ʻo Christophe Hauquiert, akā ma nā kahua he nui Bug Bounty ua ʻike ʻia mākou ʻo Reeverzax a me Hach.
ʻO kēia ʻatikala kā mākou ala e kaʻana like ai i ka huli ʻana o kahi papahana noiʻi maʻamau i kahi huakaʻi hoihoi loa i ke ola o nā mea hahai holoholona (ma ka liʻiliʻi loa i kēia manawa).
E like me kāu e ʻike ai, loaʻa i nā mea hahai holoholona kekahi mau hiʻohiʻona kaulana:
noho lākou i ka pizza a me ka pia;
hana lākou i ka wā e hiamoe ana nā mea ʻē aʻe.
ʻAʻole mākou he ʻokoʻa i kēia mau lula: hui pinepine mākou i nā hopena pule a hoʻopau i nā pō hiamoe ʻole. Akā, ua pau kekahi o kēia mau pō ma ke ʻano maʻamau.
I ka wā mua e hele ana mākou e hui e kūkākūkā i ke komo ʻana CTF i ka lā aʻe. I ke kamaʻilio ʻana e pili ana i ka palekana o Kubernetes i kahi ʻoihana lawelawe hoʻokele, hoʻomanaʻo mākou i ka manaʻo kahiko o SSRF (Noi hoopunipuni ma ka aoao kikowaena) a ua hoʻoholo e hoʻohana iā ia ma ke ʻano he palapala hoʻouka.
Ma ka hola 11 pm, noho mākou e hana i kā mākou noiʻi a moe i ke kakahiaka nui, ʻoluʻolu loa i nā hopena. Ma muli o kēia noiʻi ʻana mākou i ʻike ai i ka papahana MSRC Bug Bounty a ua loaʻa iā mākou kahi hana hoʻonui pono.
Ua hala kekahi mau pule a me nā mahina, a ʻo kā mākou hopena i manaʻo ʻole ʻia i loaʻa i kekahi o nā makana kiʻekiʻe loa ma ka mōʻaukala o ka Azure Cloud Bug Bounty - ma kahi o ka mea i loaʻa iā mākou mai Kubernetes!
Ma muli o kā mākou papahana noiʻi, ua paʻi ʻia ke Kōmike Palekana Huahana Kubernetes CVE-2020–8555.
I kēia manawa makemake wau e hoʻolaha i ka ʻike e pili ana i ka nāwaliwali i ʻike ʻia e like me ka hiki. Manaʻo mākou e mahalo ʻoe i ka ʻike a kaʻana like i nā kikoʻī ʻenehana me nā lālā ʻē aʻe o ke kaiāulu infosec!
No laila, eia kā mākou moʻolelo...
Pōʻaiapili
I mea e ʻike pono ai i ka mea i hana ʻia, e nānā mua kākou i ke ʻano o ka hana ʻana o Kubernetes i kahi kaiapuni i mālama ʻia i ke ao.
Ke hoʻomaka koke ʻoe i kahi pūʻulu Kubernetes i kēlā ʻano kaiapuni, ʻo ka papa hoʻokele ke kuleana maʻamau o ka mea hāʻawi kapua:
Aia ka papa hoʻomalu ma ka ʻāpana o ka mea hāʻawi ao, ʻoiai aia nā node Kubernetes ma ka ʻāpana o ka mea kūʻai.
No ka hoʻokaʻawale ikaika ʻana i nā leo, hoʻohana ʻia kahi mīkini e hoʻolako ikaika iā lākou mai kahi hoʻopaʻa ʻana o waho a hoʻohālikelike iā lākou me PVC (ke koi hoʻomau mau, ʻo ia hoʻi he noi no kahi leo).
No laila, ma hope o ka hana ʻia ʻana o ka PVC a hoʻopaʻa ʻia i ka StorageClass i ka hui K8s, lawe ʻia nā hana hou aku e hoʻolako i ka leo e ke kube / cloud controller manager (ʻo kona inoa pololei e pili ana i ka hoʻokuʻu ʻana). (Nānā. unuhi.: Ua kākau mua mākou e pili ana i ka CCM me ka hoʻohana ʻana i ka laʻana o kāna hoʻokō ʻana no kekahi o nā mea hoʻolako kapua maanei.)
Nui nā ʻano mea hoʻolako i kākoʻo ʻia e Kubernetes: ua hoʻokomo ʻia ka hapa nui o lākou kumu orkestra, aʻo nā mea ʻē aʻe e mālama ʻia e nā mea hoʻolako ʻē aʻe i waiho ʻia i loko o nā pods i ka pūʻulu.
I kā mākou noiʻi, ua nānā mākou i ka mīkini hoʻolako volume kūloko, i hōʻike ʻia ma lalo nei:
ʻO ka hoʻolako ʻana i nā puke me ka hoʻohana ʻana i ka mea hoʻolako Kubernetes i kūkulu ʻia
I ka pōkole, ke kau ʻia ʻo Kubernetes i loko o kahi kaiapuni i hoʻokele ʻia, ʻo ka luna hoʻomalu ke kuleana o ka mea hāʻawi kapuaʻi, akā ʻo ka noi hoʻokumu leo (helu 3 ma ka kiʻi ma luna) e haʻalele i ka pūnaewele kūloko o ka mea hāʻawi kapua. A ʻo kēia kahi e hoihoi nui ai nā mea!
Hanana hacking
Ma kēia ʻāpana, e wehewehe mākou pehea mākou i hoʻohana pono ai i ke kaʻina hana i ʻōlelo ʻia ma luna nei a komo i nā kumuwaiwai kūloko o ka mea lawelawe ʻoihana kapua. E hōʻike pū ia iā ʻoe pehea e hiki ai iā ʻoe ke hana i kekahi mau hana, e like me ka loaʻa ʻana o nā hōʻoia kūloko a i ʻole ka piʻi ʻana o nā pono.
Hoʻokahi hana maʻalahi (ma kēia hihia, Service Side Request Forgery) i kōkua i ka hele ʻana ma waho o ke kaiapuni o ka mea kūʻai aku i loko o nā pūʻulu o nā mea lawelawe like ʻole ma lalo o nā K8 hoʻokele.
I kā mākou noiʻi ʻana ua kālele mākou i ka mea hoʻolako GlusterFS. ʻOiai ʻo ka wehewehe ʻana i ke kaʻina hana hou aʻe i kēia pōʻaiapili, hiki i ka Quobyte, StorageOS a me ScaleIO ke maʻalahi i ka nāwaliwali like.
Hoʻohana ʻino i ka mīkini hoʻolako leo ikaika
I ka wā o ka hoʻopaʻa ʻana papa GlusterFS i ka Golang client source code mākou ʻike ʻiama ka noi HTTP mua (3) i hoʻouna ʻia i ka wā o ka hoʻokumu ʻana i ka leo, i ka hopena o ka URL maʻamau i ka ʻāpana resturl hoʻohui ʻia /volumes.
Ua hoʻoholo mākou e kāpae i kēia ala hou ma ka hoʻohui ʻana # ma ka palena resturl. Eia ka hoʻonohonoho YAML mua a mākou i hoʻohana ai e hoʻāʻo no kahi nāwaliwali SSRF semi-makapō (hiki iā ʻoe ke heluhelu hou aʻe e pili ana i ka SSRF semi-makapō a hapa makapō paha, no ka laʻana, maanei - kokoke. unuhi.):
A laila hoʻohana mākou i ka binary e hoʻokele mamao i ka pūʻulu Kubernetes kubectl. ʻO ka maʻamau, ʻae nā mea hoʻolako kapua (Azure, Google, AWS, etc.) iā ʻoe e kiʻi i nā hōʻoia no ka hoʻohana ʻana i kēia pono.
Mahalo i kēia, ua hiki iaʻu ke hoʻohana i kaʻu faila "kūikawā". Ua hoʻokō ʻo Kube-controller-manager i ka hopena HTTP noi:
kubectl create -f sc-poc.yaml
ʻO ka pane mai ka manaʻo o ka mea hoʻouka
Ma hope koke iho o kēia, ua hiki nō iā mākou ke loaʻa i kahi pane HTTP mai ka server i hoʻopaʻa ʻia - ma o nā kauoha describe pvc ai ole ia, get events i kubectl. A ʻoiaʻiʻo: ʻo kēia mea hoʻokele Kubernetes paʻamau i ʻōlelo ʻole ʻia i kāna mau ʻōlelo aʻo / hewa ...
Eia kekahi laʻana me kahi loulou i https://www.google.frhoʻonoho ʻia ma ke ʻano he ʻāpana resturl:
kubectl describe pvc poc-ssrf
# или же можете воспользоваться kubectl get events
Ma kēia ala, ua kaupalena ʻia mākou i nā nīnau like HTTP POST a ʻaʻole hiki ke loaʻa nā mea i loko o ke kino pane inā ʻo ke code hoʻihoʻi 201. No laila, ua hoʻoholo mākou e hana i nā noiʻi hou aʻe a hoʻonui i kēia hiʻohiʻona hacking me nā ala hou.
ʻO ka ulu ʻana o kā mākou noiʻi
Kūlana Kiʻekiʻe #1: Ke hoʻohana nei i kahi 302 redirect mai kahi kikowaena waho e hoʻololi i ke ala HTTP e hāʻawi i kahi ala maʻalahi e hōʻiliʻili i ka ʻikepili kūloko.
Kūlana Kiʻekiʻe #2: Hoʻokaʻawale i ka nānā ʻana i ka LAN a me ka ʻike waiwai kūloko.
Hōʻike kūlana kiʻekiʻe #3: me ka hoʻohana ʻana i ka HTTP CRLF + smuggling ("noi smuggling") e hana i nā noi HTTP kūpono a kiʻi i ka ʻikepili i unuhi ʻia mai nā lāʻau kube-controller.
Nā Kūlana ʻenehana
Ua hoʻohana ka noiʻi iā Azure Kubernetes Service (AKS) me Kubernetes version 1.12 ma ka ʻāina ʻo ʻEulopa ʻĀkau.
Ua hoʻokō ʻia nā hiʻohiʻona i hōʻike ʻia ma luna ma nā mea hou loa o Kubernetes, koe naʻe ke kolu o ke ʻano, no ka mea pono ʻo ia i kūkulu ʻia nā Kubernetes me ka mana Golang ≤ 1.12.
Ke kikowaena waho o Attacker - https://attacker.com.
Kūlana Kiʻekiʻe #1: Hoʻohuli hou i kahi noi HTTP POST e GET a loaʻa i ka ʻikepili koʻikoʻi
Ua hoʻomaikaʻi ʻia ke ʻano kumu mua e ka hoʻonohonoho ʻana o ke kikowaena o ka mea hoʻouka e hoʻi 302 HTTP Retcodee hoʻololi i kahi noi POST i kahi noi GET (ʻanuʻu 4 ma ke kiʻikuhi):
Noi mua (3) mai ka mea kūʻai mai GlusterFS (Manakia Mana), he ʻano POST. Ma ka hahai ʻana i kēia mau ʻanuʻu ua hiki iā mākou ke hoʻololi iā ia i GET:
Ma ke ʻano he ʻāpana resturl ma StorageClass ua hōʻike ʻia http://attacker.com/redirect.php.
Hopena https://attacker.com/redirect.php pane me ka 302 HTTP code kūlana me kēia wahi Header: http://169.254.169.254. Hiki paha kēia i nā kumuwaiwai kūloko ʻē aʻe - i kēia hihia, hoʻohana wale ʻia ka loulou hoʻihoʻi ma ke ʻano he laʻana.
ma ka paʻamau net/http waihona Hoʻihoʻi hou ʻo Golang i ka noi a hoʻololi i ka POST i kahi GET me kahi code status 302, e loaʻa ana kahi noi HTTP GET i ke kumu waiwai.
No ka heluhelu ʻana i ke kino pane HTTP pono ʻoe e hana describe Mea PVC:
kubectl describe pvc xxx
Eia kekahi laʻana o kahi pane HTTP ma JSON format i hiki iā mākou ke loaʻa:
Ua kaupalena ʻia nā hiki o ka mea haʻahaʻa i loaʻa i kēlā manawa ma muli o kēia mau mea:
ʻAʻole hiki ke hoʻokomo i nā poʻomanaʻo HTTP i ka noi puka.
ʻAʻole hiki ke hana i kahi noi POST me nā ʻāpana i loko o ke kino (maʻalahi kēia e noi i ke kumu waiwai mai kahi mea etcd e holo ana ma luna. 2379 awa inā hoʻohana ʻia ʻo HTTP unencrypted).
ʻAʻole hiki ke kiʻi i ka ʻike kino pane i ka wā he 200 ke kūlana kūlana a ʻaʻohe JSON Content-Type ka pane.
ʻO ke kūlana kiʻekiʻe #2: Ke nānā nei i ka pūnaewele kūloko
Ua hoʻohana ʻia kēia ʻano SSRF hapa makapō e nānā i ka pūnaewele kūloko o ka mea hāʻawi kapua a koho i nā lawelawe hoʻolohe like ʻole (Metadata instance, Kubelet, etcd, etc.) ma muli o nā pane. mea hoʻoponopono kube.
ʻO ka mua, ua hoʻoholo ʻia nā awa hoʻolohe maʻamau o nā ʻāpana Kubernetes (8443, 10250, 10251, a me nā mea ʻē aʻe), a laila pono mākou e hoʻokaʻawale i ke kaʻina hana scan.
I ka ʻike ʻana he kikoʻī loa kēia ʻano o ka nānā ʻana i nā kumuwaiwai a ʻaʻole kūpono me nā scanners maʻamau a me nā mea hana SSRF, ua hoʻoholo mākou e hana i kā mākou mau limahana ponoʻī i kahi palapala bash e hoʻokaʻawale i ke kaʻina holoʻokoʻa.
No ka laʻana, i mea e nānā wikiwiki ai i ka laulā 172.16.0.0/12 o ka pūnaewele i loko, ua hoʻokuʻu ʻia nā limahana 15 i ka like. Ua koho ʻia ka laulā IP ma luna ma ke ʻano he laʻana wale nō a hiki ke hoʻololi ʻia i ka laulā IP o kāu mea lawelawe.
No ka nānā ʻana i hoʻokahi IP address a me hoʻokahi awa, pono ʻoe e hana i kēia:
holoi i ka StorageClass i nānā hope ʻia;
e wehe i ke koi koi hoomau i hooiaio mua ia;
hoʻololi i nā waiwai IP a me Port ma sc.yaml;
hana i kahi StorageClass me kahi IP hou a me ke awa;
hana i kahi PVC hou;
e wehe i nā hopena scan me ka wehewehe no PVC.
Hōʻike kūlana kiʻekiʻe #3: CRLF injection + smuggling HTTP ma nā mana "kahiko" o ka hui Kubernetes
Inā hoʻohui i kēia, hāʻawi ka mea hāʻawi i nā mea kūʻai aku i nā mana kahiko o ka hui K8s и hāʻawi iā lākou i ke komo i nā lāʻau kube-controller-manager, ua ʻoi aku ka nui o ka hopena.
ʻOi aku ka maʻalahi o ka mea hoʻouka e hoʻololi i nā noi HTTP i hoʻolālā ʻia e kiʻi i kahi pane HTTP piha ma kāna ʻano.
No ka hoʻokō ʻana i ke ʻano hope, pono e hoʻokō ʻia nā kūlana aʻe:
Pono ka mea hoʻohana e komo i nā kube-controller-manager logs (e like me ka laʻana, ma Azure LogInsights).
Pono ka pūʻulu Kubernetes e hoʻohana i kahi mana o Golang ma lalo o 1.12.
Ua hoʻolālā mākou i kahi kaiapuni kūloko i hoʻohālikelike i ka kamaʻilio ma waena o ka mea kūʻai aku ʻo GlusterFS Go a me kahi kikowaena pahuhopu hoʻopunipuni (e hōʻole mākou i ka hoʻolaha ʻana i ka PoC i kēia manawa).
Ua loaʻa palupalu, e pili ana i nā mana Golang ma lalo o 1.12 a me ka ʻae ʻana i ka poʻe hackers e hoʻokō i nā hōʻeha HTTP smuggling/CRLF.
Ma ka hoʻohui ʻana i ka SSRF hapa makapō i hōʻike ʻia ma luna hui pū me kēia, ua hiki iā mākou ke hoʻouna i nā noi e like me kā mākou makemake, me ka hoʻololi ʻana i nā poʻomanaʻo, ke ʻano HTTP, nā ʻāpana a me nā ʻikepili, i hana ʻia e kube-controller-manager.
Eia kahi laʻana o kahi "maunu" hana ma kahi ʻāpana resturl StorageClass, e hoʻokō ana i kahi ʻano hoʻouka kaua like:
He hewa ka hopena pane i noi ʻole ʻia, he memo e pili ana i ka mea i hoʻopaʻa ʻia i loko o nā log control. Mahalo i ka verbosity i hoʻohana ʻia e ka paʻamau, mālama ʻia nā ʻike o ka memo pane HTTP ma laila.
ʻO kēia kā mākou "maunu" maikaʻi loa i loko o ke kahua o ka hōʻoia o ka manaʻo.
Ke hoʻohana nei i kēia ala, ua hiki iā mākou ke hoʻokō i kekahi o nā hoʻouka ʻana ma luna o nā pūʻulu o nā mea hoʻolako k8s i hoʻokele ʻia: ka piʻi ʻana o ka pono me nā hōʻoia i nā manawa metadata, Master DoS ma o (unencrypted) HTTP noi ma etcd master instances, etc.
Nā hopena
Ma ka ʻōlelo kūhelu Kubernetes e pili ana i ka nāwaliwali o SSRF a mākou i ʻike ai, ua helu ʻia CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Inā mākou e noʻonoʻo wale i ka nāwaliwali e pili ana i ka ʻāpana Kubernetes, ka vector integrity (vector hoʻopono) kūpono ia e like me None.
Eia naʻe, ʻo ka loiloi ʻana i nā hopena e hiki mai ana i loko o ka pōʻaiapili o kahi kaiapuni lawelawe mālama ʻia (a ʻo ia ka mea hoihoi loa o kā mākou noiʻi!) CVSS koʻikoʻi10/10 no nā mea hoʻolaha he nui.
Aia ma lalo ka ʻike hou aʻe e kōkua iā ʻoe e hoʻomaopopo i kā mākou noʻonoʻo ʻana i ka wā e loiloi ai i nā hopena e hiki mai ana i nā kaiapuni ao:
Pono pono
E hoʻokō i nā kauoha mamao me ka hoʻohana ʻana i nā hōʻoia kūloko i loaʻa.
Hoʻopuka hou i ka hiʻohiʻona i luna me ke ʻano IDOR (Insecure Direct Object Reference) me nā kumuwaiwai ʻē aʻe i loaʻa ma ka pūnaewele kūloko.
Palekana
ʻAno hoʻouka ʻOhana Kaha mahalo i ka ʻaihue ʻana i nā hōʻoia o ke ao (no ka laʻana, metadata API).
E hōʻiliʻili i ka ʻike ma ka nānā ʻana i ka pūnaewele kūloko (e hoʻoholo ana i ka mana SSH, mana kikowaena HTTP, ...).
E hōʻiliʻili i ka ʻike hoʻohālike a me ka ʻikepili ma ke koho balota ʻana i nā API kūloko e like me ka metadata API (http://169.254.169.254,…).
ʻAhuehue i ka ʻikepili o ka mea kūʻai aku me ka hoʻohana ʻana i nā hōʻoia ao.
Loaʻa
ʻO nā hiʻohiʻona hoʻohana āpau e pili ana i ka hoʻouka ʻana i nā vectors ma pono, hiki ke hoʻohana ʻia no nā hana hoʻopōʻino a alakaʻi i nā kumu kumu mai ka perimeter o ka mea kūʻai aku (a i ʻole nā mea ʻē aʻe) i loaʻa ʻole.
No ka mea aia mākou i loko o kahi kaiapuni K8 i hoʻokele ʻia a nānā i ka hopena i ka pono, hiki iā mākou ke noʻonoʻo i nā hiʻohiʻona he nui e hiki ke hoʻopilikia i ka loaʻa. ʻO nā hiʻohiʻona hou e pili ana i ka hōʻino ʻana i ka waihona etcd a i ʻole ke kāhea ʻana i kahi kelepona koʻikoʻi i ka Kubernetes API.
Kahi manawa
Kekemapa 6, 2019: Ua hōʻike ʻia ka Vulnerability iā MSRC Bug Bounty.
Ianuali 3, 2020: Ua haʻi aku kekahi ʻaoʻao ʻekolu i nā mea hoʻomohala Kubernetes e hana ana mākou i kahi pilikia palekana. A noi aku iā lākou e noʻonoʻo i ka SSRF ma ke ʻano he nāwaliwali o loko (in-core). A laila hāʻawi mākou i kahi hōʻike maʻamau me nā kikoʻī loea e pili ana i ke kumu o ka pilikia.
Ianuali 15, 2020: Hāʻawi mākou i nā hōʻike loea a me ka laulā i nā mea hoʻomohala Kubernetes ma kā lākou noi (ma o ka pae HackerOne).
Ianuali 15, 2020: Ua haʻi mai nā mea hoʻomohala Kubernetes iā mākou i ka hapalua makapō SSRF + CRLF injection no nā hoʻokuʻu i hala ua manaʻo ʻia he palupalu i loko. Ua ho'ōki koke mākou i ka nānā ʻana i nā perimeter o nā mea lawelawe ʻē aʻe: ke hana nei ka hui K8s i ke kumu kumu.
Ianuali 15, 2020: Loaʻa ka makana MSRC ma o HackerOne.
Ianuali 16, 2020: Ua ʻike ʻo Kubernetes PSC (Product Security Committee) i ka nāwaliwali a noi ʻo ia e hūnā a hiki i ka waena o Malaki ma muli o ka nui o nā mea i hōʻeha ʻia.
Pepeluali 11, 2020: Loaʻa ka makana Google VRP.
Malaki 4, 2020: Loaʻa ka uku Kubernetes ma o HackerOne.
Malaki 15, 2020: Ua hoʻopanee ʻia ka hoʻolaha ʻana i ka lehulehu ma muli o ke kūlana COVID-19.
Iune 1, 2020: Kubernetes + Microsoft ʻōlelo hui e pili ana i ka nāwaliwali.
Aku; DR
Inu mākou i ka pia a ʻai i ka pizza :)
Ua ʻike mākou i kahi nāwaliwali i loko o Kubernetes, ʻoiai ʻaʻohe o mākou manaʻo e hana pēlā.
Ua alakaʻi mākou i ka nānā ʻana i nā pūʻulu o nā mea hāʻawi kapuaʻi like ʻole a hiki iā mākou ke hoʻonui i ka pōʻino i hoʻokumu ʻia e ka nāwaliwali e loaʻa i nā bonus maikaʻi ʻē aʻe.
E ʻike ʻoe i nā kikoʻī loea i kēia ʻatikala. E hauʻoli mākou e kūkākūkā me ʻoe (Twitter: @ReeverZax & @__hach_).
Ua ʻike ʻia ua lōʻihi loa nā ʻano hana a me ka hōʻike ʻana ma mua o ka mea i manaʻo ʻia.