速報

Apache HTTP ServerのHTTP/2に認証不要RCE|2.4.71更新と構成別の確認

CATEGORY

ASP.NET Coreの認証テンプレートに脆弱性|更新後も生成済みコードの修正が必要

※本ページのリンクにはプロモーションが含まれています。

メールの送信先をアカウントの保存済み情報へ結び付けるよう生成コードを修正して再配備する概念イラスト

この記事のポイント

脆弱性
CVE-2026-118741
深刻度

HIGH8.1

対象
ASP.NET Core Identityの影響するscaffolding・ProjectTemplatesと生成済みハンドラー
悪用状況
不明
推奨対応
生成元のパッケージ・テンプレート・ツールを対応版へ更新し、ForgotPasswordとResendEmailConfirmationおよびBlazorの対応処理を修正して再ビルド・再配備する。
公表日

目次

MicrosoftはASP.NET Core Identityのコード生成テンプレートについて、パスワード再設定やメール確認の送信先を誤る-2026-118741を公表しました。対象テンプレートで機能を生成した開発者は、生成ツールや依存を更新するだけでなく、既存アプリのハンドラーを修正し、再・再配備する必要があります。更新だけでは生成済みコードは直りません。

問題は、アカウントに保存されたメールアドレスではなく、要求で渡されたメールアドレスを再設定・確認メッセージの宛先に使うことです。Microsoftの公式勧告に基づき、11月12日時点で確認した更新先と修正手順を整理します。対象OSやCPUの種類で除外される問題ではなく、どの生成元を使い、どのコードが配備されているかが判断の中心です。

スポンサーリンク

メールの検索入力と送信先を分ける

公式の深刻度はHigh、 3.1基本値は8.1、分類は-640です。ベクトルはネットワーク経由、認証不要、利用者操作不要ですが、攻撃複雑性はHighと評価されています。認証不要という一部分だけで、任意の入力から必ず他人のアカウントを取得できるとまで広げて説明することはできません。

修正の要点は、利用者を検索するための入力値と、秘密を含むメッセージを届ける宛先を別の値として扱うことです。Input.Emailはアカウントの検索に残し、送信時には検索で見つかったアカウントから保存済みアドレスを取得します。入力値の形式が正しいことだけでは、宛先が当該アカウントに結び付くことを保証できません。

公式勧告の改訂履歴は初回公表を2026年11月10日としています。案内用のGitHub Issueが11月11日に作られたこととは区別してください。本稿で確認した一次資料は実環境での悪用を確定していないため、悪用中や被害発生とは表現しません。

生成元の更新と既存アプリの修正は別の作業

テンプレートから生成されたソースは、生成ツールを更新しても自動的に置き換わりません。開発端末を最新にして次の生成を安全にする作業と、すでにへ取り込まれて本番で動く処理を直す作業を、それぞれ完了させる必要があります。

確認対象はForgotPasswordとResendEmailConfirmationのハンドラーです。Blazorの対応する処理も対象に含みます。独自の認証画面へ変更している場合は、元テンプレートのファイル名が残っているかだけでなく、再設定・確認メールの送信にどの値を渡すかを確認してください。

本サイトの提案として、サービス名、生成時の・ツール・パッケージ、該当ハンドラー、現在のメール宛先、修正、本番反映先を一枚の作業票にまとめます。生成履歴が不明でも、現在の送信コードを確認する作業を後回しにしないでください。

スポンサーリンク

MVCとDesignはプロジェクト内の解決版を確認

Microsoft.VisualStudio.Web.CodeGenerators.Mvcが問題のテンプレートを含みます。Microsoft.VisualStudio.Web.CodeGeneration.Designは、MVC生成パッケージを最小バージョン依存として取り込む親パッケージです。以下は安定版の範囲です。

対象影響する安定版・対応
Mvc/Design 8系8.0.0~8.0.238.0.24
Mvc/Design 9系9.0.0~9.0.129.0.13
Mvc/Design 10系10.0.0~10.0.210.0.3

Designの古い参照が残っていても、独立した指定によって修正済みのMVC生成パッケージを解決しているなら、そのDesign参照だけを根拠に脆弱とは判断できません。宣言された版と実際に復元・解決されたを対応づけます。

dotnet-aspnet-codegeneratorはアプリの依存関係からジェネレーターを読み込みます。コマンドラインツールだけを更新してもプロジェクト側のパッケージが置き換わるとは限りません。複数リポジトリや共通の依存管理ファイルがある場合、生成元の変更が各プロジェクトに届くかも確認します。

dotnet newのテンプレートは別の版番号

Microsoft.DotNet.Web.ProjectTemplatesは、SDKに同梱される場合と別途インストールする場合があります。プロジェクトのPackageReferenceを見るだけでは、どのテンプレートで作られたかを特定できません。公式の確認コマンドは次のとおりです。作業ディレクトリ内で選ばれるSDKを確認します。

dotnet --version
dotnet new list
dotnet new uninstall

最後のコマンドは引数なしで、別途導入したテンプレートパッケージを一覧します。ここにパッケージ名を追加して削除を実行する手順ではありません。global.jsonが古いSDKを選び続けていないかも点検してください。SDK更新と、別途入れたテンプレートパックの更新は独立して扱います。

対象影響する安定版修正版・対応
ProjectTemplates.8.08.0.0~8.0.338.0.34
ProjectTemplates.9.09.0.0~9.0.229.0.23
ProjectTemplates.10.010.0.0~10.0.1410.0.15

この表の版をMVCやDesignの更新先に流用しないでください。たとえば10系でも、MVC/Designの修正版は10.0.3、ProjectTemplatesは10.0.15です。同じ.NET向けの部品であっても、パッケージ名が違えば修正境界も違います。

スポンサーリンク

scaffoldツールは20.3.0へ更新または移行

Microsoft.dotnet-scaffoldは10.0.0~10.0.2と、20.0.0-preview.1.26156.3~20.1.0が影響対象です。修正版は20.3.0です。旧Microsoft.dotnet-scaffold-aspnetの9.0.0~9.0.12は、新ツールへ移行します。20.3.0は.NET 8~11をサポートするツールで、プロジェクトへ追加するMVC/Designパッケージの版ではありません。

既存のグローバルMicrosoft.dotnet-scaffoldを更新する場合、公式は次を案内しています。新規導入ではupdateではなくinstallを使用します。

dotnet tool update --global Microsoft.dotnet-scaffold --version 20.3.0

旧Microsoft.dotnet-scaffold-aspnetを使用している場合の公式手順は、旧ツールの削除と置換先の導入です。ローカルツールでは--globalを--localに替え、ツールマニフェストのあるディレクトリで実行します。

dotnet tool uninstall --global Microsoft.dotnet-scaffold-aspnet
dotnet tool install --global Microsoft.dotnet-scaffold --version 20.3.0

Visual Studioは更新済みの生成ツールを自動的に導入・利用しますが、別途の導入は個別更新が必要です。またVisual Studio 17.14は従来のCodeGenerationパッケージを使うため、を更新したという記録だけで独立管理の依存関係まで確認済みとしないようにします。

プレビュー版は範囲を推測しない

勧告には安定版以外にも、影響する正確なプレビュー版・RC版が列挙されています。これらを一つの連続した範囲へまとめてはいけません。試験段階で生成した認証機能を本番へ持ち込んだ場合も、生成済みコードの確認が必要です。

たとえばMVC/Designの11.0.0-preview.1.26156.3と11.0.0-preview.1.26230.3、旧scaffold-aspnetの10.0.0-rc.1.25458.5と10.0.0-rc.1.25468.1も対象です。既存ハンドラーの手動修正は、ツールを移行しなければ実施できないわけではありません。今後の生成元には修正済みツールを選びます。

生成済みハンドラーの修正箇所

公式手順は、既存のユーザー検索、ユーザー不在時の応答、パスワード再設定の確認条件、トークン生成、URLのエンコードを維持するよう求めています。それらのユーザー検査の後、メールを送る前に保存済みの宛先を取得します。次は公式の挿入例です。

var storedEmail = await UserManager.GetEmailAsync(user);
if (string.IsNullOrEmpty(storedEmail))
{
    throw new InvalidOperationException("Users must have an email.");
}

Razor PagesではUserManagerを_userManagerへ読み替えます。送信先引数のInput.EmailだけをstoredEmailへ変更し、_emailSender.SendEmailAsync、EmailSender.SendPasswordResetLinkAsync、EmailSender.SendConfirmationLinkAsyncのうち該当する呼び出しへ適用します。アカウント検索用のInput.Emailまで一括置換する手順ではありません。

両ハンドラーとBlazorの対応箇所を修正した後、再ビルドして再配備します。古いテンプレートで再生成すれば修正が失われるため、その場合は手動修正も再適用します。生成物の差分レビューを保守手順へ含めることが、同じ問題を戻さないための確認になります。

本番反映と試験の完了条件

以下は公式修正を確認するための本サイトの提案で、当サイトが実行した実測ではありません。管理下のとテスト用アカウントを使い、メール送信を検証用の受信先へ隔離して確認します。第三者のアカウントや実利用者へ再設定メールを送る試験は不要です。

入力がユーザー検索に使われ、送信先は取得したユーザーの保存済みアドレスになることを、送信処理の引数や検証用メールで確認します。保存済みアドレスが空なら送信されないこと、ユーザー不在時などの従来の応答が保たれることも確認します。実環境に独自の正規化や認証ストアがある場合、その経路を含めて試験してください。

最後に、修正コミットから作った成果物がすべての稼働先へ届いたかを確認します。ツールの版が最新であること、生成ソースが修正済みであること、本番がその成果物で動くことは別々の証跡です。この三つをそろえて、今回の対応を完了と判断してください。

出典・一次情報

本記事は以下の公開情報をもとに作成しています。最新の状況は各リンク先で確認してください。

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

あわせて確認したい対策・解説

ほかの脆弱性

※悪用の「未確認」は、最終確認時点で悪用の報告が見つかっていないことを示します。悪用されていないことを保証するものではありません。「不明」は公表情報に悪用状況の記載がないものです。

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク

検証環境

本番環境に反映する前に、変更や更新が問題なく動くかを試すための環境。本番と同じ構成にできるほど確認の精度が上がる。

詳しく見る

コールバック

ほかの関数に引数として渡し、処理の完了時や出来事が起きたときなどに呼び出してもらう関数。

詳しく見る

IDE

統合開発環境。コードの編集、実行、デバッグ、テストなど、開発に必要な機能をひとまとめにしたソフトウェア。

詳しく見る

CLI

コマンドラインインターフェース。文字のコマンドを入力してコンピューターやツールを操作する方法、またはそのためのツール。

詳しく見る

依存関係

プログラムが動くために必要な、ほかのライブラリやパッケージとの関係。また、その必要な部品そのもの。

詳しく見る

パッチ

ソフトウェアの不具合や脆弱性を修正するための更新プログラム。適用することで既知の問題を解消する。

詳しく見る

コミット

Gitなどで、ファイルの変更をひとまとまりの記録として保存すること。また、その記録。

詳しく見る

SDK

ソフトウェア開発キット。特定のサービスや環境向けの開発に必要なライブラリやツール、ドキュメントをまとめたもの。

詳しく見る

リポジトリ

ソースコードなどのファイルと、その変更の履歴をまとめて保管する場所。Gitで管理し、GitHubなどで共有する。

詳しく見る

CWE

ソフトウェアの弱点(脆弱性の原因)の種類を分類した共通の一覧。「CWE-79(XSS)」のように番号で表す。

詳しく見る

CVSS

脆弱性の深刻度を0.0〜10.0の数値で評価する共通の基準。数値が大きいほど深刻度が高い。

詳しく見る

ランタイム

プログラムを実行するときに必要な環境や仕組み。Node.jsやブラウザのJavaScriptの実行環境など。

詳しく見る

ビルド

ソースコードなどから、実際に動かしたり配布したりできる形の成果物を作る作業。

詳しく見る

パッケージ

ソフトウェアを配布・インストールしやすいように、プログラムと必要な情報をひとまとめにしたもの。npmやComposerなどで管理する。

詳しく見る

認証

アクセスしてきた相手が本人であることを確かめる仕組み。パスワードや生体情報、電子証明書などを使う。

詳しく見る

CVE

公開された脆弱性に付けられる世界共通の識別番号。「CVE-2026-12345」のように年と連番で表す。

詳しく見る

脆弱性

ソフトウェアや設定の不備のうち、攻撃者に悪用されると情報漏えいや不正操作などにつながる弱点。

詳しく見る