鳩小屋

落書き帳

コンテナセキュリティハンズオン2:Shared Namespace

第2弾では名前空間の共有を確認します。

 

テーマ

名前空間の共有と脅威

 

補足

 $:ホストOS #:コンテナ内

PID名前空間の共有


docker runコマンドに--pid=hostオプションを指定することによって、ホストのプロセスIDをコンテナ内から認識されるようにできます。

$ docker run --pid=host -it -d --rm --name test centos /bin/bash

$ ps -aufx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Apr18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< Apr18 0:00 ¥_ [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< Apr18 0:00 ¥_ [mm_percpu_wq]
root 7 0.0 0.0 0 0 ? S Apr18 0:00 ¥_ [ksoftirqd/0]
root 8 0.0 0.0 0 0 ? R Apr18 0:00 ¥_ [rcu_sched]

$ docker container attach test
# ps -aufx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Apr18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< Apr18 0:00 ¥_ [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< Apr18 0:00 ¥_ [mm_percpu_wq]
root 7 0.0 0.0 0 0 ? S Apr18 0:00 ¥_ [ksoftirqd/0]
root 8 0.0 0.0 0 0 ? I Apr18 0:00 ¥_ [rcu_sched]

これだけでホストOSが侵害されることはありませんが、下記のようにコンテナに特権が付与されているような場合、ホストのプロセスをkillすることもできます。


ホストOSでプロセスを生成します。

$ sleep 1000


 別のコンソールで特権付与+pid名前空間を共有したコンテナを生成します。
次にホストOSのプロセスIDを確認してkillします。
$docker run --pid=host -it -d --rm --privileged --name test centos /bin/bash
$docker container attach test
# ps aufx |grep sleep 1000 3633 0.0 0.0 2248 4 ? S+ 03:45 0:00 \_ sleep 1000
root 3635 0.0 0.0 9180 1080 pts/0 S+ 03:45 0:00 \_ grep --color=auto sleep
# kill 3633
#
ホストOSのプロセスを確認
$ sleep 1000
Terminated
$
 ホスト上のプロセスがコンテナからkillされたことが確認できます。
 
Dockerには上記のように名前空間を共有するオプションもありますが、他の権限と組み合わせることでホストOSの侵害につながるため基本的に非推奨です。

後片付け

作業が終わったら不要なコンテナは削除しましょう。

#すべてのコンテナを停止
docker stop `docker ps -a -q`
#すべてのコンテナを削除
docker rm `docker ps -a -q`