CVE-2023-6080: サードパーティ製インストーラの悪用に関するケーススタディ
Mandiant
※この投稿は米国時間 2025 年 2 月 4 日に、Google Cloud blog に投稿されたものの抄訳です。
概要
-
Lakeside Software の SysTrack インストーラで Microsoft ソフトウェア インストーラ(MSI)の修復アクションを悪用して任意のコードの実行を可能にする不正プログラムを Mandiant が特定。
-
脆弱なバージョンの SysTrack を実行しているシステムの場合、アクセス権限の低い攻撃者が、ローカルで権限を昇格できることが判明。
-
この脆弱性について、Mandiant は責任をもって Lakeside Software に開示。この問題はバージョン 11.0 で解決済み。
はじめに
以前に投稿された Mandiant のブログ「サードパーティの Windows インストーラを介した権限のエスカレーション」でご紹介したインサイトに基づいて、このケーススタディでは、サードパーティの Windows インストーラを保護するという継続的な課題について取り上げます。これらの脆弱性は、Microsoft ソフトウェア インストーラ(MSI)カスタム アクションを作成する際の安全でないコーディング手法に起因しており、存在しないファイルへの参照、無効なショートカット、安全でないフォルダ権限によって引き起こされる可能性があります。このような見落としが、攻撃者による権限昇格を可能にする欠陥を生むことにつながります。
以前のブログ投稿でも取り上げたように、ソフトウェアを MSI ファイルでインストールすると、Windows はこの MSI ファイルを C:\Windows\Installer フォルダにキャッシュし、後で使用できるようにします。これにより、システム上のユーザーは「修復」機能を利用できるようになります。この機能は、インストールされたソフトウェアに影響を及ぼす可能性のあるさまざまな問題に対処することを目的としています。MSI 修復の実行中には、いくつかの操作(ファイルの作成や実行など)が NT AUTHORITY\SYSTEM コンテキストからトリガーされる場合があります。権限の低いユーザーが開始した場合でもトリガーされるため、権限昇格の操作が行われる可能性があります。
このブログ投稿では、Mandiant が Lakeside Software の SysTrack Agent バージョン 10.7.8 で特定したローカル権限昇格の脆弱性である CVE-2023-6080 の発見と悪用について特に焦点を当てます。
SysTrack インストーラの悪用
Mandiant は、まず Microsoft の Process Monitor(ProcMon)を使用して、SysTrack の MSI の修復プロセス中に実行されたファイル操作を分析および確認しました。その結果、権限の低いユーザーとして修復プロセスを実行している間、MSIExec.exe によってファイルの作成や実行がユーザーの %TEMP% フォルダ内で行われていることがわかりました。


図 1: MSIExec.exe の実行により、ユーザーの %TEMP% フォルダで .tmp ファイルがコピーされ実行されている例
修復機能を実行するたびに、MSIExec.exe
が数式に基づく名前を使用して新しい .tmp
ファイルを %TEMP%
フォルダに書き込み、実行していました。また、インストーラの動的分析によって、修復機能によって生成されるファイル名は「wac」という文字列に続いて、ランダムに選択された 4 つの 16 進文字(0~9、A~F)で構成されていることを発見しました。この命名規則では、使用される可能性があるファイル名が 65,535 通りありました。
権限の低いユーザーによって %TEMP
% フォルダが書き込み可能であるため、Mandiant は、使用される可能性があるすべてのファイル名が %TEMP%
フォルダ内にすでに存在する場合について、修復ツールの動作をテストしました。そのために、wac0000.tmp
から wacFFFF.tmp
の範囲で、各ファイル名に任意のテスト実行可能ファイルをコピーする PowerShell スクリプトを作成しました。
# ファイル群へのパス
$csvFilePath = ‘.\permutations.csv’
# 実行ファイルへのパス
$exePath = ‘.\test.exe’
# ターゲット ディレクトリ(システムの一時ディレクトリを使用)
$targetDirectory = [System.IO.Path]::GetTempPath()
# csv ファイルの内容を読み取る
$csvContent = Get-Content -Path $csvFilePath
# コンテンツを個々の値に分割
$values = $csvContent -split “,”
# 各値をループし、exe を新しい名前でターゲット ディレクトリにコピー
Foreach ($value in $values) {
$newFilePath = Join-Path -Path $targetDirectory -ChildPath ($value + “.tmp”)
Copy-Item -Path $exePath -Destination $newFilePath
}
Write-Output “Copy operation completed to $targetDirectory”
図 2: 使用される可能性があるすべての .tmp ファイルを %TEMP% に作成する例


図 3: %TEMP% に作成された .tmp ファイルの一部
すでに特定した名前空間をすべて使い果たした後、MSI の修復機能を再度実行し、その後の挙動をモニタリングしました。ProcMon の出力を検証したところ、名前空間を使い果たした場合、アプリケーションはインクリメント型のファイル名パターンにフェイルオーバーすることがわかりました。このパターンは wac1.tmp で始まり、前のファイルが存在する場合、そのたびに予測可能なパターンで数値がインクリメントされます。Mandiant は、この理論を証明するために、手動で wac1.tmp
と wac2.tmp
を作成し、MSI の修復アクションを ProcMon でモニタリングしました。MSI の修復機能を実行すると、wac3.tmp
という名前のファイルが作成されました。


図 4: 予測した .tmp ファイルを MSIExec.exe が作成および実行した例
さらに、ファイルの作成と実行のアクションの間に若干の遅延があることがわかりました。これは潜在的に、競合状態を悪用する脆弱性につながる可能性があります。事前に定めたファイル名をプログラムに使用させることが可能になったため、次に Mandiant は競合状態を回避する別の PowerShell スクリプトを作成しました。このスクリプトは、ファイルの作成と実行の間に、予測したファイル名を使用してファイル(test.exe
)を %TEMP%
フォルダにコピーすることで、MSIExec.exe
によって作成されたファイルを上書きします。このテストで使用する test.exe
は、シンプルな概念実証用の実行可能ファイルで、cmd.exe
を起動します。
while ($true) {
if (Test-Path -Path "C:\Users\USER\AppData\Local\Temp\wac3.tmp") {
Copy-Item -Path "C:\Users\USER\Desktop\test.exe" -Destination
"C:\Users\USER\AppData\Local\Temp\wac3.tmp" -Force
}
}
図 5: 競合状態を回避する PowerShell スクリプトで任意のファイルを %TEMP% にコピーする例
%TEMP%
フォルダに wac1.tmp
ファイルと wac2.tmp
ファイルが作成された状態で、wac3.tmp
をターゲットとする PowerShell スクリプトと MSI 修復アクションの両方を実行しました。競合状態を回避するスクリプトと、修復アクションが実行された結果、test.exe
ファイルが意図したバイナリを上書きし、その後、MSIExec.exe
が実行され、cmd.exe
が NT AUTHORITY\SYSTEM
で起動されました。


図 6: NT\ AUTHORITY SYSTEM コマンド プロンプトを取得する例
防御における考慮事項
Mandiant の以前のブログ投稿で説明されているように、正しく構成されていないカスタム アクションは発見や悪用が容易であるため、組織にとって重大なセキュリティ リスクとなります。ソフトウェア開発者は、安全なコーディング手法に従い、実装されたカスタム アクションを確認することが不可欠です。これにより、MSI の修復機能によって引き起こされる、高い権限を必要とする操作の不正使用を防ぐことができます。カスタム アクションの設定に関する一般的なベスト プラクティスについては、元のブログ投稿をご覧ください。Mandiant は、CVE-2023-6080 の発見において、NT AUTHORITY\SYSTEM
への権限昇格を可能にするいくつかの構成ミスと見落としを特定しています。
SysTrack MSI が行うファイル操作には、ユーザーの %TEMP%
フォルダでの作成や実行が含まれます。これにより、権限の低いユーザーでも、権限の高いコンテキストでアクティブに使用されるファイルを変更する機会を得ることができます。ソフトウェア開発者は、フォルダのアクセス権を常に意識し、特別な権限が必要なファイル操作は、適切に保護されているフォルダから実行されるように留意する必要があります。これには、フォルダの読み取り / 書き込み権限を変更することや、C:\Program Files
や C:\Program Files (x86)
などの組み込みフォルダを使用することが含まれます。これらのフォルダは、本質的に権限の低いユーザーから保護されています。
さらに、ソフトウェアのファイル名生成スキーマに備わるフェイルオーバー メカニズムによって、攻撃者はアプリケーションに事前に定めたファイル名を使用させることができました。ランダムなファイル名を使用する場合、開発者は十分に長いファイル名を使用すべきです。そうすることで、攻撃者が使用可能なファイル名をすべて網羅したり、アプリケーションに予期しない動作を強制したりすることができなくなります。このケースでは、実行前にターゲットのファイル名を知ることで、MSIExec.exe
によって作成されてから実行されるまでの間にターゲットのファイルを動的に識別して置き換えるよりも、競合状態を回避することがはるかに容易になります。
セキュリティの専門家が考慮すべきこととして、企業内のマシン上で実行されているプログラムの安全性もあります。承認済みのアプリケーションの多くには、セキュリティ上の脆弱性が意図せず含まれていることがあり、それが環境内のリスクを高めてしまう可能性があります。Mandiant では、組織レベルで多層防御が維持されるよう、企業が個々のエンドポイントのセキュリティを監査することを推奨しています。さらに、可能であれば、権限昇格の試みを警告するために、cmd.exe
や powershell.exe
などの管理シェルが昇格コンテキストで生成されることをモニタリングする必要があります。
おわりに
ドメインの権限昇格は、セキュリティ ベンダーやペネトレーション テストで注目されることが多いものの、企業環境における権限昇格やデータの完全性に起因する侵害の唯一の経路というわけではありません。1 つのシステムで完全性が損なわれると、攻撃者はネットワーク全体にわたってさらなる攻撃を仕掛けることが可能になります。たとえば、SCCM が使用するネットワーク アクセス アカウントは、単一のワークステーションを通じて侵害される可能性があり、誤って構成された場合、ドメイン内の権限昇格に使用され、ネットワーク内の他のシステムへの移動を許してしまう可能性があります。
Mandiant が提供している専用のエンドポイント セキュリティ評価サービスでは、権限昇格を試みる権限の低い攻撃者の視点を含む、複数のコンテキストから顧客のエンドポイントをテストします。包括的なエンドポイント セキュリティ評価を含む Mandiant の技術コンサルティング サービスの詳細については、ウェブサイトをご覧ください。
Mandiant 在籍時にこの脆弱性を発見したテストチームのメンバーであった Andrew Oliveau 氏に感謝の意を表します。
CVE-2023-6080 開示の経緯
- 2024 年 6 月 13 日 - Lakeside Software が脆弱性について報告を受ける
- 2024 年 7 月 1 日 - Lakeside Software が脆弱性を確認
- 2024 年 8 月 7 日 - 確認された脆弱性をバージョン 11.0 で修正
-Mandiant、執筆者: Jacob Paullus、Daniel McNamara、Jake Rawlins、Steven Karschnia