
CVE-2022-0847 は、コンテナエスケープ(ホスト上の任意の読み取り専用ファイルの上書き)を実現するために使用されます。
スライド(中国語)はここから入手できます。
CVE-2022-0847 (Dirty Pipe) を利用してコンテナエスケープを実現します(ホスト上の任意の読み取り専用ファイルを上書きする効果)。
中国語の発表PPTはこちらにあります。
カーネルが CVE-2022-0847 の影響を受ける場合、攻撃者は読み取り専用ファイルを上書きできます(非永続的です! 詳細は https://dirtypipe.cm4all.com/ を参照してください)。ただし、コンテナはコンテナ内のファイルにしかアクセスできません。幸いなことに、CAP_DAC_READ_SEARCH を付与されると、攻撃者はホスト上のファイルを上書きできるようになります。
https://dirtypipe.cm4all.com/ で説明されているように、読み取り専用ファイルを上書きするには、そのファイルをパイプに splice() する必要があります。splice() を使用するには、まず対象ファイルを O_RDONLY フラグで開いて ファイルディスクリプタ を取得する必要があります。
そこで CAP_DAC_READ_SEARCH が思い浮かびました。Linux マニュアル によると、CAP_DAC_READ_SEARCH を付与されると、コンテナ内の攻撃者は次のことができます。
CAP_DAC_READ_SEARCH ケーパビリティを使用すると、ホストのファイルシステムを検索し、open_by_handle_at(2) を使ってコンテナからホスト上の任意のファイルを読み取り専用で開き、その ファイルディスクリプタ を取得できます(詳細は http://stealth.openwall.net/xSports/shocker.c を参照してください)。
ホスト上の対象ファイルの ファイルディスクリプタ を取得できたので、もちろん splice() を使用して対象ファイルの内容をパイプに送り、上書きすることができます。
cp /etc/password . # back up /etc/password
gcc dp.c -o dp
docker run --rm -it -v $(pwd):/exp --cap-add=CAP_DAC_READ_SEARCH ubuntu
/exp/dp /etc/passwd 1 ootz: # overwrite /etc/password on host from offset 1
/etc/dp /etc/passwd # dump /etc/passwd on host
まず、ホスト上で root ユーザーにより読み取り専用ファイル /home/vagrant/flag.txt を作成します。その内容は hello world です:

次に、ケーパビリティ CAP_DAC_READ_SEARCH を持つコンテナを起動し、まずホスト上の /home/vagrant/flag.txt をダンプしてみると、hello world が取得できます:

次に、オフセット 1 から内容 abcdefghij で対象ファイルを上書きしてみます:

対象ファイルをもう一度ダンプすると、内容は habcdefghij になっています! コンテナを終了してホスト上の /home/vagrant/flag.txt を確認すると、その内容は habcdefghij です。

はい、コンテナからホスト上のファイルを上書きできました!