Kubernetesの脆弱性CVE-2019-11249を検出し、修正する方法
Hayley Denbraver
2020年3月11日
0 分で読めますここ数年でKubernetesはテクノロジー業界で急速に普及し、最も人気のあるクラウドコンテナオーケストレーションシステムとなりました。Kubernetesは、開発者にとって今も強力で便利なオープンソースシステムですが、ほかのツールと同様、慎重に使用し、クラスターを保護するための対策を講じる必要があります。今回は、最近発見された2つの脆弱性(CVE-2019-11247とCVE-2019-11249)と、その対処方法について解説します。
Kubernetesのディレクトリトラバーサル脆弱性
ディレクトリトラバーサルとは、攻撃者がサーバーのルートディレクトリ外にある、アクセス制限されたディレクトリやファイルにアクセスできる攻撃です。URLを操作することで、アプリケーションに「制限された」ファイルを開示させたり、本来ユーザーには実行権限のないコマンドを実行させたりできます。
ほかの種類の攻撃とは異なり、ディレクトリトラバーサルは、開発者のセキュリティポリシーが正しく機能しているように見える状況に潜む抜け穴を突きます。必ずしもコードにバグがあるわけではなく、すべてが正しく機能している場合もあります。むしろ、権限、パス、ファイルアクセスの設定が誤っているか、不十分であることが原因です。
問題が始まったのは、約2年前のことです。kubectl cp操作に、典型的なディレクトリトラバーサルの脆弱性が見つかりました。このケースでは、TARデータの処理が安全でなかったため、コンテナ内の悪意あるコードによって、コピー元のノード(マシン)上の任意のパスに任意のファイルを書き込むことが可能でした。ディレクトリをたどってファイル名を特定するのも難しくありませんでした。
その後の修正では、パストラバーサルを取り除いてディレクトリパスをサニタイズしようとしましたが、問題は完全には解決しませんでした。パッチ適用後も、TARアーカイブのヘッダーからシンボリックリンクを作成してたどることで、攻撃者がパスを操作できることが判明しました。
2019年初頭、kubectl cp操作に3つ目のディレクトリトラバーサルの問題が見つかりました。攻撃者は、ダウンロードしたコンテナ内の悪意あるTARバイナリを使い、コンテナとノード間でファイルやディレクトリをコピーできました。つまり、kubectl cp操作のコピー先ディレクトリの外であっても、ユーザーのマシン上のファイルを置き換えたり、新たに作成したりできる可能性がありました。
CVE-2019-11249
8月、KubernetesはCVE-2019-11249を公開しました。この修正により、ディレクトリトラバーサルの脆弱性がようやく解消されました。kubectl cp操作では、TARアーカイブの展開中に各ファイルのコピー先パスがより厳密に検証されるようになりました。展開したファイルを、元のkubectl cp操作で指定したコピー先ディレクトリ以外のパスにコピーすることはできなくなりました。
CPE-2019-11247について簡単に解説
ディレクトリトラバーサルの脆弱性が修正されたのとほぼ同時期に、CVE-2019-11247の脆弱性が発見されました。この脆弱性により、権限ロールで自分の名前空間、つまりクラスター内の一部のリソースへのアクセスしか許可されていない場合でも、攻撃者がクラスター全体のカスタムリソースを読み取り、変更、削除できる可能性がありました。
ディレクトリトラバーサルの脆弱性とCPE-2019-11247の脆弱性には、ユーザーが本来アクセス権を持たない(または持つべきでない)コンテナの一部(ひいてはノード)にアクセスできるという共通点があります。
一方、CPE-2019-11247は、APIサーバーが、APIエンドポイントのスコープとセキュリティ権限の関係をどのように解釈するかに起因する脆弱性でした。これに対し、ディレクトリトラバーサルの脆弱性は、セキュリティ権限が不十分であることに起因します。これは、根本的にはロールベースのアクセス制御(RBAC)の問題でした。つまり、クラスター全体に適用されるカスタムリソースのスコープが名前空間に設定されており、そのリソースを呼び出すアカウントに特定のロール定義(ワイルドカードなど)が割り当てられていると、名前空間の制限を回避してグローバルリソースを操作できる可能性がありました。
CVE-2019-11247とCVE-2019-11249への対処方法
どちらの脆弱性も中〜高リスクの問題として分類されており、できるだけ早く対処する必要があります。CVE-2019-11247とCVE-2019-11249への対処には、次の2つの方法が推奨されています。
修正済みバージョンにKubernetesをアップグレードする:すべてのユーザーに対し、クラスターとkubectlクライアントを修正済みバージョンにアップグレードすることを強く推奨します。Kubernetes 1.13.9、1.14.5、1.15.2には、どちらの脆弱性にも対処するパッチが含まれています。1.12以前を使用している場合は、アップグレードの適切な方法について公式ドキュメントを確認してください。1.12以前を使用している場合は、アップグレードが必要です。1.12はすでにサポート終了となっています。
アップグレードできない場合は、クラスター全体からワイルドカードのロール定義を削除する:マネージドプラットフォームを利用しているユーザーの中には、すぐにアップグレードできない場合があります。その場合は、リソースまたはapiGroupsに対するワイルドカード権限(*で示される)を削除してください。
クラスターからRBACを削除しないでください
RBACが有効でないクラスターはCVE-2019-11249の影響を受けず、理論上はCVE-2019-11247の影響も受けません。しかし、RBACを使用しないことは、すべてのアカウントがrootアクセス権を持つことになるため、さらに大きなセキュリティリスクとなります。「一時的な応急措置」としてであっても、クラスターからRBACを削除しないでください。
まとめ
このKubernetesの脆弱性による影響は、クラスターの特性や使用されているリソースによって異なります。それでも、クラウドコンテナのオーケストレーションにKubernetesを利用する組織が増える中、Kubernetesの脆弱性は深刻な問題です。最新のパッチでCVE-2019-11247とCVE-2019-11249が修正されると考えられています。
しかし、セキュリティ対策に終わりはありません。こうしたパッチは、攻撃者がコードの抜け穴やバグを悪用する巧妙な方法を常に見つけ出すという現実を示しています。常にアップグレードし、最新のKubernetesセキュリティ情報を把握して、安全を守りましょう。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。
