本文の内容は、2021年5月24日にStefano Chiericiが投稿したブログ(https://sysdig.com/blog/cve-2021-25737-endpointslice)を元に日本語に翻訳・再構成した内容となっております。
CVE-2021-25737 は、Kubernetes の kube-apiserver に低レベルの脆弱性が発見されたもので、認証されたユーザがノード上のプライベートネットワークにポッドのトラフィックをリダイレクトできるというものです。
影響を受ける kube-apiserver は以下の通りです。
- kube-apiserver v1.21
- kube-apiserver v1.20.0 to v1.20.6
- kube-apiserver v1.19.0 to v1.19.10
- kube-apiserver v1.16.0 – v1.18.18
この脆弱性を悪用すると、Kubernetesがすでにlocalhostまたはlink-local範囲のエンドポイントIPの作成を防止しているにもかかわらず、攻撃者がポッドのトラフィックをリダイレクトできる可能性があります。これにより、攻撃者はクラスターのネットワークトラフィックをハイジャックすることができ、機密データの漏えいや認証情報の窃取、さらにはラテラルムーブメントを行うことができるようになる可能性があります。
この記事では、CVE-2021-25737を理解し、Kubernetesのどの部分が影響を受けるのか、そしてFalcoを使ってどのように緩和、検出するのかを説明します。
予備知識
CVE-2021-25735自体の調査を始める前に、EndpointSliceとは何かを簡単に見てみましょう。
Kubernetes 1.19からこの機能はkube-proxyでデフォルトで有効になっており、EndpointsではなくEndpointSliceから読み取るようになっています。
EndpointSliceはKubernetesに導入され、より良いスケーラビリティソリューションを提供し、Endpointsの2つの主要な問題を克服しました:
- Endpointでは、対応するサービスをバックアップしているすべてのPodのIPアドレスとポートを保存するように設計されていました。
- kube-proxyは、すべてのノードで実行され、Endpointsリソースの更新を監視していました。1つのネットワークエンドポイントがEndpointsリソースに変更を加えた場合、オブジェクト全体をkube-proxyの各インスタンスに送信する必要がありました。
EndpointSliceオブジェクトが導入され、シャーディングに似たアプローチでこれらの問題に対処するように設計されました。1つのEndpointsリソースでサービスの全てのPod IPを追跡する代わりに、それらを複数のより小さなEndpointSliceに分割します。
このアプローチにより、ネットワークのスケーラビリティが向上します。この方法では、Podが追加または削除されても、1つの小さなEndpointSliceを更新するだけで済みます。何百、何千ものPodが配備されている環境を考えると、この違いは非常に顕著になります。
CVE-2021-25737の問題
CVE-2021-25737 の kube-apiserver の脆弱性により、ユーザーがポッドのトラフィックをノード上のプライベートネットワークにリダイレクトできる可能性があります。影響を受ける kube-apiserver は以下の通りです。
- kube-apiserver v1.21
- kube-apiserver v1.20.0 to v1.20.6
- kube-apiserver v1.19.0 to v1.19.10
- kube-apiserver v1.16.0 – v1.18.18
この脆弱性は、EndpointSlicesを作成または変更し、127.0.0.0/8および169.254.0.0/16の内部範囲にあるエンドポイントアドレスを追加することで悪用されます。
適用された修正プログラムでは、修正を防止するための検証メカニズムが追加されています。具体的には、Endpoints、EndpointSlices、および外部IPを検証するために、ValidateNonSpecialIPというメソッドが使用されています。このメソッドは、ユーザーが追加しようとしているIPが有効であり、ループバックアドレスやリンクローカルアドレス、ローカルマルチキャストアドレスではないかどうかをチェックしています。
CVE-2021-25737の影響について
CVSSシステムによると、CVE-2021-25737の重大度は2.7で、低くなっています。
これまで見てきたように、この脆弱性はネットワーク経由で悪用可能であり、攻撃の複雑さも低いものです。
しかし、CVE-2021-25737の影響は、機密性の面での影響が低く、完全性と可用性の面では影響がないため、低いと評価されています。
前述の状況では、許可されたユーザがノード上のプライベートネットワークへのポッドトラフィックをリダイレクトして傍受することができます。
CVE-2021-25737 の緩和について
この問題は、以下のバージョンの kube-apiserver で修正されています。
- v1.21.1
- v1.20.7
- v1.19.11
- v1.18.19
kube-apiserverをアップグレードせずにこの脆弱性を緩和するには、EndpointSlicesの作成や変更を防止するvalidating admission webhookを作成してください。既存のアドミッションポリシーメカニズム(OPA Gatekeeperなど)があれば、この制限を実施するポリシーを作成することができます。
以下のWebhook構成で、Endpointslicesリソースに行われたCREATEおよびUPDATEアクションを検証することができます。
以下のOPA regoポリシーを使用すると、127.0.0.0/8と169.254.0.0/16の内部範囲にあるエンドポイントアドレスに値を追加できないようにすることができます。
package kubernetes.admission value_addresses(address) { contains(address,"127.") } value_addresses(address) { contains(address,"169.254.") } deny[message] { input.request.kind.kind == "EndpointSlice"; endpoints := input.request.object.endpoints[_]; address := endpoints.addresses[_]; value_addresses(address); assign(message, sprintf("Endpoints %v contains loopback", [input.request.name])) }
localhostのアドレスを持つ既存のEndpointSliceオブジェクトを変更しようとすると、アドミッションコントローラから次のようなエラーメッセージが表示されます。
FalcoによるCVE-2021-25737の検出
オープンソースツールのFalcoを使用すると、この特定のシナリオで脆弱性がいつトリガーされるかを検出することができます。この種のイベントを検出するには、クラスターでKubernetes Audit Loggingを有効にする必要があります。
Kubernetesクラスターでは、kube-apiserverが監査の実行を担当します。イベントがkube-apiserverによって処理されると、監査ポリシーのルールのリストを順に比較します。最初にマッチしたルールは、そのイベントの監査レベルも決定します。ノードの監査イベントを有効にするための監査ポリシーは以下の通りです:
次のルールをFalcoで有効にすると、誰かがEndpointSlicesを編集しようとしているかどうかを検出し、脆弱性を利用してトラフィックをリダイレクトしようとしている事を把握できます。
- rule: "EndpointSlice Validation Enable Host Network Hijack - CVE-2021-25737" desc: "An authorised user could redirect pod traffic to private networks on a Node. Possible EndpointSlice Validation Enable Host Network Hijack CVE-2021-25737" condition: "ka.verb in (create,update,patch) and ka.target.resource=endpointslices and (jevt.value[/requestObject/endpoints/0/addresses] contains "127." or jevt.value[/requestObject/endpoints/0/addresses] contains "169.254.")" exceptions: output: "Attempt to create or modify the EndpointSlice %ka.target.name with loopback or internal address. Possible EndpointSlice Validation Enable Host Network Hijack CVE-2021-25737 (user=%ka.user.name node=%ka.target.name addresses=%jevt.value[/requestObject/endpoints/0/addresses])" priority: "WARNING" tags: - "k8s" source: "k8s_audit" append: false
まとめ
ここでは、CVE-2021-25737問題のEndpointSlice Validation Enable Host Network Hijackについて、OPA Admissionコントローラで問題を緩和する方法、Falcoを使って悪用を検知する方法を見てきました。
幸いなことに、最新バージョンにアップグレードし、コンテナイメージのベストプラクティスに従うことで、この問題や同様の攻撃を回避することができます。
Sysdig Secureは、Kubernetesクラスターのベンチマークや、PCI、NIST、CISなどのセキュリティ基準を用いたセキュリティ態勢のチェックをサポートします。今すぐお試しください!
Falcoについてもっと知りたい方は:
- Falco.orgで始める。
- GitHubでFalcoプロジェクトをチェックしてください。
- Falco コミュニティに参加する。
- Falco Slackでメンテナと交流する。
- ツイッターで @falco_org をフォローする。