fbpx

CVE-2019-11246:kubectlの新たなパストラバーサルの脆弱性 #AquaSecurity #Kubernetes #DevSecOps

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。


本ブログは「Aqua Security」社の技術ブログで2019年6月27日に公開された「CVE-2019-11246: Another kubectl Path Traversal Vulnerability Disclosed」の日本語翻訳です。

CVE-2019-11246:kubectlの新たなパストラバーサルの脆弱性

Kubernetesクラスタでコマンドを実行するための一般的なコマンドラインインターフェイスであるkubectlでパストラバーサルを可能にする新しい脆弱性(CVE-2019-11246)が開示されました。このCVEについて興味深いのは、同じ脆弱性が過去2つ公開されたことがあることです。(この2つについては修正版が既に提供されています。)

kubectlは、複雑なKubernetesクラスタを管理するために使用できるシンプルなツールであり、したがってほとんどすべてのKubernetes管理者によって使用されています。しかし、時には単純さが問題となることがあり、それが繰り返されているように見えます。この記事では、kubectlが過去1年間に3回攻撃に対して脆弱であることが判明した方法について説明します。

優秀なセキュリティ研究者や開発者でさえも、コードの脆弱性を偶然に見落としてしまう可能性がありますが、
この脆弱性を緩和するためにあなたがとることができるステップを説明していきます。

始まりは...

約1年前、セキュリティ研究者のMichael Hanselmannがkubectl cpおよびoc cp(OpenShiftのkubectlに相当)コマンドに脆弱性を発見した。これらのコマンドを使用すると、podからクライアント上にファイルをコピーできます。

コピーのメカニズムは以下の通りです。

1.Kubernetesはコンテナ内のファイルを圧縮します(コンテナ内のtarバイナリを使用)
2.Kubernetesはこのtarをコピーしてクライアントに送信します
3.Kubectlはクライアント上でこのtarを解凍します

Michaelは自分の調査で、攻撃者がコンテナ内のこのtarバイナリを(ベースイメージに感染するなどの方法で)置き換えることができれば、相対パス名のファイルを含む特別な細工をしたtarファイルを出力できることを発見しました。つまり、クライアント上でパストラバーサルを実行することが可能ということです。そうすることで、攻撃者はマシン上のファイルを置き換え、潜在的にコードを実行する可能性さえあります。

kubectlクライアントの権限によっては、攻撃者は特定のリソースにアクセスする可能性があります。kubectlがrootとして実行されている場合、結果は壊滅的なものになる可能性があります。

この図はフローを示しています。

この脆弱性は、高い危険度でCVE-2018-1002100として割り当てられました。

KubernetesとOpenShiftはこのバグの修正を急いで行い、適切な修正バージョンを公開しました。基本的に、この修正にはcp.go:cleanへの呼び出しを含むuntarAll関数からパストラバーサル文字を削除しています。

1年後...

数か月前にも新しい脆弱性が発見されたため、話は続きます。最初のバグにパッチを当てるとき、開発者は知らないうちに別のセキュリティホールを残しました。

新しい脆弱性は同じパストラバーサルのリスクを露呈しましたが、これはクライアント上のパスへのシンボリックリンク(シンボリックリンク)を含む不正なtarファイルを使用しているものでした。つまり、潜在的に1年前に公開された脆弱と同様のものとなります。下図の青色の箇所は、元の脆弱性と新しい脆弱性の違いを表しています。

新しい脆弱性はCVE-2019-1002101として割り当てられました。cp.go:untarAll関数で、シンボリックリンクのパスが存在する場所を検証することで修正されました。Kubernetesはこのために複数の修正バージョンをリリースしたので、私たちが利用しているkubectlを更新することで安心できるかと思われました。

現在

数日前、Atredis PartnersのCharles Holmesは、開発者が実際にはシンボリックリンクの脆弱性にもパッチを当てていないことを発見しました。

この発見により、新しくCVE-2019-11246が発行され、kubectlクライアント用の新しい修正バージョンが発行されました。

この問題に関する正式な情報はそれほど多くなく、「この脆弱性の詳細はCVE-2019-1002101と非常によく似ており、この問題に対する最初の修正は不完全で、新しい悪用方法が発見されました。」と発表されただけでした。

この新たな脆弱によりどのような攻撃が想定されるのか、また特定の「パッチが適用されていない」ホールがどのようなものであるのかは不明ですが、修正を見ると今回はさらに多くの作業が行われていることがわかります。 untarAll関数も書き直されました。

あなたの環境も確認しましょう

AquaSecurityのオープンソース侵入テストツールであるkube-hunterを使って脆弱があるか否かを確認することができます。これら2つの脆弱性を確認する項目を追加しました。

入手/実行方法は以下となります。

・kube-hunterのGithubリポジトリから最新版を入手する
・クライアントホストマシンでkube-hunterを実行します(kubectlがPATHにあることを確認してください)。

どのモードで実行してもかまいません。kube-hunterを実行すると、これらの脆弱性が検索されます。

これらの脆弱性がある場合は、クライアントを最新バージョンにアップグレードする必要があります。Kube-hunterはあなたの現在のkubectlバージョンをレポートの「evidence」と表示されている箇所に出力されます。

軽減する方法

kube-hunterが脆弱性を発見した場合、以下いずれかのバージョンにkubectlクライアントを更新する必要があるでしょう。
・1.12.9
・1.13.6
・1.14.2

Aqua CSPによる追加の緩和策

・tarバイナリを悪意のあるコピーに置き換えないようにするために、コンテナ内での修正/新規バイナリの実行をブロックするAquaのDrift Prevention機能を使用することで、この脆弱性の悪用を防ぐことができます。
・信頼できないコンテナイメージの使用をブロックするには、Aquaの「Image Assurance Policy」を使用してください。この攻撃は悪意のあるコンテナイメージから発生する可能性があるため、信頼できないイメージをブロックすることでほとんどの場合でリスクを軽減することができます。

これらのオプションのいずれかを使用することで、クラスタ上で脆弱なバージョンのkubectlを実行しているクライアントでも影響を受けないようにすることができます。

最後に

Kubernetesコミュニティは成長しています、そしてセキュリティ意識がそれと共に成長していることがわかります。この脆弱性は昨年完全にパッチが適用されたわけではありませんが、意識の高まりと執拗な調査により、コミュニティからの複数の貢献により、現在適切にパッチが適用されています。

New call-to-action
新規CTA