Next.jsに存在する深刻な脆弱性により、認証されていないリモートの攻撃者が、動的な画像生成時にSVGコンテンツとして描画される細工済みの入力を送り込み、影響を受けるサーバー上でコードを実行できる恐れがあります。
CVE脆弱性データベース
GHSA-vcvr-r3jv-pc5jとして追跡されているこの問題は、next/ogパッケージに含まれるImageResponseのNode.js実装に影響します。
影響を受けるのはNext.jsのバージョン16.2.0から16.3.5です。Vercelはこの問題に対処するため、Next.jsバージョン16.3.6をリリースしました。一方、15.xのリリースラインには、関連するセキュリティ強化のアップデートとしてバージョン15.5.26が提供されています。
Next.js ImageResponseの脆弱性
ImageResponseは、JSXとCSSからOpen Graph画像やソーシャルメディアのプレビューカードなど、サーバー側で生成するグラフィックを作成する際によく使われます。脆弱なNode.jsのパスでは、Satoriというライブラリを通じて出力を処理します。Satoriは、JSX風のレイアウトデータを画像生成の前にSVGへ変換するライブラリです。
根本的な原因は、生成されるSVG出力に埋め込まれる値のエスケープ処理が不適切なことです。アプリケーションが、クエリパラメータ、APIの値、フォームフィールド、URLから得た文字列など、攻撃者が操作できるデータを受け取り、Node.jsのImageResponseで処理されるSVGコンテンツ、属性、スタイルに埋め込んでいる場合に、脆弱な状態になります。
細工されたコンテンツが無害なテキストではなくSVGマークアップとして解釈されると、リモートコード実行につながる状況が生まれます。
脆弱な実装は、たとえば次のようなパターンになります。
import { ImageResponse } from 'next/og'
export async function GET(request: Request) {
const value = new URL(request.url).searchParams.get('value') ?? ''
return new ImageResponse(
<svg width="1200" height="630">
<title>{value}</title>
</svg>
)
}
このケースでは、攻撃者がインターネットに公開された画像エンドポイントに対し、特別に細工したvalueパラメータを送信する可能性があります。アプリケーションが影響を受けるNode.js実装で動作し、その入力をSVG生成に渡している場合、リクエストは脆弱な描画処理に到達しかねません。
ImageResponseを使うNext.jsアプリケーションのすべてが脆弱というわけではありません。アドバイザリーによると、この欠陥は次の特定の条件下でのみ該当します。
- アプリケーションがNext.jsのバージョン16.2.0から16.3.5を使用している。
- `next/og`の画像生成が、ImageResponseのNode.js実装で動作している。
- 信頼できない入力が、SVGコンテンツ、属性、CSSスタイルの値に到達する。
- 画像生成のルートに、攻撃者がネットワーク経由でアクセスできる。
Edge版のImageResponse実装を使用するアプリケーションは影響を受けません。攻撃者が操作できるデータをSVG出力に挿入しないデプロイも、脆弱性の対象範囲外です。
組織は、影響を受けるNext.jsのデプロイをただちにバージョン16.3.6へアップグレードし、アプリケーションを再デプロイする必要があります。特に、リクエストで制御可能な値を読み取るOpen Graph画像のエンドポイント、ルートハンドラー、動的なプレビュー画像ジェネレーターを優先して確認してください。
すぐにパッチを適用できない場合、開発者は、Node.jsのImageResponseで描画されるSVGコンテンツ、属性、スタイルに信頼できない入力を渡さないようにしてください。
Satori自体はバージョン0.33.5で修正されました。そのアドバイザリーは、Satoriを直接利用している場合、アップグレードと、攻撃者が制御可能なコンテンツを描画しないこと以外に、完全な回避策は存在しないと警告しています。
認証もユーザー操作も不要でサーバー側のコード実行につながる可能性があることから、公開されている`next/og`の画像生成エンドポイントは、パッチ適用を最優先で進めるべき対象として扱う必要があります。
SOCのアラート調査をすべて21分短縮。即座に対応できるIOCのコンテキストでSOCを強化: SOCにTI Lookupを導入する
翻訳元: https://gbhackers.com/next-js-imageresponse-vulnerability/