過大な権限を持つSASトークンがPC Managerのサプライチェーンを侵害するリスク:脆弱性「ZDI-23-1527」と「ZDI-23-1528」
トレンドマイクロのZero Day Initiative™(ZDI)が特定したMicrosoft PC Managerのサプライチェーンを侵害しかねない脆弱性「ZDI-23-1527」と「ZDI-23-1528」について、SASトークンの不正利用を伴う2種の攻撃シナリオをベースに解説します。
- 過大な権限を持つSAS(共有アクセス署名)トークンが引き金となってWindows関連ツール「PC Manager」のリリースファイルが改変される攻撃シナリオを解説します。改変の経路として、WinGetのリポジトリや短縮URL「aka.ms」、Microsoftの公式サブドメインなどが含まれます。
- 実際に本攻撃シナリオが発生した場合、サイバー犯罪者によってPC Managerのリリース対象ファイルが改変、またはマルウェアに置き換えられ、ユーザ環境に配布された可能性があります。これは、ソフトウェアのサプライチェーン攻撃に相当します。
- 当該の問題は、すでにMicrosoft側に報告済みであり、解決されています。本稿では、類似の攻撃を防ぐ上で重要な対策や推奨事項について解説します。
- 本稿は、2023年に実施したセキュリティ調査の結果をまとめたものです。それ以降、Microsoft社からはAzure報奨プログラム(Azure Bounty Program)のルール(Rules of Engagement)に関する更新事項や追加のガイドラインが発表されています。本稿の内容は、教育的目的のみを意図したものです。
はじめに
本稿では、Microsoftの公開資産上で過大な権限が付与されたクラウドサービス資格情報に着目し、それがソフトウェアサプライチェーンやソフトウェアの完全性に及ぼすリスクを解説します。具体的には、Windows管理ツール「PC Manager」のリリース用ファイルが改変される攻撃シナリオを分析します。PC Managerは、ユーザ自身でWindows端末の効率化やセキュリティ関連の調整を行いやすくするツールであり、一時ファイルのクリーンアップやスタートアッププログラムの管理、システムヘルスの監視、全体的なパフォーマンスの向上などをサポートします。
今回分析する攻撃シナリオとして、パッケージマネージャ「WinGet」に関連するものと、PC Managerの公式Webサイトに関連するものの2通りがあります。両シナリオとも、過大な権限が付与されたSAS(Shared Access Signature:共有アクセス署名)トークンに起因し、悪用されると、PC Managerのリリースファイルを改変される可能性があります。こうした不正な改変は、ソフトウェアの配布プロセスやその信頼性に影響を及ぼすものであり、結果として、公的に信頼されたリソースやオープンソース型パッケージマネージャを用いるユーザにリスクをもたらします。なお、当該の問題点はすでにMicrosoft側に共有され、解決されています。
今回のセキュリティ課題に対処する手段として、本稿では、過大な権限の付与されたSASトークンを検知する手法や、そのハンティング戦略を防衛チーム向けに提供します。また、ソフトウェアの完全性や広範なソフトウェアサプライチェーンを守る上で、クラウド認証情報の保護がいかに重要であるかを解説します。特に、ソフトウェア配布の公式チャネルやオープンソースチャネルにクラウドサービスを用いている場合、その重要性は一層高まります。
本稿は、2023年に実施したセキュリティ調査の結果をまとめたものです。その後、Microsoft社はAzure報奨プログラム(Azure Bounty Program)のルール(Rules of Engagement)を更新し、追加のガイドラインを発表しました。本稿で挙げるツールや技術の中には、最新ルールで禁止されているものが含まれている可能性もあります。そのため、類似のセキュリティ調査を実施する場合は、事前にMicrosoft社によるバグ報奨プログラムの最新ルールを入念に調べることを推奨します。また、本稿は教育的目的のみを意図したものであり、トレンドマイクロでは法律や倫理に反する活動を一切容認していません。
脆弱性「ZDI-23-1527」: WinGetパッケージによってPC Managerを改変
WinGetは、Windows OS向けのパッケージマネージャであり、WinGetパッケージをインストールするためのコマンドラインインターフェース(CLI)をユーザに提供します。パッケージの内容は、Windowsのマニフェストで定義されます。また、そのYAMLファイルが下記のGitHubリポジトリに用意されています。
GitHubリポジトリ:microsoft/winget-pkgs
図1は、2023年9月時点におけるMicrosoft PC Managerのマニフェストに相当します。図2は、WinGetパッケージのマニフェストスキーマであり、Microsoftの公式ドキュメントに記載されています。


PC ManagerのWinGetマニフェスト(図1)では、「InstallerUrl」の値として下記が設定されています。
https://pcmanager.officeplus.cn/mvp/10000/54247/MSPCManagerOffline_20230918.54247.exe?sv=2021-10-04&se=2024-03-16T09:17:53Z&sr=c&sp=rwdl&sig=qIe380lbv19nAKzFkC1EBBLzQzhtuZwG/M1uyHLCItc=
ユーザが「Microsoft.PCManager.CN」という名前のパッケージをインストールする場合、WinGetのCLIがそのマニフェストを取得し、さまざまなフィールドの値を取り込みます。続いて、「InstallerUrl」の値に応じて対象の実行ファイルをダウンロードします。この際、「InstallerSha256」の値が一致するかどうか、チェックを行います。
当該URLのパラメータ部分(「?」以降の箇所)は、SASトークンに相当します。SASトークンの中には署名データが含まれ、Azureストレージアカウントへのアクセス権を委任する目的で使用されます。署名データ以外にもさまざまなオプション項目が含まれ、これによって、リクエスト元として受け入れるIPアドレスの範囲やリクエスト作成に使用可能なプロトコル、リクエストに紐づくアクセスポリシー識別子などを指定します。SASトークンの種類として、下記の3つが存在します。
PC Managerのマニフェスト(図1)に含まれていたURL(InstallerUrl)は、下記のように分解できます。
リソース:
https://pcmanager.officeplus.cn/mvp/10000/54247/MSPCManagerOffline_20230918.54247.exe
SASトークン:
sv=2021-10-04&se=2024-03-16T09:17:53Z&sr=c&sp=rwdl&sig=qle380lbv19nAKzFkC1EBBLzQzhtuZwG/M1uyHLCItc=
SASトークンのオプション構成については、公式ドキュメントに記載されています。上述したSASトークンの場合、その種別は「サービスSASトークン」であり、下記のオプションを含みます。

本調査では、SASトークン発見時の権限設定や有効期限設定に基づき、PC Managerの実行ファイルを取得する際に用いられるストレージアカウントを特定するに至りました。図3に示すエラーメッセージ内の「UriPath」は、下記のホスト名を踏まえると、Azure中国リージョンのストレージアカウント「distributestorage」を指しています。

攻撃者がこうしたストレージアカウントのホスト名やSASトークンを入手した場合、ツール「Azure Storage Explorer」や「AzCopy」を用いることで、当該SASトークンに付与された読み込み権限や書き込み権限、一覧取得権限を確認、検証できる可能性があります。
なお、トレンドリサーチでは、厳格なガイドラインに従って本調査を実施しました。問題の分析に際し、完全に自身のものと見なせるデータを除き、改変操作などを一切加えていません。調査の全体を通じてトレンドマイクロはMicrosoft社と密に連携をとり、発見した事象の影響を評価し、問題の対処にあたりました。
将来的に同様の調査を検討中のリサーチャー向けに、Microsoft社からは下記のメッセージが提示されています。
- 自身のものでないトークンや認証情報を利用してデータにアクセスすることは、Microsoft Azureの報奨プログラムに関するルール(Rules of Engagement)に違反します。
- 権限過大と見られるSASトークンを発見した場合、ツール「Azure Storage Explorer」によってその有効性を検証する必要はなく、当該トークンの情報をAzure報奨プログラムに報告していただくだけでも結構です。当該トークンについては、Microsoftのセキュリティ対応センター(Security Response Center)側で必要な調査を行い、影響の度合いや範囲を評価します。

コンテナ「mvp」の容量は、358 GiB(または384 GB)であることが分かりました。分析に基づくと、当該のアクセス可能なコンテナの中身として、Microsoft PC Managerのリリースが複数含まれていたと考えられます。

過大な権限が付与されたSASトークンを含むGitHubプルリクエストは、最古のもので2022年11月4日に遡ります。2022年11月から2023年9月の間、ストレージアカウントに置かれたMicrosoft PC Managerの全リリースが、改ざんのリスクに晒されていたと考えられます。
なお、ストレージアカウント内のインストーラが不正に改変された場合も、WinGet CLIの制御により、ダウンロードしたファイルのSHA256ハッシュ値が期待値と異なる旨を警告されます。通常であればそこで疑惑が生じますが、今回は信頼できるエンティティ(WinGetマニフェスト)から配信されていることもあり、ユーザは暗黙の信頼を過信して不正な実行ファイルを起動する可能性があります。
トレンドマイクロは、本件に対して「Zero Day Initiative™(ZDI) 」の脆弱性番号「ZDI-23-1527」を割り当て、Microsoft社に共有しました。
ZDI-23-1528:「pcmanager.microsoft.com」を通してPC Managerを改変
PC Managerについて調査を進めたところ、同ツールをWinGetなしでインストールする手段が、さまざまなブログやYouTube動画、Microsoftの公式フォーラムで述べられていました。その内容に基づくと、WinGetがなくても、Microsoft社が所有する下記の正規サブドメインからPC Managerをダウンロードすることが可能です。
pcmanager.microsoft.com
従って、PC Managerをインストールする手段として、MicrosoftアプリストアやWinGet CLIを介した公式のルート以外にも、上記ドメインを用いた別方式が存在することになります。
実際に当該ドメインから実行ファイルがダウンロードされる仕組みを調べたところ、その中から注目すべき手続きが見出されました。

上図の画面でユーザがダウンロード(Download)ボタンをクリックすると、下記サイト側に転送(リダイレクト)されます。
aka.ms/PCManager500000
「aka.ms」は、Microsoftの公式なリンク短縮サービスであり、短くて共有しやすいURLを作成し、それを長くて複雑なURLにリダイレクトさせることが可能です。本サービスは、Microsoftのさまざまなサービスや製品、リソースに導入され、メールやプレゼンテーション、ソーシャルメディアなどでのリンク共有に利用されています。
こうした「aka.ms」を含むURLが、MicrosoftサポートフォーラムのPC Managerに関するトピック内で言及されていました。下記に、最終的な実行ファイルのダウンロード用URLを示します。
https://pcmdistributestorage.blob.core.windows.net/mvp/500000/52752/MSPCManagerSetup.exe?sv=2021-10-04&se=2024-03-06T05%3A53%3A27Z&sr=c&sp=rwdl&sig=m4niDUHZxUz%2BZnSvzuebFIl0EINy5xZL87nolDEHZIQ%3D
前回の図3で示した内容と比べると、今回は対象のストレージアカウントやSASトークンの内容(「?sv」から始まる部分)に差異が見られます。本SASトークンの詳細を、下記に示します。
- 有効期限は2024年3月6日となっている。
- コンテナおよびオブジェクトレベルのAPI操作を許可している。
- 権限設定により、「rwdl(読み込み、書き込み、削除、一覧取得)」の操作を許可している。
当該の過大な権限の付与されたSASトークンを用いることで、Azure Globalに属する下記ストレージアカウントのコンテナ「mvp」やblobデータに「読み込み、書き込み、削除、一覧取得」の操作を行えることが判明しました。
ストレージアカウント「pcmdistributestorage」
また、コンテナ「mvp」の容量は118 GiB(または126.7 GB)であり、下記ドメインから配布されるPC Managerのリリースを複数格納している可能性があります。
pcmanager.microsoft.com

将来的に同様の調査を検討中のリサーチャー向けに、Microsoft社からは下記のメッセージが提示されています。
- 自身のものでないトークンや認証情報を利用してデータにアクセスすることは、Microsoft Azureの報奨プログラムに関するルール(Rules of Engagement)に違反します。
- 権限過大と見られるSASトークンを発見した場合、ツール「Azure Storage Explorer」によってその有効性を検証する必要はなく、当該トークンの情報をAzure報奨プログラムに報告していただくだけでも結構です。当該トークンについては、Microsoftのセキュリティ対応センター(Security Response Center)側で必要な調査を行い、影響の度合いや範囲を評価します。
今回の手口は、先述したWinGetマニフェストの「InstallerUrl」を用いる手口と比べ、下記の公式Webサイトを元手にPC Managerのリリースファイルを改変してサプライチェーン攻撃に繋げられる点で、脅威の度合いが強いと考えられます。
pcmanager.microsoft.com
さらに、PC Managerのバージョンによっては自動アップデートがデフォルトで有効化されていることも、事態を悪化させます。この点を利用して攻撃者は、PC Managerがデフォルト設定のまま稼働している全環境に、正規のインストーラに扮した不正なファイルを自動で配布できる可能性があります。
なお、ストレージアカウントには証明書がなかったため、攻撃者が不正なMSIインストーラにデジタル署名を施すことは、難しいと考えられます。しかし、過去に流出した証明書を用いて不正なスクリプトやバイナリを署名し、それをZIPファイルに格納させるなどの手口で、暗黙的な信頼を逆手によるケースも考えられます。
トレンドマイクロは、本件に対してZDIの脆弱性番号「ZDI-23-1528」を割り当て、Microsoft社に共有しました。
問題の解決
トレンドマイクロの報告を受け、Microsoft社はまず、過大な権限が付与されていた問題のSASトークンを「読み取りのみ」に制限しました。後に、リンク自体をMicrosoftアプリストアのURLに変更し、実行ファイルの直接的ダウンロードに繋がる経路を遮断しました。WinGetのマニフェストについても、2023年10月25日付けのGitHubプルリクエスト(参照1件目、2件目)により、問題のSASトークンを削除しました。
課題
SASトークンの作成はクライアント側で行われ、その際にAzureログなどは作成されません。アカウントSASのトークンも、サービスSASのトークンも、共有アクセス鍵から作成されます。そのため、もしストレージアカウントのアクセス鍵が流出すれば、攻撃者はそれを用いて過大な権限を持つSASトークンを多数作成し、外部からストレージアカウントにアクセスする経路を長期的に確保できるようになります。ユーザ側でSASトークンを無効化する場合、「Store Access Policy(保存されたアクセスポリシー)」を利用するか、アクセス鍵を変更(ローテーション)する必要があります。しかし、アクセス鍵を変更すれば、これまでに作成済みのSASトークンが全て無効化されるため、影響に関する検討が求められます。
検知の手立て
SASトークンによるストレージアカウントへのアクセスを検知、分析する際には、「Azure Storage Analyticsログ」が有効な手がかりとなります。留意点として、用法によっては相応の手間や負担が生じます。まず、SASトークン内の署名フィールド「sig」はログに記録されないため、SASトークンをそのままの状態で検索することは困難です。しかし、「Authentication Hash(認証ハッシュ)」を利用することで、どのSASトークンが使用されているかを特定しやすくなります。また、ストレージアカウントがSASトークン経由でアクセスされた際には、ログを通して下記の事柄を確認できます。防御チームでは、こうした考えをもとに、利用中の環境やツールに適した検知クエリを作成できると考えられます。
- 情報流出:多量のデータが既知の不正または不審なIPアドレスに送信されていることを検知するには、Azure Storage Analyticsログの項目「response-packet-size」が有用な手がかりとなります。
- 過大な権限を持つSASトークン:過大な権限を持つSASトークンによってストレージアカウントがアクセスされているか調べる際には、項目「-url」に含まれるパラメータ「sp(SASの権限設定)」が有用な手がかりとなります。
- 匿名アクセス:ストレージアカウントに対する匿名アクセスが許可されているかを判定する際には、項目「authentication-type」が有用です。
- ファイル名のヒューリスティック分析:既知の不正なIPアドレスから機密ファイルへのアクセス要求を検知したい場合は、項目「requested-object-key」を調べることで、要求されたファイルの名前を確認できます。ヒューリスティックな検知パターンとして、「.env」や「.password」、「.config」、「.secret」、「auth」などが有効です。
- 不正なIP:不正なIPアドレスからストレージアカウントへのアクセスを検知したい場合は、項目「requester-ip-address」が有効な手がかりとなります。
- 匿名リクエストやSASトークンリクエスト:匿名リクエストやSASトークンのリクエストを検知したい場合は、下記の判定式が有用です。
a. requester-account-name == ''
b. request-status == success - 不審なユーザエージェント:不審なユーザエージェントを検知する際には、項目「user-agent-header」の値を取得し、それが既知のブロック対象リストに含まれているかを判定する方式が有効です。攻撃者はユーザーエージェント値を偽装できますが、少なくとも、内部環境からのノイズを削減する上で効果があります。
過大な権限の付与されたSASトークンをコードベースから発見する際には、以降に述べるチェック方式が有効です。
まず、サービスSASトークンの場合はURLのホスト部が変わるため、パラメータ「sv」、「se」、「sr」、「sp」、「sig」のみがチェック対象となります。その詳細を、下記に示します。
値のチェック
- sp(SASトークンの権限情報):「rw」で始まる値が設定されていること
- se(SASトークンの有効期限):現在日時より未来の値が設定されていること
存在チェック
- sig:HMAC-256でエンコードされた署名
- sv:共有アクセス署名のバージョン
- sr:SASトークンによってアクセス可能となるリソースの種類
一方、アカウントSASトークンの場合はパラメータとして「sv」、「ss」、「srt」、「sp」、「se」、「st」、「spr」、「sig」が含まれます。特に重要なチェック項目を、下記に示します。
値のチェック
- sp(SASトークンの権限情報):「rw」で始まる値が設定されていること
- se(SASトークンの有効期限):現在日時より未来の値が設定されていること
存在チェック
- sv:認証のリクエスト時に使用されるストレージのバージョン
- ss:共有アクセス署名によってアクセス可能となるサービス
- srt:共有アクセス署名によってアクセス可能となる署名付きリソースの種類
- sig:HMAC-256でエンコードされた署名
トレンドマイクロによるソリューション
トレンドマイクロのソリューション「Trend Vision One™ Cloud Risk Management」は、クラウドインフラを継続的に保護するツールであり、750以上ものベストプラクティスに沿った自動チェック機能を備えています。本ソリューションでは、下記に示すAzureストレージアカウントのルールをご利用いただけます。
- HTTPS以外でのSASトークンを禁止(Allow Shared Access Signature Tokens Over HTTPS Only):HTTPSプロトコル以外によるSASトークンを拒否します。
- 過大な権限を持つ保存済みアクセスポリシーをチェック(Check for Overly Permissive Stored Access Policies):過大な権限を持つアクセスポリシーがAzureストレージのSASトークンに利用されないようにします。
- Webコンテナの外部公開をチェック(Check for Publicly Accessible Web Containers):静的Webサイトのホスト用に作成したAzureストレージコンテナが外部公開されないように制御します。
- Blobコンテナに対する匿名アクセスを拒否(Disable Anonymous Access to Blob Containers):Azureストレージアカウント内部のBlobコンテナに対する匿名アクセスを拒否します。
- Blobコンテナ付きストレージアカウントに対するパブリックアクセスを拒否(Disable Public Access to Storage Accounts with Blob Containers):AzureストレージアカウントのBlobコンテナに対するパブリックアクセスを拒否します。これにより、アクセス制御リスト(ACL:Access Control List)の書き換えを防止します。
- Blobストレージの変更を禁止(Enable Immutable Blob Storage):重要なAzure Blobストレージが誤って削除、変更されないように、「イミュータブル化(変更不可の状態)」します。
- AzureストレージのBlobサービスによるログ記録を有効化(Enable Logging for Azure Storage Blob Service):AzureストレージのBlobサービスによるログ機能を有効状態に保ちます。
- AzureストレージのQueueサービスによるログ機能を有効化(Enable Logging for Azure Storage Queue Service):AzureストレージQueueサービスによる詳細なログ機能を有効状態に保ちます。
- AzureストレージのTableサービスによるログ機能を有効化(Enable Logging for Azure Storage Table Service):AzureストレージのTableサービスによるログ機能を有効状態に保ちます。
- Azureストレージのセキュア転送機能を有効化(Enable Secure Transfer in Azure Storage):Azureストレージアカウントの設定において、セキュリティ機能「Secure transfer required(セキュアな転送方式を要求)」を有効状態に保ちます。
- SASトークンの有効期限設定(Expire Shared Access Signature Tokens):SASトークンの有効期限を1時間以内に設定します。
- ストレージアカウントへのアクセスをIPベースで制限(Limit Storage Account Access by IP Address):Azureストレージアカウントへのアクセス元を指定のIPアドレスのみに制限します。
まとめ
URLに埋め込まれた認証情報がセキュリティ上の問題(CWE-598など)になりやすいことは、以前から広く知られています。これは、本稿で挙げたSASトークンにしても、開発環境「Jupyter Notebook」のJWTにしても、同様です。一方、CI/CDパイプラインで認証情報を検出してアラートを発するツールも多く存在します。その具体例が「GitLeaks」や「Trufflehog」などであり、DevSecOpsチームに重宝されています。なお、あまり認識されていない認証情報からなる設定ミスは、クライドプロバイダ側から発生する可能性もあります。こうした問題に対処する上では、過大な権限を持つクラウドサービス認証情報をコード内からスキャンする手続きを積極的に導入するなど、リスクを見越して対策を進める姿勢が重要です。
問題の認証用トークンはURLパラメータであるため、コードベースから正規表現で抽出できる可能性があります。また、こうしたトークン情報がHTTPのプロキシログに平文で記載されることもあります。
流出したSASトークンの不正利用については、過去にも報告されています。サイバーセキュリティのトレーニングを手掛ける「NotSoSecure」は、2019年の時点で当該リスクを分析していました。2023年6月にMicrosoft社は、過大な権限を持つSASトークンによって38 TB相当のデータが外部に露出するインシデントに遭遇しました。対象データの中には、従業員のバックアップやAI関連の調査資料なども含まれていました。
SASトークンを利用する際には、Microsoftからの報告にもある通り、下記に示すベストプラクティスの実践を推奨します。
- 最小権限の原則を適用:SASのURL経由で許可するリソースは、クライアントが実際に必要とするものに限定する(単一のBlobなど)。権限設定も、アプリケーションが実際に必要とするものに限定する(読み込みのみ、書き込みのみなど)。
- 短期間のSASトークンを利用:SASを作成する際は、有効期間を短く設定するように徹底する。手順として、実際に必要な時にクライアント側から新規にSAS URLの発行を依頼する方式を用いる。Azureストレージからは、SAS URLの有効期間を1時間以内に設定することが推奨されている。
- SASトークンの用法に注意:SASのURLは、データアクセスを許可するものであり、アプリケーションのシークレットとして扱うことが望ましい。ストレージアカウントへのアクセスを必要とするクライアント以外には、SAS URLを配布しない。
- 取り消し計画を策定:SASトークンを「保存されたアクセスポリシー」に関連付け、コンテナ内のSASを取り消す綿密な計画を策定する。万一SASや共有鍵が流出した場合に備え、保存されたアクセスポリシーを削除、またはストレージアカウント鍵を変更するための体制を整えておく。
- 監視や監査を実施:AzureモニターやAzureストレージログを有効化し、ストレージアカウントへのリクエストがどのように認証されているかを確認する。「共有アクセス署名の有効期限ポリシー(Expiration Policy)」を活用し、SAS URLの利用期間が長いクライアントを特定する。
参考記事:
ZDI-23-1527 and ZDI-23-1528: The Potential Impact of Overly Permissive SAS Tokens on PC Manager Supply Chains
By: Nitesh Surana
翻訳:清水 浩平(Platform Marketing, Trend Micro™ Research)