execInstalledOnly による ESXi での信頼できないバイナリの実行防止
Table of contents
はじめに
先日 vSphere 8 が発表されましたが、その What’s New の中で ESXi 8.0 では execInstalledOnly 起動オプションがデフォルトで有効になるとの記載を確認しています。
Prevent execution of untrusted binaries: ESXi 8.0 will turn on the execInstalledOnly option by default. This prevents the execution of binaries that are not installed via a VIB.
以前の TPM による ESXi の保護に関する記事の中で execInstalledOnly 起動オプションの有効化を強制する構成について触れていましたが、実際に execInstalledOnly を有効にすると何が変わるのか見ていきたいと思います。
execInstalledOnly とは?
本オプション単体を説明した情報は少ないですが、以下のドキュメントに記載があります。
注: ESXi は、許容レベルによって管理される VIB の整合性チェックを実行します。VMkernel.Boot.execInstalledOnly 設定を使用して、ホストにインストールされている有効な VIB から発信されたバイナリのみを実行するように ESXi に指示できます。この設定をセキュア ブートと組み合わせると、ESXi ホストで実行されるすべてのプロセスが署名され、許可され、想定されるようになります。デフォルトでは、vSphere 7 のパートナーとの互換性のために、VMkernel.Boot.execInstalledOnly 設定は無効になっています。この設定を有効にすると(可能な場合)、セキュリティが向上します。
ESXi のソフトウェアパッケージは VIB という単位で管理されています。execInstalledOnly を有効にすることで VIB に含まれるバイナリの実行のみを許可し、VIB に含まれないバイナリは実行が拒否されるようになります。
何に役立つのか?
execInstalledOnly が有効であれば、悪意のあるユーザーが ESXi 上にマルウェアやランサムウェアのバイナリを配置したとしても実行できなくなるため、これらを使用した攻撃を防ぐことができます。
Was recently discussing w/Engr on topic of preventing arbitrary binaries to run on ESXi (especially WRT to ransomeware attacks)
— William Lam (@lamw) November 11, 2021
Good to see we already have ESXi Option execInstalledOnly that can be used. Hopefully this can be enable by default in future!https://t.co/fpLwC27r5W
昨今、LockBit や Cheerscrypt といった ESXi を標的とするランサムウェアも増えてきています。「管理ネットワークへのアクセスをセキュアに保つ」「パッチの適用で脆弱性に対処する」「システムの侵害に備え複数のバックアップを保持する」といった対応は前提として、それに加えて「不正なプログラムを実行させない」対応も求められる場合には execInstalledOnly は有効なオプションの1つです。
execInstalledOnly を試してみる
ここからは execInstalledOnly の有効化の前後で実際にどのように動作が変わるのか見ていきます。
事前準備
分かりやすいようにアセンブラ(nasm)で単純な Hello, world のプログラムを書いて試してみます。以下は write システムコールで標準出力に “Hello, world!\n” を出力した後に exit システムコールを呼び出して終了しています1。
1; hello_world.asm
2section .data
3message: db 'Hello, world!', 10
4
5section .text
6
7global _start
8
9_start:
10 mov rax, 1
11 mov rdi, 1
12 mov rsi, message
13 mov rdx, 14
14 syscall
15
16 mov rax, 60
17 xor rdi, rdi
18 syscall
コンパイルした ELF 形式の実行ファイルを ESXi に転送しておきます。
1$ nasm -felf64 hello_world.asm -o hello_world.o
2$ ld -o hello_world hello_world.o
3$ scp hello_world root@victim.jangari.lab:/vmfs/volumes/datastore1
execInstalledOnly 無効での実行を見てみる
execInstalledOnly が無効の場合、外部から転送されたバイナリが以下のように実行できてしまいます。
なお、当然ながらこの例はあくまでも極めて単純なコードなので実行できています。ただ、実際に ESXi でのランサムウェア被害が確認されている点を鑑みれば、リモートコード実行などの脆弱性と組み合わさった場合にシステムが侵害されてしまう可能性は想像に難くないと思います。
execInstalledOnly 有効での実行を見てみる
execInstalledOnly は起動オプションのため、ESXi 起動前のブートローダで指定するか、esxcli や GUI で設定を変更するかの2通りがあります。esxcli の場合は以下のようになります。
1# esxcli system settings kernel set -s execInstalledOnly -v TRUE
起動オプションの設定を変更した場合は ESXi を再起動して反映させます。
execInstalledOnly を有効にした状態で外部から転送されたバイナリを実行してみると、先ほどとは異なり Operation not permitted で実行が拒否されることがわかります。
注意点
execInstalledOnly は VIB に含まれない不正なバイナリを実行しないようにするオプションですが、逆に言えば VIB に含まれる正当なバイナリは実行できます。
例えば python インタプリタは元から VIB に含まれているので、python を使用するスクリプトも実行できます。
あくまでも VIB に含まれない不正なバイナリの実行を防ぐオプションですので、問題が発生するあらゆるプログラムを実行しないようにする魔法のような機能では無いことに注意しましょう。そもそも悪意のあるユーザーが ESXi の root を取得できた時点でアウトと考えるべきです。
また、その他の注意点として、VUM / vLCM によるベースラインを使用したホストの修正が失敗する KB88212 の既知問題があります。これは ESXi にプッシュされるベースライン用のエージェントが VIB には含まれず、execInstalledOnly によってエージェントの実行が拒否されるために発生します。
冒頭に記載したドキュメントの引用の通り、ESXi 7.0 まではサードパーティ製ソフトウェアとの互換性のためにデフォルトで無効になっています。ESXi 7.0 以前で execInstalledOnly を有効にする場合にはサードパーティ製ソフトウェア等との相性なども考慮し、問題なく動作することを十分に検証/評価することを強く推奨します。
おわりに
今回の記事では execInstalledOnly の有効化により不正なバイナリの実行が拒否される動作を見ていきました。
execInstalledOnly はマルウェアやランサムウェアへの対策として有効ですが、あくまでも数ある攻撃手段のうち「不正なバイナリの実行」という一つを断つに過ぎません。vSphere であれば Security Configuration Guide なども参照しつつ、環境に合わせて必要な対策を取っていくことが重要です。
仮想化基盤のランサムウェア対策については VMware Japan Blog で以下のようなブログ記事が公開されていますので、概要の把握などにはこれらの情報も参考にしてみると良いと思います。
[TAM Blog] ランサムウェアの脅威から仮想化基盤を守るには
-
vmkernel のシステムコール番号などは当然ながら公開情報はありません。ただ、かなり古い中の人の記事から Linux でビルドした rsync を ESXi で動かしていた形跡があるので、おそらくシステムコール番号の一部は Linux と似ているのだろうと推測しています。 ↩︎