かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  ITニュース. Windows PowerShell 5.1のInvoke-WebRequestに追加された警告について

 

 

ITニュース. Windows PowerShell 5.1のInvoke-WebRequestに追加された警告について

2025年12月12日配信
2025年12月12日更新
執筆者:山内 和朗

 Microsoftは2025年12月のセキュリティ更新プログラム(Bリリース)で、Windows PowerShell 5.1のInvoke-WebRequestにセキュリティ強化のための仕様変更を行いました。自動化のためのPowerShellスクリプト内でInvoke-WebRequestを使用している場合、仕様変更による警告がユーザーからの応答を待ち続け、処理が途中でハングする可能性があります。

 

12月10日以降、Invoke-WebRequestが突然警告するように

 

 2025年12月のWindows用セキュリティ更新プログラムでは、Windows PowerShell 5.1でInvoke-WebResuestコマンドレットまたはそのエイリアスであるcurl(C:¥Windows¥System32¥curl.exeではない、Invoke-WebRequestの呼び出し)を使用してWebページの解析(Webスクレイピング)実行時に、次のようなスクリプト実行リスクのセキュリティ警告を表示されるように仕様変更が行われました(画面1)。

Security Warning: Script Execution Risk
Invoke-WebRequest parses the content of the web page. Script code in the web
page might be run when the page is parsed.
      RECOMMENDED ACTION:
      Use the -UseBasicParsing switch to avoid script code execution.
      Do you want to continue?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)

 セキュリティリスクを理解した上でYまたはAを入力すると、続行されますが、それ以外の選択肢はセキュリティエラーとして処理されます。

PowerShell 5.1: Web コンテンツからのスクリプト実行の防止|サポート(Microsoft)

画面1 2025年12月のセキュリティ更新プログラムで行われた仕様変更により、Windows PowerShell 5.1のInvoke-WebRequestが警告を表示するようになった
画面1 2025年12月のセキュリティ更新プログラムで行われた仕様変更により、Windows PowerShell 5.1のInvoke-WebRequestが警告を表示するようになった

 この仕様変更は、以下の脆弱性を解消するために行われました。Windows PowerShell 5.1までのInvoke-WebRequestは、Internet Explorer(IE)のエンジン(mshtml)を使用してHTMLをパースします。ご存じのように、IEはレガシなコンポーネントであり、WindowsにおけるデスクトップアプリとしてのIEのサポートは終了しました。今回の仕様変更は、CVE-2025-54100への対策であると同時に、レガシなIEコンポーネントへの依存性の排除の一環でもあるのでしょう。

PowerShell のリモートでコードが実行される脆弱性(CVE-2025-54100)|MSRC(Microsoft)

 なお、PowerShell 7.x(旧称、PowerShell Core)はIEのコンポーネントに依存していないため、PowerShell 7.x(pwsh.exe)のInvoke-WebRequestには影響しません。もちろん、Windows標準のcurl.exeにも影響しません。

 

自動化スクリプトでのInvoke-WebRequestへの影響と回避策

 

 今回の仕様変更は主に対話型の実行に影響しますが、スクリプト内での使用にも影響することがあります。-OutFileパラメーターでダウンロードのみを実行する場合には警告は表示されません。例えば、最近ブログで紹介したスクリプトでは、以下のブログで紹介したものの一部が影響しました(既に修正済みです)。このようなスクリプトをタスクスケジューラー(Taskschd.msc)でpowershell.exeをエンジンとしてスケジュール実行していた場合、そのタスクを強制終了しない限り、長時間“実行中”のままハングしたように見えるはずです。

 

メモ. Microsoft Updateカタログからのダウンロードを自動化したい!
メモ. Microsoft Edgeインストーラーのダウンロード自動化の可能性を探る

メモ. OSConfig対応状況確認スクリプトのおまけ(詳細検索)

 

 新しい警告メッセージを回避するには、警告メッセージで説明されているように、Invoke-WebResuestコマンドレットに-UseBasicParsingパラメーター(基本的な解析のみを行う指定)を追加します(画面2、画面3)。または、スクリプトエンジンをWindows PowerShell 5.1(powershell.exe)からPowerShell 7.x(pwsh.exe)に切り替えます。PowerShell 6.0.0以降ではすべての要求で基本的な解析のみが使用されます。*1 PowerShell 6.0.0以降では-UseBasicParsingパラメーターは非推奨であり、指定しても実行に影響はありません(無視されます)。
*1 Invoke-WebRequest|PowerShell(Microsoft Learn)

画面2 PowerShellスクリプトでInvoke-WebRequestを使用している場合、Windows PowerShell 5.1(powershell.exe)で実行すると、新しい警告メッセージがスクリプトを失敗またはハングさせてしまうことがある
画面2 PowerShellスクリプトでInvoke-WebRequestを使用している場合、Windows PowerShell 5.1(powershell.exe)で実行すると、新しい警告メッセージがスクリプトを失敗またはハングさせてしまうことがある


画面3 Invoke-WebRequestに-UseBasicParsingパラメーターを追加することで、警告メッセージを回避できる
画面3 Invoke-WebRequestに-UseBasicParsingパラメーターを追加することで、警告メッセージを回避できる

 

影響を受ける可能性のあるスクリプトを調査する

 

 PowerShellスクリプト(.ps1および.psm1)を対象に、Windows PowerShell 5.1エンジン(powershell.exe)で実行した場合にInvoke-WebRequestの仕様変更の影響を受ける可能性のあるスクリプトを調査するPowerShellスクリプトを用意しました。このスクリプトを実行すると、現在のパス(カレントディレクトリ)以下を再帰的に検索し、影響を受ける可能性のあるスクリプト(Invoke-WebRequestを使用していて、OutFileやUseBasicParsingパラメーターを使用していないスクリプト)と、その行を示します(画面4)。このスクリプトは、Invoke-WebRequestのエイリアス(curl、iwr、wget)の使用についても考慮しています。取り急ぎ、生成AIに頼んで作成したスクリプトなので、実行結果は参考程度にしてください。

 

確認用スクリプト(プレーンテキストで表示)

$aliases = @(
'Invoke-WebRequest',
'iwr',
'curl',
'wget'
)

Get-ChildItem -Path .\ -Recurse -Include *.ps1,*.psm1 -File | ForEach-Object {

$file = $_.FullName
$errors = $null

$ast = [System.Management.Automation.Language.Parser]::ParseFile(
$file, [ref]$null, [ref]$errors
)
if ($errors) { return }

$ast.FindAll(
{
param($node)

if (-not ($node -is [System.Management.Automation.Language.CommandAst])) {
return $false
}

$cmdName = $node.GetCommandName()
if (-not $cmdName) { return $false }

if ($aliases -notcontains $cmdName) {
return $false
}

$params = $node.CommandElements |
Where-Object { $_ -is [System.Management.Automation.Language.CommandParameterAst] }

$hasOutFile = $params | Where-Object { $_.ParameterName -ieq 'OutFile' }
$hasBasic = $params | Where-Object { $_.ParameterName -ieq 'UseBasicParsing' }

return (-not $hasOutFile) -and (-not $hasBasic)
},
$true
) | ForEach-Object {
[pscustomobject]@{
Path = $file
LineNumber = $_.Extent.StartLineNumber
Command = $_.Extent.Text.Trim()
CommandName= $cmdName
}
}
}

 

news051_scr04

画面4 Windows PowerShell 5.1で実行したときに影響を受ける可能性のあるスクリプトを検索するスクリプト

 

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事