私はDockerのセキュリティを研究し、コンテナからホストにエスケープする方法を調査しています。
Docker sock(docker.sock
)が/var/run/docker.sock
のコンテナーにマウントされ、Dockerクライアント(docker
)がDockerデーモン(dockerd
)にコマンドを送信できると仮定します。
ホストでコマンドを実行するには、別のコンテナーを実行して/etc/
をマウントし(読み取り/書き込み)、CRONジョブをスケジュールします。現在のコンテナに/etc/
をマウントすることは可能ですか?
docker.sock
を介してホスト上でコマンドを実行するための他の方法はありますか?
公開されたDockerソケットを使用して、基盤となるホストでコマンドを実行するために見つけた最良の方法は、Ian Miellの これまでで最も無意味なdockerコマンド です。
コマンドは次のようになります:-
docker run -ti
--privileged
--net=Host --pid=Host --ipc=Host
--volume /:/Host
busybox
chroot /Host
基本的には、基盤となるホストの完全なルートシェルに直接ドロップします。
コマンドを分解するには
--privileged
は、Apparmorや機能制限などのデフォルトのDockerセキュリティレイヤーを削除します。
--net=Host --pid=Host --ipc=Host
は、含まれているプロセスの名前空間の個別のセットではなく、ホストの名前空間でプロセスを実行します。
--volume /:/Host
は、ホストルートファイルシステムを/Host
としてコンテナ内にマウントします
その後
コマンドとしてのchroot /Host
は、ルートをその/Host
ディレクトリに変更します。
Kubernetesを介して実行している場合は、 最も無意味なKubernetesコマンド を使用できます。これは、実質的に同じことを実行します(クラスターに制限付きのポッドセキュリティポリシーが設定されていない場合)。