Walineに脆弱性、管理者アカウント奪取の恐れ 修正版なし
Walineの@waline/client(3.15.2以前)に、管理者がコメントの編集画面を開くだけでログイン用トークンを盗まれる脆弱性があります。修正版は未公開なので、利用の有無を確認し、編集操作を控える運用に切り替えてください。
急ぎ度: 早めに
CVSSは9.3で管理者アカウントの乗っ取りに至り、修正版が未公開のため、更新ではなく運用での防御を早めに始める段階です。
関係があるか
自社サイトにWalineのコメント欄を組み込み、管理者や運営担当者がコメントの編集ボタンを使える環境が対象です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| @waline/client(npm) | 3.15.2以前 | 修正版なし(公開時点) |
確かめ方
- 1プロジェクトのpackage.jsonとロックファイルで、@waline/clientの版を調べます。3.15.2以前なら対象です。
- 2npmを使わずスクリプトとして読み込んでいる場合は、読み込み元の版を確認します。
- 3管理者やモデレーターが、他人のコメントに対して編集ボタンを押す運用があるかを確認します。
- 4保存済みのコメント本文に、HTMLのタグや属性が含まれていないかをデータベースで調べます。
何が起きたか
Walineのブラウザー側部品@waline/clientに、コメント編集画面のプレビューでHTMLが無害化されずに描画される脆弱性があります。細工されたコメントを管理者が編集しようとすると、管理者のブラウザー上で攻撃者が仕込んだ処理が動き、ログイン用トークンを盗まれて管理者アカウントを乗っ取られます。
公開ページに出る表示用のコメントは、サーバー側で無害化されています。ところが編集画面には、無害化前の元の本文が読み込まれます。この本文をmarkedで変換し、そのままv-htmlでプレビューに差し込むため、無害化を通らない経路ができています。
プレビュー欄は非表示のままでもページ内に置かれます。管理者がプレビューのタブを開かなくても、編集ボタンを押した時点で処理が走ります。弱点の種類はCWE-79とCWE-116です。
攻撃の流れ
-
1
細工コメント投稿
投稿者がHTMLを含む本文をコメントとして送り、元の本文がそのまま保存されます。
-
2
通常表示は無害
公開ページにはサーバーで無害化した表示用コピーが出るため、読者にも運営にも異変に見えません。
-
3
管理者が編集
管理者が編集ボタンを押すと、元の本文が無害化なしでプレビューに描画されます。
-
4
トークン窃取
管理者のブラウザーで処理が動き、ログイン用トークンが外部へ送られます。
-
5
アカウント乗っ取り
盗んだトークンで、管理者としてWalineを操作されます。
どう悪用されるか
攻撃者はログインしておらず、ネットワーク越しにコメントを投稿できれば足ります。成立には、管理者がそのコメントの編集ボタンを1回押すことが必要です。編集ボタンを使えるのは管理者とコメントの投稿者本人だけなので、管理者による通常のコメント管理がそのまま引き金になります。
Walineのログイン用トークンは、同じオリジンのlocalStorageに保存されています。仕込まれた処理はこれを読み出せるため、管理者アカウントの完全な乗っ取りに至ります。乗っ取られると、管理者として行える操作を攻撃者も行えます。
公開ページの表示は無害化されているので、通常の読者がコメントを見るだけでは、この経路で影響を受けません。
今すぐやること
-
1
対象版かどうかを確認する
@waline/clientの版を調べ、3.15.2以前なら以降の手順に進みます。
npm ls @waline/client -
2
他人のコメントの編集を止める
修正版が出るまで、管理者とモデレーター全員に、他人のコメントの編集ボタンを押さないよう周知します。
-
3
保存済みコメントを点検する
コメント本文にHTMLのタグや属性が入っていないかを、管理画面ではなくデータベース側で確認します。疑わしいコメントを画面で開いて確かめるのは避けます。
-
4
乗っ取りの跡を調べる
管理者がすでに不審なコメントを編集していたら、管理者アカウントの認証情報を見直し、身に覚えのない管理操作がないかを調べます。
-
5
修正版の公開を確かめて更新する
Walineの公式リポジトリにあるセキュリティ勧告GHSA-crj3-q72p-ggqmを定期的に見て、修正版が出たら速やかに更新します。
修正版がないあいだのつなぎ
最も簡単なのは、管理者とモデレーターが他人のコメントの編集ボタンを使わない運用です。@waline/clientを自前でビルドしている場合は、勧告の提案に沿って対処できます。dompurifyを追加し、parseMarkdownの戻り値をDOMPurify.sanitizeで包みます。その際、FORBID_TAGSにform・input・style、FORBID_ATTRにautoplay・styleを指定します。サーバー側の無害化と同じ方針に合わせる形です。
背景
Walineは、サイトにコメント欄を付けるためのシステムです。投稿を受け付けるサーバー側と、ブラウザーに表示するクライアント部品に分かれています。今回の問題は、サーバー側で無害化した表示用コピーとは別に、元の本文を編集用に残していることから生じました。クライアントの編集画面だけが、その元の本文を無害化せずに描画しています。
管理者は、承認や編集のために、見知らぬ投稿者のコメントを日常的に開きます。この作業が引き金になるため、管理者が普段どおり働いていても被害に遭う点が厄介です。公開ページだけを確認しても、異常には気づきにくい構造です。
よくある質問
Q.サーバー側のWalineを更新すれば防げますか。
まだ分かっていないこと
- 修正版がいつ公開されるかは、公表されていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Waline is a comment system with backend support. In versions 3.15.2 and prior, @waline/client renders the comment editor's live preview with marked and no sanitizer (utils/markdown.ts), and the preview is injected with v-html. When a comment is edited, the editor is seeded with the comment's raw, un-sanitized body (orig). Only administrators and the comment owner can edit. So an administrator who clicks Edit on an attacker's comment renders that attacker's raw HTML in their own session: an unauthenticated commenter achieves privilege-escalation stored XSS against a moderator with a single Edit click. At time of publication, there are no publicly available patches.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory github.com
- advisory nvd.nist.gov