Scribanの脆弱性、内部情報を読み書きされる恐れ。修正版あり
外部の人が書いたテンプレートをScribanで描画しているアプリでは、ホスト側の設定値や秘密情報が読み書きされる恐れがあります。7.5.2へ更新し、テンプレートを誰が書けるかも見直してください。
急ぎ度: 早めに
CVSS v3は7.4、v4は9.1で、認証なしにネットワーク経由で狙えますが、深刻な影響が出るにはホスト側が特定の形で関数を公開している必要があり、修正版7.5.2が公開済みです。
関係があるか
Scribanでテンプレートを描画する.NETアプリのうち、顧客・利用者・外部委託先など、自社の開発者以外が書いたテンプレートを受け付けているものが対象です。テンプレートを開発者だけが管理している環境では、影響を受ける経路が限られます。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| Scriban(NuGet) | 7.5.2より前(GitHubのアドバイザリでは7.5.1以前で確認) | 7.5.2 |
| Scriban.Signed(NuGet) | 7.5.1以前 | 7.5.2 |
確かめ方
- 1ソリューション全体で、ScribanまたはScriban.Signedを参照しているプロジェクトを洗い出し、版が7.5.2未満でないかを確認します。他のライブラリ経由で入っている場合もあるため、間接参照も含めて調べます。
- 2テンプレートの書き手に社外の人や一般の利用者が含まれるかを確認します。含まれるなら、このアプリは優先して対応する対象です。
- 3ソースコードでScriptObject.Importに関数(Delegate)を渡している箇所を探します。インスタンスメソッドや、設定・サービスを取り込んだラムダを渡していると、秘密情報の読み書きまで及ぶ可能性があります。
何が起きたか
テンプレートエンジンのScribanに、テンプレートを書く側が、アプリが公開した関数の裏にある.NETのオブジェクトを読み書きできてしまう脆弱性が見つかりました。
Scribanは、アプリが明示的に公開したものだけをテンプレートから使えるようにする設計です。ところが関数の値そのものがリフレクションで調べられる状態になっており、array.mapという組み込み関数を経由すると、関数の裏にある内部オブジェクトが取り出せます。ホストがインスタンスメソッドや、変数を取り込んだラムダを関数として公開していた場合、サービスのプロパティや、ラムダが保持している接続文字列・APIキーなどが読めるだけでなく、上書きもできます。書き換えは描画が終わったあともホスト側に残ります。
関数を何も公開していないアプリでも、組み込み関数から型やアセンブリの情報に到達でき、インストール先のパスや.NETランタイムの正確な版が分かります。報告者の検証では、これらのオブジェクトのメソッドは呼び出せず、コード実行に至る経路は見つかっていません。
GitHubのアドバイザリは2026年10月24日に公開され、CVEの登録は11月8日です。分類はCWE-200(権限のない者への機微情報の露出)です。
攻撃の流れ
-
1
テンプレート送信
攻撃者が、アプリに描画させるテンプレートを送り込みます。
-
2
内部の取り出し
array.mapを経由して、関数の裏にある内部オブジェクトや型情報を取得します。
-
3
設定・秘密の読み取り
サービスのプロパティやラムダが保持する接続文字列・APIキーを読み出します。
-
4
値の上書き
同じ経路で値を書き換え、描画後もホスト側に変更が残ります。
どう悪用されるか
攻撃者に必要なのは、アプリに描画させるテンプレートを送り込めることだけです。認証の有無、利用者の操作は問われず、ネットワーク経由で狙えます。
ただし、秘密情報の読み書きまで進むには、ホスト側がインスタンスメソッドの関数や、変数を取り込んだラムダをScriptObject.Importで公開している必要があります。これは攻撃者が左右できない条件で、CVSS v3の攻撃条件の複雑さが高になっているのもこのためです。報告者は、この構成が一般的だとみなせば9.1に相当するとも述べています。
関数を公開していないアプリでは、情報の漏えいにとどまります。見えるのはインストールパス、ランタイムの版、型の一覧などで、報告者は同条件の深刻度をCVSS v3で5.3と見積もっています。
悪用された場合の被害は、接続文字列やAPIキーの漏えい、認証フラグやサービス設定の改ざんです。改ざんは描画の完了後もホスト内に残ります。
今すぐやること
-
1
利用箇所の洗い出し
ScribanとScriban.Signedを使うプロジェクトを一覧にし、外部のテンプレートを受け付けるアプリから優先順位を付けます。
dotnet list package --include-transitive -
2
7.5.2へ更新
ScribanとScriban.Signedの両方を7.5.2に上げ、再ビルドして本番へ展開します。他のライブラリ経由で古い版が入っている場合は、そのライブラリ側の更新も確認します。
-
3
公開している関数の見直し
ScriptObject.Importで公開している関数のうち、設定値や認証情報を取り込んだものを洗い出します。外部のテンプレートを受け付けていた期間があるなら、接続文字列やAPIキーの再発行を検討し、設定値が意図せず書き換わっていないかも確認します。
-
4
テンプレートの受け付け範囲の確認
テンプレートを書ける人と投稿の経路を確認し、不要な外部からの投稿があれば止めます。
すぐ更新できないとき
すぐに更新できないときは、テンプレートを編集・投稿できる人を信頼できる担当者に絞り、外部からの投稿経路を閉じます。あわせて、ScriptObject.Importで公開する関数に、秘密情報を取り込んだラムダやサービスのインスタンスメソッドを使わないようにします。ただし、関数を公開していなくても型やパスの情報は見えるため、根本的な対処は7.5.2への更新です。
背景
Scribanは.NET向けのテンプレートエンジンで、メールの文面、帳票、設定ファイルの生成のほか、利用者が自分でひな形を編集できる機能にも使われます。公式の文書は、テンプレートが触れるのは組み込み関数と、アプリが明示的に公開したオブジェクト・メンバー・関数だけだと境界を定めています。
今回の脆弱性は、この境界の外にあるはずの関数の実体が見えてしまう点にあります。アプリの作り手は関数を公開したつもりでも、その関数が束縛しているサービスや、ラムダが取り込んだ変数まで渡してしまうことになります。外部の人にテンプレートの編集を許す機能ほど、この前提が崩れた影響が大きくなります。
よくある質問
Q.テンプレートを自社の開発者しか書かない場合も、更新は必要ですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| scribanscriban |
7.5.2 未満→ 7.5.2 |
7.5.2 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Scriban before 7.5.2 contains an information disclosure and object manipulation vulnerability that allows template authors to access .NET internals of function values through reflection member accessors. Attackers can use array.map to read Target, Method, or ReturnType on imported delegates, exposing and overwriting service properties, captured closure secrets, and assembly paths.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory vulncheck.com
- advisory nvd.nist.gov
- advisory github.com
- web github.com