web-dev-qa-db-ja.com

特権をエスカレートしてDockerコンテナーからエスケープすることは可能ですか?

私はドッカーについて多くを学んでいます。 docker-swarm、registry、shipyardなどを使用してdockerクラスタを作成する練習をしています。

Docker権限を持つ制限されたユーザーでホストに入ると、docker Hostマシンでrootになるのがいかに簡単かを見ました。これの代わりに、ドッカーコンテナーサービスからドッカーホストマシンに「エスケープ」できるかどうかを考えていました(rootであるかどうかは関係ありません)。

これはできますか?

概念の証明はありますか?私はグーグルでしたが、決定的なものは何も見つかりませんでした。

33
OscarAkaElvis

Docker Hostのユーザーで、Dockerグループにアクセスしたり、Sudo dockerコマンドへの権限を持っているユーザーは、実質的にrootです(dockerを使用して特権コンテナーを実行したり、コンテナー内にrootファイルシステムをマウントしたりできるため)。これが理由です。その権利を制御することは非常に重要です。

Dockerコンテナーからホストへの分割は別のゲームであり、いくつかの要因に応じて多かれ少なかれ困難になります。可能なベクトルは次のとおりです。

  • カーネルの脆弱性。ホスト上で実行されているコンテナは、ホストと同じカーネルを共有するため、コンテナからホストへのブレークアウトに使用される可能性があるカーネルに悪用可能な問題がある場合
  • 設定が間違っています。アクセス権のあるコンテナが--privileged基盤となるホストにアクセスできる可能性があります。
  • マウントされたファイルシステム。持っているコンテナがホストファイルシステムをマウントする場合、そのファイルシステムのアイテムを変更して、ホストへの特権をエスカレートできる可能性があります。
  • マウントされたDockerソケット。 Dockerコンテナーで比較的一般的な(そして危険な)プラクティスは、コンテナー内にdockerソケットをマウントして、コンテナーがdockerデーモンの状態を理解できるようにすることです。これにより、ホストへのささいなブレークアウトが可能になります。詳細 ここ

詳細については、NCCのホワイトペーパーをお勧めします。 特権および非特権Linuxコンテナーの乱用 および Linixコンテナーの理解と強化 。私がやったこのプレゼンテーションのいくつかをカバーするプレゼンテーションもある here

Dockerの強化に興味がある場合は、 CIS Security standard も参照することをお勧めします。

49
Rory McCune

通常の手段では、いいえ。 Dockerは、このセキュリティコンセプトに基づいて設計されています。

カーネルの名前空間機能を使用して、コンテナーで実行されているプロセスを、ホストで実行されているプロセスから分離します。ウェイが見つかると、セキュリティホールと見なされ、できるだけ早くクローズされます。

ただし、システム全体の構成設定が存在する可能性があります。最も一般的には、DockerコンテナはSYS_ADMINは、基本的にIPアドレスを変更できること、およびホストマシンで通常使用できる他の多くの機能を意味します。コンテナがSYS_ADMIN、chrootで実行されているタスクとしては、本質的にはそれほど保護されていません。

この設定は主に、DockerコンテナーがLinuxサーバー上のデーモンのようにサービスとして実行される場合に使用されます。通常のラップトップでは、使用目的として、すべてがデフォルトで実行されます。そうでない場合、Dockerユーザーは、使用しているすべてのコンテナー開発者を信頼する必要があります。今、彼らはドッカー開発者を信頼する必要があるだけです。

Windowsバージョンのdockerでは、これでも十分ではありません。 Windows dockerはLinuxを起動しますVM HyperVで起動し、このLinux VMでdockerコンテナーを実行します。コンテナーからのブレークアウトは、このVMのroot権限を意味し、クライアントにブレークアウトしますHyperVにも穴を見つける必要がありました。