4月初旬、Sysdig脅威研究チーム(TRT)はAzure VMパスワードリセットおよびVMAccess命名プロセスにおける検出フローを特定しました。このフローにより、攻撃者はAzure VM拡張機能に任意の名前を割り当てることができ、読み取り/書き込みアクセスを取得し、パスワードを変更し、検出されることなく被害者の環境に永続化する機能を持ちます。さらに、Sysdig TRTは、Azure脅威マトリックスで文書化されたこの検出に関するテレメトリが、イベントがトリガーされた際に発火しなかったことを発見しました。特定された時点で、これらの問題を直ちにMicrosoftに報告しました。彼らの公式な対応は以下の通りです:
「調査の結果、リソース名は常にユーザーが指定するものであるため、これはセキュリティ脆弱性と考えられません。」
このレポートはSysdig TRTの調査結果を詳述し、検出推奨事項を探ります。
攻撃対象としてのVM拡張機能
Azure VM拡張機能は、仮想マシンで実行され、展開後の構成と管理タスクを実行するプログラムです。これらはVM上で昇格された権限で実行され、Azure制御プレーンを通じて展開されます。つまり、適切なARM(Azure Resource Manager)権限を持つ者は誰でも、OSレベルのアクセスを必要とせずにVMにコードまたは構成の変更をプッシュできます。
セキュリティ研究者はVM拡張機能の悪用を広く文書化しています。NetSPIはCustomScriptExtensionおよびRunCommandなどの拡張機能をAzure環境でのラテラルムーブメントとコード実行に使用することに関する研究を公開しています。Microsoft自体のAzure脅威マトリックスマッピングはVM拡張機能を実行と永続化のベクトルとして認識しています。さらに、Sysdig Secureのようなエンタープライズクラウドセキュリティツールは、疑わしい拡張機能の展開についてアラートを発行する検出ルールを備えています。
VMAccess拡張機能は特に機密性が高いものです。VM上のパスワードとSSHキーをリセットし、このフローを通じて、攻撃者はパスワードをリセットして環境内で永続化を維持することができます。Linuxでは、拡張機能の種類はVMAccessForLinuxです(パブリッシャー:Microsoft.OSTCExtensions)。Windowsでは、VMAccessAgentです(パブリッシャー:Microsoft.Compute)。これらは2つの異なるパブリッシャーからの2つの異なる拡張機能かもしれませんが、概念的には同じ操作です。
VMAccess検出ルールは通常、アクティビティログのresourceIdまたはentityフィールド内の拡張機能リソース名に一致し、enablevmaccess、VMAccessForLinux、またはVMAccessAgentのような文字列を探します。
Azure VM上のパスワードリセット検出のフロー
理論的には、Azure VMのパスワードリセットは簡単なはずです。Azure Resource Manager(ARM)制御プレーン経由で実行され、Microsoft.Compute/virtualMachines/extensions/writeとしてAzureアクティビティログに書き込まれます。パスワードリセットを有効にするVM拡張機能には既知の名前があります。名前に一致する検出ルールを作成して完了です。しかし、理論的に真実は実際には常に真実ではありません。
VM拡張機能は単一の既知の名前を持つだけではありません。互いに交換可能に使用する3つ以上の名前を持っています。そして、パスワードをリセットするために使用されるツールに応じて、どの検出ルールも一致しない名前を含め、完全に任意の名前を持つことができることが判明しました。つまり、ここでの命名の創造性に制限はありません。
さらに複雑にするために、成功した拡張機能書き込みのアクティビティログには、拡張機能パブリッシャーまたはタイプが含まれていません。唯一の識別情報は、呼び出し元が制御するリソース名と汎用操作文字列です。VM拡張機能を書き込むことができる任意の攻撃者は、認証情報をリセットし、操作に任意の名前を付けることができます。デフォルト検出ルールはこれを見ることはありません。
VM上のホストおよびネットワークレベルのログ(例:Windowsイベントログと/var/log)もデフォルトではAzureに渡されません。代わりに、各VMに対して構成する必要があります。つまり、VMの制御を失った場合、事前に追加ログを設定していない限り、Azureは攻撃者がVM内で何をしているかについての通知を行いません。
Azure脅威マトリックスによると、ユーザーはこのパスワードリセットを「Validate Deployment」の操作名を含むイベント経由で検出することになっており、Properties_dに「vmaccesswindowspasswordreset」があります。しかし、この検出は2026年4月のSysdig TRTが実行したテスト中に決して発火しませんでした。
3つのチーム、3つの名前
VM拡張機能がARM APIを通じて展開されるとき、URLは次のパターンに従います:
PUT .../virtualMachines/{vm}/extensions/{name}
最後の{name}セグメントは拡張機能リソース名であり、アクティビティログに表示される値です。3つのMicrosoftツールはその名前が何であるべきかについて異なります。
Azureポータル
ポータルは常に、既にインストールされているものに関わらず、LinuxおよびWindows VM両方で、リソース名enablevmAccessでVMAccessを展開します。
Azure CLI
azure-cli/src/azure-cli/azure/cli/command_modules/vm/custom.pyのAzure CLIソースコードは、2016年7月2日以来、同じenablevmAccess値をハードコードしています(PR #482):
# ポータルと同じ名前を使用して、両方のCLIとポータルから更新できるようにします# (VMは同じ拡張機能に対して複数のハンドラーを許可しません)_ACCESS_EXT_HANDLER_NAME = 'enablevmaccess'
ただし、2017年3月(PR #2395)、CLIチームは_get_extension_instance_name()という関数を追加しました。これはVMが既に別の名前でインストールされた拡張機能を持っているかどうかをチェックし、そうであれば、ハードコードされた定数の代わりにその名前を再利用します。理由は「そうでなければ、VMエージェントは2つ以上のハンドラーを拒否する可能性があります。」つまり、CLIはVMの履歴に応じてenablevmaccessまたはVMAccessAgentを送信する可能性があります。
ドキュメント
VMAccessの公式Microsoft Learnドキュメントは、任意のCLI、PowerShell、またはARMテンプレートの例でenablevmaccessを使用していません。2016年4月の最初のバージョンのドキュメントに遡ると(コミット2fde0e40bf)、すべての例は拡張機能の種類の名前を使用しています:Linux用VMAccessForLinux、Windows用VMAccessAgent。
文字列enablevmaccessは2025年3月までドキュメントに表示されず、その後も逐語的なAzureエラーメッセージのトラブルシューティングテーブル内の一部としてのみ表示されました。推奨事項ではなく。
ドキュメントはCLI定数の3ヶ月前のものであり、命名慣例の断片化の明確な系統を示しています。
課題
Azureは制約を強制します:VM上のハンドラータイプごとの1つの拡張機能リソース。ポータルがVMAccessをenablevmAccessとしてインストールし、ユーザーが後でドキュメントに従ってVMAccessForLinuxとして展開する場合、Azureは400 BadRequestで要求を拒否します:「複数のVMExtensionsはハンドラーごとにサポートされていません。」
ただし、名前は任意です。クロスツール テストにより、拡張機能リソース名がツール別に異なることが確立されました。これにより、Sysdig TRTが次に探索した質問につながりました:Azureは名前を検証していますか?
VMAccess拡張機能は、既存のVMAccessハンドラーなしでクリーンなLinux VMにAZ CLIを通じて展開されました。完全に任意のリソース名を使用して:
az rest --method PUT \
--url ".../extensions/my-custom-name-12345?api-version=2024-07-01" \
--body '{
"location": "eastus",
"properties": {
"publisher": "Microsoft.OSTCExtensions",
"type": "VMAccessForLinux",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {},
"protectedSettings": {
"username": "azureuser",
"password": "********"
}
}
}'
Azureはmy-custom-name-12345を受け入れ、パスワードはリセットされ、拡張機能がインストールされました。それを捕捉することになっていた検出はアラートを発火しませんでした。
アクティビティログが示すもの
このパスワード リセットの成功のアクティビティログエントリは、以下の通りです(短縮版):
{
"operationName": {
"value": "Microsoft.Compute/virtualMachines/extensions/write" },
"resourceId": ".../extensions/my-custom-name-12345",
"status": {
"value": "Succeeded" },
"properties": {
"entity": ".../extensions/my-custom-name-12345",
"message": "Microsoft.Compute/virtualMachines/extensions/write" }
}
拡張機能パブリッシャー(Microsoft.OSTCExtensions)とタイプ(VMAccessForLinux)は、成功した拡張機能の書き込みのアクティビティログに存在しません。唯一の識別情報は、任意の呼び出し元が制御するリソース名と汎用操作名Microsoft.Compute/virtualMachines/extensions/writeです。
検出ギャップ
アクティビティログ、resourceId、またはentityフィールド内の既知の拡張機能名に一致する検出ルールは、別の拡張機能リソース名を選択するだけで回避できます。
たとえば、Microsoft.Compute/virtualMachines/extensions/write権限を持つ攻撃者は:
- VMAccessを使用してVMパスワードをリセットします
- 拡張機能に任意の名前を付けます。例えば、
AzureMonitorUpdate、compliance-check、またはその他の無害な文字列 - アクティビティログは任意の名前と汎用
extensions/write操作のみを表示します enablevmaccess、VMAccessForLinux、またはVMAccessAgentに一致する検出ルールは発火しません
全体として、このAzure制御プレーンテレメトリはMITRE ATT&CKテクニックT1036(マスカレード)の明確な例です。
Microsoftはまた、Azure脅威マトリックステクニックAZT501.3:Azure VM Local Administrator Manipulationを通じてこのアクティビティを検出するための追加のガイダンスを提供しています。彼らのドキュメントによると:「成功したリセット後、ログ「Validate Deployment」が作成されます。具体的には、スコープ内で、パスワードリセットが「VMAccessWindowsPasswordReset」で言及されます。また、2つの予想されるイベントを含むログテーブルもあります。前に記載したMicrosoft.Compute/virtualMachines/extensions/writeイベント、および2番目のイベント:Microsoft.Resources/deployments/validate/action
ただし、このアクティビティのテスト中に、Microsoft.Resources/deployments/validate/actionイベントは決して発生しませんでした。つまり、Microsoft提供の検出に関するガイダンスはここで有効ではありませんでした。
推奨事項
resourceIdパス内の拡張機能リソース名も信頼できない検出シグナルです。代わりに、以下の代替案を検討してください:
- 一致させる – 操作名で。
Microsoft.Compute/virtualMachines/extensions/writeは命名に関わらずすべての拡張機能展開をキャプチャします。有効ですが、エンジニアはこのようなことをしばしば行うため、ノイズが多くなり、偽陽性を生成します。 - 関連付ける – Azure Resource GraphまたはExtensions APIと。
Microsoft.Compute/virtualMachines/extensionsのクエリは、インストールされた任意の拡張機能の実際のパブリッシャーとタイプを返します。 - アラート – 機密VMへの任意の拡張機能書き込み。本番環境または高価値のVMの場合、リソース名に関わらず、任意の拡張機能展開は調査を保証します。
結論
Microsoftのポータル、CLI、およびドキュメントチーム間の命名の矛盾は、最終的には、より深い課題に帰結しました。拡張機能リソース名は、検証されていない、呼び出し元が制御する文字列で、セマンティック的な意味がありません。MSFTが提供する検出ガイダンスは効果がありません。この矛盾は、検出ルールが複数のツール表面からのテレメトリに一致する必要があったときにのみ可視化され、それらのルールは自明に回避可能であることが判明しました。モダンなマルチクラウド組織は複雑で、クラウドとのレガシーな相互接続に関連する追加の問題は引き続き発生します。
開示タイムライン
この調査結果は2026年4月7日にMicrosoft Security Response Center(MSRC)に報告されました。2026年5月11日、Microsoftは「調査の結果、リソース名は常にユーザーが指定するものであるため、これはセキュリティ脆弱性と見なされない」と結論付けました。
付録:脅威ハンターのための既知のAzure VM拡張機能名
拡張機能リソース名(/virtualMachines/{vm}/extensions/{name}の{name}セグメント)はアクティビティログに表示されるものです。Azureはそれを検証または制約しません。以下の名前はMicrosoft自体のツールがデフォルトで使用するものです。このリストにない拡張機能リソース名は外れ値であり、調査価値があります。
|
機能 |
VM OS |
拡張機能の種類 |
パブリッシャー |
既知のデフォルトリソース名 |
|
パスワード/SSHリセット |
Linux |
VMAccessForLinux |
Microsoft.OSTCExtensions |
enablevmAccess, VMAccessForLinux |
|
パスワード/RDPリセット |
Windows |
VMAccessAgent |
Microsoft.Compute |
enablevmAccess, VMAccessAgent |
|
任意のスクリプト実行 |
Linux |
CustomScript |
Microsoft.Azure.Extensions |
CustomScript, customScript, config-app |
|
任意のスクリプト実行 |
Windows |
CustomScriptExtension |
Microsoft.Compute |
CustomScriptExtension, config-app |
|
任意のスクリプト実行 |
Linux |
RunCommandLinux |
Microsoft.CPlat.Core |
RunCommandLinux, RunCommand |
|
任意のスクリプト実行 |
Windows |
RunCommandWindows |
Microsoft.CPlat.Core |
RunCommandWindows, RunCommand |
|
Entra IDログイン |
Linux |
AADSSHLoginForLinux |
Microsoft.Azure.ActiveDirectory |
AADSSHLoginForLinux, AADSSHLogin |
|
Entra IDログイン |
Windows |
AADLoginForWindows |
Microsoft.Azure.ActiveDirectory |
AADLoginForWindows, AADLogin |
|
証明書取得 |
Linux |
KeyVaultForLinux |
Microsoft.Azure.KeyVault |
KeyVaultForLinux, KVVMExtensionForLinux |
|
証明書取得 |
Windows |
KeyVaultForWindows |
Microsoft.Azure.KeyVault |
KeyVaultForWindows, KVVMExtensionForWindows |
|
ADドメイン参加 |
Windows |
JsonADDomainExtension |
Microsoft.Compute |
joindomain, JsonADDomainExtension, JoinDomain |
|
ディスク暗号化 |
Linux |
AzureDiskEncryptionForLinux |
Microsoft.Azure.Security |
AzureDiskEncryptionForLinux |
|
ディスク暗号化 |
Windows |
AzureDiskEncryption |
Microsoft.Azure.Security |
AzureDiskEncryption |
|
構成強制 |
Linux |
DSCForLinux |
Microsoft.OSTCExtensions |
DSCForLinux |
|
構成強制 |
Windows |
DSC |
Microsoft.Powershell |
Microsoft.Powershell.DSC, DSC |
|
ポリシー/コンプライアンス監査 |
Linux |
ConfigurationForLinux |
Microsoft.GuestConfiguration |
AzurePolicyforLinux, ConfigurationForLinux |
|
ポリシー/コンプライアンス監査 |
Windows |
ConfigurationforWindows |
Microsoft.GuestConfiguration |
AzurePolicyforWindows, ConfigurationforWindows |
|
監視エージェント |
Linux |
AzureMonitorLinuxAgent |
Microsoft.Azure.Monitor |
AzureMonitorLinuxAgent |
|
監視エージェント |
Windows |
AzureMonitorWindowsAgent |
Microsoft.Azure.Monitor |
AzureMonitorWindowsAgent |
|
監視エージェント(非推奨) |
Linux |
OmsAgentForLinux |
Microsoft.EnterpriseCloud.Monitoring |
OmsAgentForLinux, OMS.Linux |
|
監視エージェント(非推奨) |
Windows |
MicrosoftMonitoringAgent |
Microsoft.EnterpriseCloud.Monitoring |
MicrosoftMonitoringAgent, MMAExtension |
|
依存関係追跡 |
Linux |
DependencyAgentLinux |
Microsoft.Azure.Monitoring.DependencyAgent |
DependencyAgentLinux, DAExtension |
|
依存関係追跡 |
Windows |
DependencyAgentWindows |
Microsoft.Azure.Monitoring.DependencyAgent |
DependencyAgentWindows, DAExtension |
|
ネットワーク監視 |
Linux |
NetworkWatcherAgentLinux |
Microsoft.Azure.NetworkWatcher |
AzureNetworkWatcherExtension, NetworkWatcherAgentLinux |
|
ネットワーク監視 |
Windows |
NetworkWatcherAgentWindows |
Microsoft.Azure.NetworkWatcher |
AzureNetworkWatcherExtension, NetworkWatcherAgentWindows |
|
診断(非推奨) |
Linux |
LinuxDiagnostic |
Microsoft.Azure.Diagnostics |
LinuxDiagnostic |
|
診断(非推奨) |
Windows |
IaaSDiagnostics |
Microsoft.Azure.Diagnostics |
Microsoft.Insights.VMDiagnosticsSettings, IaaSDiagnostics |
|
VMバックアップスナップショット |
Linux |
VMSnapshotLinux |
Microsoft.Azure.RecoveryServices |
VMSnapshotLinux |
|
VMバックアップスナップショット |
Windows |
VMSnapshot |
Microsoft.Azure.RecoveryServices |
VMSnapshot |
|
マルウェア対策 |
Windows |
IaaSAntimalware |
Microsoft.Azure.Security |
IaaSAntimalware |
|
デスクトップ背景情報 |
Windows |
BGInfo |
Microsoft.Compute |
BGInfo |
|
GPUドライバー |
Linux |
NvidiaGpuDriverLinux |
Microsoft.HpcCompute |
NvidiaGpuDriverLinux |
|
GPUドライバー |
Windows |
NvidiaGpuDriverWindows |
Microsoft.HpcCompute |
NvidiaGpuDriverWindows |
クラウド検出と応答



