vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

VMware Backdoor の話を継承していく

こちらの投稿は vExperts Advent Calendar 2023 の 19 日目になります。
最新機能とかではなく、昔からあるテクノロジーのお話で拙い文章ですがお付き合いください。 adventar.org

一番好きな vSphere の機能って何ですか?

vSphere 触っている人が集うと稀に出てくるこの話。

魅力的な機能は多々ありますが、個人的に一番好きな機能はこの Backdoor です。

Backdoor …物騒な名前ですねぇ…

名前だけ聞くとセキュリティ脆弱性っぽい名前ですが、その類とは全く関係ありません。
Backdoor は ESXi ホストと仮想マシンとの間で情報をやりとりするコミュニケーションインターフェースとなります。

例えば vSphere Client や Host Client で仮想マシンのホスト名や IP アドレスが見える件。
VMware Tools が情報を取得して送っているといえばそうなのですが、仮想マシンから vCenter や ESXi ホストへのネットワーク接続性が無い場合でも vSphere Client / Host Client で情報が見えるのは、 VMware Tools がこの Backdoor インターフェースを利用して情報を ESXi ホストに渡し、vCenter でも見えるようになっているというワケです。

仮想マシンから管理 NW につながらなくても情報が渡されている

逆方向として例えば仮想マシンコンソールで外部から仮想マシンに対してコピー&ペーストでクリップボード内容を渡したり、OVF Environment として外部から仮想マシンメタデータを渡したり*、Invoke-VMScript で仮想マシン内でスクリプトを実行させたり etcetc と、ネットワークに依存せずに仮想マシン内に対して情報を持って行ったり処理をコールしたりでもこの Backdoor インターフェースを介して行われます。

* OVF Env は vmtoolsd なり vmware-rpctool なりで仮想マシン側がトリガーになって ESXi ホスト側を呼び出し、レスポンスとして設定された OVF Env 受け取っているっぽいので逆方向ではないですね…(12/25 追記)
OVF Env、仮想マシン外で設定されたメタデータ仮想マシン内に渡されている

前述の通り TCP/IP ネットワークに依存しないので、仮想マシンと vCenter や ESXi ホストの管理ネットワークとの接続性は関係なく、ESXi ホスト内でホストと仮想マシンの間で何らかのインターフェースでやりとりを行っています。
Backdoor インターフェース、ネットワークを介さず仮想マシンとやりとり

Backdoor…とは一体何なのか

その正体を確かめるため、我々調査隊は open-vm-tools レポジトリの奥地へ向かった―― github.com

ジャングルレポジトリの奥地、我々調査隊がそこで見たものは!?

github.com

Backdoor の実体とは、仮想 CPU として実装されている x86 の IN/OUT 命令をジャックしたものとなります。 例えば以下。

    MOV EAX, 564D5868h                 /* マジックナンバー  */
    MOV EBX, コマンド特有のパラメータ
    MOV CX,  バックドアコマンド番号
    MOV DX,  5658h                          /* VMware I/O ポート */

    IN  EAX, DX

通常であれば CPU は CPU の I/O ポートを経由することで I/O デバイスとやりとりを行います(※ Port Mapped I/O、他に Memory Mapped I/O がある)
この I/O ポートについて、上記のアセンブラのように EAX, EBX, CX レジスタに Backdoor 用マジックナンバー、コマンドパラメータ(option)、コマンド番号 を格納し、DX レジスタに I/O ポート番号を指定して IN 命令を呼び出すことで I/O ポートの先に Backdoor が存在し、Backdoor を経由して ESXi ホストとやりとりが可能となります。

Open VM Tools の実装では C言語インラインアセンブラにてレジスタ値や IN/OUT 命令をコントロールすることで Backdoor を制御しています。

また、Open VM Tools 自体は CPU の IN/OUT 命令を呼び出して Backdoor を利用しているだけなので、Open VM Tools や VMware Tools がインストールされていなくてもこれらの命令を制御できれば仮想マシン⇔ ESXi ホスト間でのやりとり自体は可能となっています。

RPCI と TCLO

仮想マシン⇔ ESXi ホスト間のやりとりとしては Backdoor インターフェースを用いますが、もう少し高度な機能実装のためのメッセージ交換として RPCI と TCLO と呼ばれる 2つのメッセージチャネルがあります。

使い分けとしては以下らしい。

  • RPCI : 仮想マシン → ESXi ホストへのメッセージ送信、レスポンス受信に利用
  • TCLO : ESXi ホスト → 仮想マシンへイベント送信、受信確認に利用

特に TCLO の方は define している header ファイルをのぞくとそれらしい定義が色々書かれている。一方、RPCI の方は header ファイルが見当たらず個々のコマンドやメッセージが定義されているものではなさそう。 github.com github.com

参考文献


古くからあるが故に一周してドキュメントが埋もれてしまいがちのような…
vSphere の根幹技術であるため、今回サルベージ・再拡散の想いもあって取り上げさせてもらいました。