[注意喚起] Etherpadに深刻なStored XSS脆弱性 (CVE-2026-55090) - フロントエンド開発者が学ぶべき対策
はじめに:Etherpadの深刻なXSS脆弱性
人気の共同編集ツール「Etherpad」において、HTMLエクスポート機能に重大なStored Cross-Site Scripting(保存型XSS)脆弱性(GHSA-2jp7-wwpg-3p9w / CVE-2026-55090)が発見されました。この脆弱性は深刻度「High」に分類され、悪用されると情報漏洩やアカウント乗っ取りなど、ユーザーに甚大な被害をもたらす可能性があります。
本記事では、この脆弱性の詳細なメカニズム、想定される影響、そして私たち日本のフロントエンドエンジニアが自身の開発プロジェクトでどのようにXSS対策を強化すべきかについて解説します。
脆弱性の概要:なぜXSSが発生したのか
今回の脆弱性は、EtherpadのHTMLエクスポート機能、特に`src/node/utils/ExportHtml.ts`内の`getHTMLFromAtext`関数に存在しました。具体的な原因は、プラグインフック(`exportHtmlAdditionalTagsWithData`)を通じて渡される値をHTML属性として利用する際に、適切なエスケープ処理が行われていなかった点です。
Stored XSSは、攻撃者が悪意のあるスクリプトをWebアプリケーションのデータベースなどに保存させ、それが他のユーザーに表示される際に実行されるタイプのXSSです。Etherpadの場合、パッドの編集者が巧妙に作成した変更セット(`changeset`)を使って、パッドの属性プールに悪意のあるコードを注入することが可能でした。(例: `" onload="alert(1)`)
例えば、`ep_font_color`や`ep_font_size`のように`exportHtmlAdditionalTagsWithData`フックを登録するプラグインが有効な環境で、属性として`" onload="alert(1)`のような値が注入された場合、エクスポートされるHTMLファイルには以下のようなコードが出力され得ました。
`<span data-color="" onload="alert(1)">`
このようなHTMLファイルが`text/html`として提供され、ユーザーのブラウザで開かれると、`onload`属性内のJavaScriptコードが実行されてしまうというメカニズムです。
想定される影響と攻撃シナリオ
この脆弱性が悪用された場合、攻撃者は以下のような被害を引き起こす可能性があります。
1. **任意のJavaScriptコード実行**: エクスポートされたHTMLファイルを開いたユーザーのブラウザ上で、攻撃者が仕込んだ任意のJavaScriptコードが実行されます。
2. **情報漏洩・アカウント乗っ取り**: 実行されたJavaScriptにより、セッションクッキーやLocalStorageに保存された情報が窃取され、セッションハイジャックやアカウント乗っ取りに繋がる可能性があります。
3. **表示内容の改ざん**: ユーザーインターフェースが改ざんされ、フィッシングサイトへの誘導や誤情報の表示などが行われる可能性もあります。
攻撃者は、この脆弱性を利用して作成したパッド内容をHTML形式でエクスポートさせ、そのファイルを他の共同作業者やユーザーに開かせることで、彼らのブラウザを乗っ取ることが可能でした。
フロントエンドエンジニアが学ぶべき対策と示唆
今回のEtherpadの事例は、バックエンドだけでなくフロントエンド開発においてもXSS対策がいかに重要であるかを改めて示しています。我々フロントエンドエンジニアは、自身のアプリケーション開発において以下の点に特に注意を払う必要があります。
1. **ユーザー入力の徹底的なサニタイズとエスケープ**: ユーザーから入力されるデータ(特にHTMLとして解釈されうる文字列)は、表示する際に常に適切なエスケープ処理を施すべきです。今回のEtherpadのケースではHTML属性値のエスケープが不足していました。属性値だけでなく、要素のテキストコンテンツとして表示する場合も同様です。
2. **信頼できないコンテンツのDOMへの直接挿入の回避**: `innerHTML`や`outerHTML`プロパティの使用は、XSSの温床となりやすいです。信頼できないコンテンツをHTMLとしてDOMに挿入する必要がある場合は、必ずサニタイズ処理を行った上で、可能であればDOM API(`document.createElement`、`element.textContent`など)を利用して安全に要素を構築することを検討してください。
3. **CSP (Content Security Policy) の導入**: CSPを適切に設定することで、たとえXSSが成功したとしても、実行できるスクリプトのソースやインラインスクリプトの実行を制限し、被害を最小限に抑えることができます。
4. **セキュリティ機能を持つフレームワーク・ライブラリの活用**: React、Vue、Angularなどのモダンなフロントエンドフレームワークは、デフォルトでXSSに対する一定の保護機能(自動エスケープなど)を提供しています。これらの機能を正しく理解し、活用することが重要です。ただし、`dangerouslySetInnerHTML`などの機能を使う際は細心の注意が必要です。
5. **依存関係の定期的なアップデート**: 利用しているライブラリやフレームワーク、プラグインに脆弱性が発見されることは珍しくありません。GitHub Security Advisoryなどを定期的にチェックし、常に最新の修正が適用されたバージョンを利用するように心がけましょう。
修正内容と直ちなるアップデート推奨
この脆弱性は、EtherpadのPR #7905によって既に修正されています。修正では、HTML属性の名前と値を`Security.escapeHTMLAttribute`関数を使って適切にエスケープすることで、悪意のあるコードの注入を防ぐ対策が施されました。
Etherpadを利用しているユーザーは、この修正が適用された最新バージョンへ直ちにアップデートすることを強く推奨します。
まとめ
EtherpadのStored XSS脆弱性は、Webアプリケーション開発においてセキュリティ対策が単一のレイヤーで完結するものではなく、フロントエンドからバックエンドまで、ユーザー入力が取り扱われる全ての箇所で慎重な設計と実装が求められることを示唆しています。私たちフロントエンドエンジニアも、セキュリティリスクに対する深い理解を持ち、日々の開発において常に警戒心を忘れずに取り組んでいくことが重要です。