
コンテナイメージであり、基盤となるコンテナランタイムを抽出してリモートサーバーに送信します。 お気に入りのCSPコンテナプラットフォームの基盤となるコンテナランタイムを突いてみましょう!
runc の CVE-2019-5736 で示されているように、従来の Linux コンテナランタイムは、/proc/self/exe を介して実行中のコンテナに自身を公開します。whoc はこのリンクを使用して、実行中のコンテナランタイムを読み取ります。
これは、動的にリンクされたコンテナランタイムに対して機能する whoc のデフォルトモードです。
whoc イメージのエントリポイントは /proc/self/exe に設定され、イメージの動的リンカ (ld.so) は upload_runtime に置き換えられます。upload_runtime) をランタイムプロセスにロードし、実行を渡します。upload_runtime は /proc/self/exe を介してランタイムバイナリを読み取り、設定されたリモートサーバーに送信します。
静的にリンクされたコンテナランタイムの場合、whoc には別のフレーバー whoc:waitforexec があります。
upload_runtime がイメージのエントリポイントであり、whoc コンテナの PID 1 として実行されます。whoc コンテナに exec し、/proc/self/exe を指すファイルを呼び出すことが期待されます(例: docker exec whoc_ctr /proc/self/exe)。upload_runtime は /proc/$runtime-pid/exe を介してランタイムバイナリを読み取り、設定されたリモートサーバーに送信します。
docker と python3 がインストールされている必要があります。リポジトリをクローンしてください:
git clone [email protected]:twistlock/whoc.git && cd whoc
抽出されたコンテナランタイムを受信するためのファイルサーバーをセットアップします:
mkdir -p stash && cd stash
ln -s ../util/fileserver.py fileserver
./fileserver
別のシェルから、選択したコンテナ環境(例:Docker)で whoc イメージを実行します:
cd whoc
docker build -f Dockerfile_dynamic -t whoc:latest src # or ./util/build.sh
docker run --rm -it --net=host whoc:latest 127.0.0.1 # or ./util/run_local.sh
ファイルサーバーがコンテナランタイムを受信したことを確認してください。バニラの Docker で whoc を実行した場合、受信されるコンテナランタイムは runc になるはずです。
--net=host は、whoc コンテナが 127.0.0.1 を介してホスト上のファイルサーバーに簡単に到達できるようにするためのローカルテストでのみ使用されます。
デフォルトでは whoc は linux/amd64 向けにビルドされますが、他の CPU アーキテクチャもサポートしています。実行待機モードは通常通りビルドできます。他の CPU アーキテクチャ向けに動的モードで whoc をビルドするには、ビルド引数 PLATFORM_LD_PATH_ARG にターゲットアーキテクチャの動的リンカのパスを指定する必要があります。
arm64 向けのビルドスクリプトの例は util/build_arm64.sh にあります。
whoc のメインバイナリ upload_runtime のヘルプ:
Usage: upload_runtime [options] <server_ip>
Options:
-p, --port Port of remote server, defaults to 8080
-e, --exec Wait-for-exec mode for static container runtimes, waits until an exec to the container occurred
-b, --exec-bin In exec mode, overrides the default binary created for the exec, default is /bin/enter
-a, --exec-extra-argument In exec mode, pass an additional argument to the runtime so it won't exit quickly
-r, --exec-readdir-proc In exec mode, instead of guessing the runtime pid (which gives whoc one shot of catching the runtime),
find the runtime by searching for new processes under '/proc'