Beego Framework の脆弱性 CVE-2025-30223 (CVSS:9.3) が FIX:Go 環境に深刻な XSS

CVE-2025-30223 (CVSS 9.3): Critical XSS Vulnerability Discovered in Beego Framework

2025/04/02 SecurityOnline — Web アプリや API の構築で人気を博す、Go フレームワークである Beego Framework に、クロスサイト・スクリプティング (XSS) の脆弱性が発見された。この脆弱性 CVE-2025-30223 (CVSS:9.3) を悪用する攻撃者は、悪意の JavaScript コードを Web ページに挿入し、ユーザー・データやセッションを侵害する可能性を手にする。

GitHub で 32,000 を超えるスターを獲得している Beego は、REST API/Web App/Backend Services の構築に広く利用されている。合理化された構文と開発者に優しい抽象化により、Go エコシステムで頼りになるフレームワークとなっている。

Beego のアドバイザリには、「ユーザーが制御するデータの、不適切な HTML エスケープが原因となり、Beego の RenderForm() 関数にクロスサイト・スクリプティング (XSS) の脆弱性が発生する」と記されている。

この問題の根本にあるのは、RenderForm() が入力フィールドを動的に生成するために内部的に使用する、ヘルパー関数 renderFormField() である。つまり、この関数は HTML エスケープを行うことなく、HTML テンプレートへ向けてユーザー入力データをダイレクトに挿入する。

return fmt.Sprintf(`%v<input%v%v name="%v" type="%v" value="%v"%v>`, 
    label, id, class, name, fType, value, requiredString)

Beego のアドバイザリには、「いずれも値 (label/id/class/name/value) も、適切に HTML エスケープされていない。それにより攻撃者は、アトリビュート・コンテキストからの脱出や、HTML タグのダイレクトな挿入を可能にする」と記されている。

さらに悪いことに、RenderForm() は template.HTML を返す仕組みになっている。それにより、Go の自動化されたエスケープ・メカニズムが明示的にバイパスされるため、脅威は増幅されていく。

攻撃者は、主に2つの手法を用いることで、この脆弱性を悪用できる。

アトリビュート・インジェクション:悪意の JavaScript を DisplayName などのフォーム・フィールド値を介したスマグリングにより、HTML 属性境界をエスケープして、ブラウザーで実行する。

コンテンツ・インジェクション:< textarea > などのフィールドにおいて、攻撃者は HTML タグやスクリプトを、ページにダイレクトに挿入できる。

Beego のアドバイザリには、「この脆弱性の悪用に成功した攻撃者は、JavaScript の実行/セッション・クッキーの窃取/アカウントの乗っ取り/偽のログイン・フォームの挿入などにより、認証情報の収集などの可能性を得る」と記されている。

さらに言うと、ユーザーが生成したデータが、特権ユーザーに対して定期的に表示される、管理インターフェイスやユーザー管理ダッシュボードなどが特に危険となる。

影響を受けるバージョンとパッチ適用バージョン:

  • 影響を受けるバージョン:<= v2.3.5
  • パッチ適用バージョン:v2.3.6

この修正では、すべての動的な値を HTML テンプレートに挿入する前に、明示的なエスケープが行われるようになる。以下は、緩和策の例である:

// Convert value to string and escape it
valueStr := ""
if value != nil {
    valueStr = template.HTMLEscapeString(fmt.Sprintf("%v", value))
}

// Escape the name and label
escapedName := template.HTMLEscapeString(name)
escapedLabel := template.HTMLEscapeString(label)
escapedType := template.HTMLEscapeString(fType)

return fmt.Sprintf(`%v<input%v%v name="%v" type="%v" value="%v"%v>`, 
    escapedLabel, id, class, escapedName, escapedType, valueStr, requiredString)

Beego の開発者は、「脆弱性 CVE-2025-30223 に対する修正により、ユーザーが指定した全ての値は、HTML への挿入の前に適切にエスケープされる」と述べている。

Beego のようなオープンソース・フレームワークは、多くの開発者に親しまれていますが、今回のように深刻な脆弱性が見つかることもあります。デフォルトの安全性に頼り切らず、自分たちでしっかりと対策を講じることが大切なのでしょう。​よろしければ、Opensource + Framework で検索も、ご参照下さい。