vCenter 7.0.3a に CVE-2021-44228 Workaround を適用する

クリスマス前に大騒ぎですが,Japan VMUG もアクティブメンバーのみなさんが昼夜を問わずに情報整理・提供してくれていて,本当に頭が下がります.VMware 製品群に関しては,VMSA-2021-0028 が公開された直後は Workaround は vROPs くらいしか情報なかったのですが,やっと vCenter の Workaround も KB87081 として公開されたので,早速 7.0.3 の vCSA に適用してみました.すぐに日本語化されるとは思いますが,困っている初心者の方もいらっしゃるかと思いますので,一通り手順を書いておきたいと思います.


0. vCenter へ ssh で接続

root ユーザーで vCenter へ ssh で接続します.

$ ssh root@vcsa.tcpninja.net

VMware vCenter Server 7.0.3.00100

Type: vCenter Server with an embedded Platform Services Controller

root@vcsa.tcpninja.net's password: 
Connected to service

    * List APIs: "help api list"
    * List Plugins: "help pi list"
    * Launch BASH: "shell"

Command> 

shell と入力して Bash に入りましょう.

Command> shell
Shell access is granted to root
root@vcsa [ ~ ]# 

ここから,3 つのサービスと 1 つのユーティリティに対して,それぞれ対応していきます.
各サービスの役割に関心のある方は,6.7 の PSC サービスの説明など参考にしてみてください.


1. vMON サービス

/usr/lib/vmware-vmon/java-wrapper-vmon でオプション指定が出来るようです.まず,変更前にファイルのバックアップをとっておきましょう.

root@vcsa [ ~ ]# cp -p /usr/lib/vmware-vmon/java-wrapper-vmon /usr/lib/vmware-vmon/java-wrapper-vmon.bak

java-wrapper-vmon の最終行に,-Dlog4j2.formatMsgNoLookups=true の設定を加えます.7.0 でも Build によって記載方法が異なるようなので,ご自身の環境に合わせて設定しましょう.私の環境は 7.0.3a なので,vi 等使って以下の通りに最終行を変更します.

■変更前最終行

exec $java_start_bin $jvm_dynargs $security_dynargs $original_args

■変更後の最終 2 行

log4j_arg="-Dlog4j2.formatMsgNoLookups=true"
exec $java_start_bin $jvm_dynargs $log4j_arg $security_dynargs $original_args

Java オプションを変数 log4j_arg に入れて,実行時に加えてあげてるだけですね.
vCenter サービスを再起動しましょう.

まず,service-control --stop --all で停止.

root@vcsa [ ~ ]# service-control --stop --all
Operation not cancellable. Please wait for it to finish...
Performing stop operation on service observability...
Successfully stopped service observability
Performing stop operation on service vmware-pod...
Successfully stopped service vmware-pod
Performing stop operation on service vmware-vdtc...
Successfully stopped service vmware-vdtc
Performing stop operation on profile: ALL...
Successfully stopped service vmware-vmon
Successfully stopped profile: ALL.
Performing stop operation on service vmcad...
Successfully stopped service vmcad
Performing stop operation on service vmdird...
Successfully stopped service vmdird
Performing stop operation on service vmafdd...
Successfully stopped service vmafdd
Performing stop operation on service lwsmd...
Successfully stopped service lwsmd
root@vcsa [ ~ ]#

しっかり落ちたので,service-control --start --all します.

root@vcsa [ ~ ]# service-control --start --all
Operation not cancellable. Please wait for it to finish...
Performing start operation on service lwsmd...
Successfully started service lwsmd
Performing start operation on service vmafdd...
Successfully started service vmafdd
Performing start operation on service vmdird...
Successfully started service vmdird
Performing start operation on service vmcad...
Successfully started service vmcad
Performing start operation on profile: ALL...
Successfully started service vmware-vmon
Successfully started profile: ALL.
Performing start operation on service observability...
Successfully started service observability
Performing start operation on service vmware-vdtc...
Successfully started service vmware-vdtc
Performing start operation on service vmware-pod...
Successfully started service vmware-pod
root@vcsa [ ~ ]# 

確認手順も KB87081 中に記載があるので,その通りに実行してみましょう.
vMON の場合はプロセス参照して formatMsgNoLookups キーワードでひっかけるようです.
出力が多いので 1 つだけで省略しますが,私の環境では 21 個のプロセスでオプションが有効になっている事が確認できました.

root@vcsa [ / ]# ps auxww | grep formatMsgNoLookups
eam        3940  1.4  1.6 2681088 318080 ?      Sl   16:07   0:38 /usr/java/jre-vmware/bin/vmware-eam.launcher -Xmx128m -XX:CompressedClassSpaceSize=64m -Xss256k -XX:ParallelGCThreads=1 -Dlog4j2.formatMsgNoLookups=true -Djava.ext.dirs=/usr/java/jre-vmware/lib/ext:/opt/vmware/jre_ext:/usr/java/jre-vmware/lib/ext-fips -Dorg.bouncycastle.fips.approved_only=true -Dorg.bouncycastle.jca.enable_jks=true -Djava.security.properties==/etc/vmware/java/vmware-override-fips-java.security -Dvim.versions.path=/etc/vmware/../vmware-vpx/docRoot/sdk/vimServiceVersions.xml -Dextension.descriptor.path=/etc/vmware/../vmware-eam/firstboot/extension/extension.xml.installer -Djava.endorsed.dirs=/var/opt/apache-tomcat/endorsed -Dcatalina.home=/var/opt/apache-tomcat -Dcatalina.base=/usr/lib/vmware-eam/web -Dcatalina.config=file:/etc/vmware/../vmware-eam/catalina.properties -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/vmware/eam -XX:ErrorFile=/var/log/vmware/eam/java_error%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintReferenceGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1024K -Xloggc:/var/log/vmware/eam/vmware-eam-gc.log -Duser.timezone=UTC -classpath /etc/vmware/../vmware-eam/:/var/opt/apache-tomcat/lib/servlet-api.jar:/var/opt/apache-tomcat/bin/tomcat-juli.jar:/var/opt/apache-tomcat/bin/bootstrap.jar:/usr/lib/vmware/common-jars/spring-core-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-context-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-beans-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-web-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/log4j-api-2.11.0.jar:/usr/lib/vmware/common-jars/log4j-1.2-api-2.11.0.jar:/usr/lib/vmware/common-jars/log4j-core-2.11.0.jar:/usr/lib/vmware/common-jars/commons-lang-2.6.jar:/usr/lib/vmware/common-jars/commons-codec-1.6.jar:/usr/lib/vmware/common-jars/commons-logging-1.1.3.jar:/usr/lib/vmware/common-jars/httpclient-4.5.12.jar:/usr/lib/vmware/common-jars/httpcore-4.4.13.jar:/usr/lib/vmware/common-jars/httpasyncclient-4.1.4.jar:/usr/lib/vmware/common-jars/httpcore-nio-4.4.13.jar:/usr/lib/vmware/common-jars/jackson-core-2.11.4.jar:/usr/lib/vmware/common-jars/jackson-databind-2.11.4.jar:/usr/lib/vmware/common-jars/spring-webmvc-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-expression-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/log4j-web-2.12.1.jar:/usr/lib/vmware/common-jars/log4j-appserver-2.12.1.jar:/usr/lib/vmware/common-jars/log4j-jcl-2.11.0.jar:/usr/lib/vmware/common-jars/stax2-api-3.0.1.jar:/usr/lib/vmware/common-jars/woodstox-core-asl-4.0.5.jar:/usr/lib/vmware/common-jars/jackson-annotations-2.11.4.jar:/usr/lib/vmware/common-jars/commons-io-1.4.jar:/usr/lib/vmware/common-jars/slf4j-api-1.7.30.jar:/usr/lib/vmware/common-jars/slf4j-log4j12-1.7.30.jar org.apache.catalina.startup.Bootstrap start
(省略)


2. Update Manager サービス

/usr/lib/vmware-updatemgr/bin/jetty/start.ini を変更します.ファイルのバックアップをとって始めましょう.

root@vcsa [ ~ ]# cp -p /usr/lib/vmware-updatemgr/bin/jetty/start.ini /usr/lib/vmware-updatemgr/bin/jetty/start.ini.bak

start.ini の最終行に,-Dlog4j2.formatMsgNoLookups=true を加えるだけ,Build による差異もありません.

■変更前

(省略)
# Initialize module deploy
#
--module=deploy
## DeployManager configuration
# Monitored Directory name (relative to jetty.base)
# jetty.deploy.monitoredDirName=webapps

■変更後

(省略)
# Initialize module deploy
#
--module=deploy
## DeployManager configuration
# Monitored Directory name (relative to jetty.base)
# jetty.deploy.monitoredDirName=webapps
-Dlog4j2.formatMsgNoLookups=true

Update Manager サービスを再起動します.

root@vcsa [ ~ ]# service-control --restart vmware-updatemgr
Successfully restarted service updatemgr
root@vcsa [ ~ ]# 

オプションが有効になったか確認しましょう. jetty のディレクトリまで降りて
java -jar start.jar --list-config を打ってみます.

root@vcsa [ / ]# cd /usr/lib/vmware-updatemgr/bin/jetty
root@vcsa [ /usr/lib/vmware-updatemgr/bin/jetty ]# java -jar start.jar --list-config
(省略)
Properties:
-----------
 java.version = 1.8.0_291
(省略)
 log4j2.formatMsgNoLookups = true
(省略)

true になっていますね.


3. Analytics サービス

log4j が 2.10.0 前のバージョンなので,JndiLookup クラスをクラスパスから削除して対応します.
これまでと同様,ファイルのバックアップをとってから始めましょう. 対象ファイルは /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar です.

root@vcsa [ ~ ]# cp -p /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar.bak

zip コマンドで JndiLookup.class を無効化します.
zip コマンドオプション -d で .jar アーカイブから指定したファイルを削除,-q は処理内容非表示です.(warning が大量に出るので,-q はつけて実行するのがおすすめです.)

root@vcsa [ / ]# zip -q -d /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

Analytics サービスを再起動します.

root@vcsa [ / ]# service-control --restart vmware-analytics
Successfully restarted service analytics
root@vcsa [ ~ ]# 

こちらも確認してみましょう.jndilookup 探して戻りが 0 なら OK.

root@vcsa [ / ]# grep -i jndilookup /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar | wc -l
0

大丈夫ですね!ちなみに,対策実施していない場合には 1 が戻ります.


4. DBCC ユーティリティ

いよいよ最後です.こちらも JndiLookup クラスを削除します.
対象ファイルは /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar です.
毎回面倒かもしれませんが,バックアップとってから作業しましょう.

root@vcsa [ ~ ]# cp -p /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar.bak

Analytics サービスの時と同様,zip コマンドでクラスを削除します.

root@vcsa [ / ]# zip -q -d /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

jndilookup 探して確認しましょう.

root@vcsa [ / ]# grep -i jndilookup /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar | wc -l
0


5. まとめ

KB が英語なので読むの面倒かとは思いますが,Workaround 個々に見れば単純作業です.CVSS のスコアが 10.0 と高いので,是非早期対応を心がけてください.