Hydro ui-defaultに保存型XSS脆弱性、修正版あり
オンラインジャッジのHydroで、プロフィール欄に仕込まれたスクリプトが閲覧者のセッションを奪う脆弱性が公表されました。@hydrooj/ui-defaultを4.59.1以上に更新し、管理者のセッションに異常がないか確認してください。
急ぎ度: 早めに
CVSS v3は8.7、v4は9.3で、修正版が公開済みであり、報告者の再現手順も公開されているため、早めの更新が適切です。
関係があるか
Hydroを自社や学校、コンテストの運営で動かしている組織が対象です。一般ユーザーの登録を受け付けている環境ほど、影響を受けやすいでしょう。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| @hydrooj/ui-default | 4.59.0以前。ただし4.16.0以前には問題の処理が入っておらず、実質的には4.16.1から4.59.0までが対象 | 4.59.1 |
| Hydro本体 | 4.16.1から5.1.0(ui-defaultの4.59.0以前に対応する範囲と報告されています) | ui-defaultの4.59.1を取り込んだ版。本体側の版番号はHydroの公式リポジトリの告知で確認してください |
確かめ方
- 1Hydroを動かしている環境で、導入済みの@hydrooj/ui-defaultの版を確認します。4.59.0以前なら対象です。
- 2Hydro本体の版を確認し、4.16.1から5.1.0に収まっていれば、ui-defaultの更新が必要です。
- 3Dockerで運用している場合は、イメージやコンテナーの更新時期を確認し、4.59.1より前のものが動いていないか調べます。
何が起きたか
Hydroのユーザー画面で、プロフィールの自己紹介欄に保存した内容が、閲覧した人のブラウザーでスクリプトとして実行される脆弱性です。実行されると、閲覧者のセッション情報が外部に送られ、その人になりすまして操作されるおそれがあります。
自己紹介欄はMarkdownで保存され、表示するときにXSS対策のフィルターを通ります。このフィルターには、コードの色付け用にlanguage- で始まるclass値を通す例外があります。通ったclass値は、HTMLの属性に入れる前のエスケープを経ていません。そのため、値に二重引用符が含まれていると属性が途中で閉じ、後ろの内容が別のタグとして扱われます。分類はCWE-79です。
この例外は4.16.1で入ったもので、4.16.0以前には存在しません。さらに、セッション用のCookieであるsidにHttpOnly属性が付いていないため、実行されたスクリプトからCookieを読み取れてしまいます。
攻撃の流れ
-
1
細工して保存
一般アカウントを持つ攻撃者が、自己紹介欄に細工したMarkdownを保存します。
-
2
プロフィール閲覧
管理者や他のユーザーが、その人のプロフィールページを開きます。
-
3
フィルター回避
class属性の処理の不備で、スクリプトがブラウザー上で実行されます。
-
4
セッション奪取
sid Cookieが外部に送られ、閲覧者になりすまして操作されます。
どう悪用されるか
攻撃者に必要なのは、対象のHydroに作れる一般のアカウントです。ネットワーク越しに自己紹介欄を編集できれば足り、特別な権限は要りません。一方で、被害者がその攻撃者のプロフィールを開くという操作は必要です。
悪用されると、閲覧した人のセッションが奪われ、その人としてHydroを操作されます。報告者は、管理者が細工されたプロフィールを開いた場合に、盗んだセッションで管理画面が開く様子を示しています。管理者が被害に遭えば、ユーザーや問題、コンテストの設定まで影響が及ぶでしょう。
今すぐやること
-
1
ui-defaultを4.59.1以上に更新する
Hydro本体を更新するか、ui-defaultを単独で更新して、4.59.1以上にします。更新後は、再起動と画面表示の確認まで済ませてください。
-
2
管理者のセッションを入れ替える
更新前に管理者がほかのユーザーのプロフィールを開いていた可能性があるなら、管理者アカウントでいったんログアウトし、再ログインします。使えるなら、稼働中のセッションの失効も併せて行います。
-
3
自己紹介欄の内容を確認する
登録ユーザーの自己紹介に、scriptタグや、引用符の混ざった不自然なclass指定が入っていないかを調べます。見つかれば、その内容を消し、投稿したアカウントの扱いを検討します。
-
4
管理画面へのアクセスを見直す
公表の前後で、管理画面に見覚えのない場所や時間帯からアクセスがないか、アクセスログで確認します。心当たりがあれば、管理者のパスワード変更も行います。
すぐ更新できないとき
更新がすぐにできないときのつなぎとして、次の運用が考えられます。いずれも修正版の代わりにはなりません。
- 新規ユーザー登録を止めるか、管理者の承認制にする。
- 管理者アカウントでは、ほかのユーザーのプロフィールを開かない。
- 既存ユーザーの自己紹介欄を点検し、不審な内容を消す。
背景
Hydroは、プログラミングコンテストや授業の課題採点に使われるオンラインジャッジのシステムです。提出されたコードを自動で採点し、問題やコンテスト、ユーザーを管理画面から扱います。管理者のセッションが奪われると、採点結果や参加者の情報にまで手が届くため、画面を表示する側の安全性が運営全体に効いてきます。
今回の脆弱性は、ユーザーが書いた自己紹介をMarkdownからHTMLにする処理で起きています。コードの色付け用にlanguage- で始まるclass値を許可した例外が、4.16.1で入ったことが発端でした。入力を通す例外を足したときに、出力側のエスケープが抜けていた形です。加えて、sid CookieにHttpOnly属性が付いていなかったことで、スクリプトが実行されたときの被害がセッション奪取まで広がりました。
よくある質問
Q.ユーザー登録を管理者だけが行う運用でも、対象になりますか。
Q.更新したあと、過去に保存された自己紹介は安全ですか。
まだ分かっていないこと
- 実際の攻撃で悪用されたという報告は、公表されていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| hydro-dev@hydrooj/ui-default |
4.59.1 未満→ 4.59.1 |
4.59.1 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Hydro @hydrooj/ui-default before 4.59.1 contains a stored cross-site scripting vulnerability that allows registered users to inject script by placing double quotes in language- class tokens within markdown-it-xss.ts. Attackers can store a payload in their profile bio that executes when administrators or other users view it, stealing the non-httpOnly sid session cookie for session hijacking.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- web github.com
- web github.com
- web disclosure@vulncheck.com
- web vulncheck.com
- web nvd.nist.gov
- web vul.yulun.ac.cn
- web github.com