Highcharts Dashboardsは、サイドバーのコンポーネントラベルをHTMLとして解析します。
### 影響
編集モードのサイドバーに表示されるコンポーネントの言語文字列は、テキストとして挿入されるのではなく、HTMLとして解析されます。攻撃者が、これらの言語オプションを制御できる場合、イベントハンドラを含むマークアップを注入することができ、それがサイドバーによって影響を受けるラベルがレンダリングされる際に、ダッシュボードをホストしているページのオリジンで実行される可能性があります。この脆弱性を悪用するには、信頼できないデータがダッシュボードの言語設定に到達し、ユーザーが編集モードのサイドバーを開く必要があります。
### 対策
アップグレードが完了するまでの間、アプリケーションの起動時に`EditMode`を一度パッチしてください。このパッチは、サイドバーが構築される前に実行されるため、ラベルがレンダリングされる時点ではすでに安全です。文字列を`textContent`に割り当て、`innerHTML`を読み取ることで、すべてのマークアップをリテラルテキストに変換できます。これは、修正されたバージョンがレンダリングする動作と一致します。
モジュールをインポートした後、ボードが作成される前に、以下のコードを一度実行してください。
```js
{
const EditMode = window.Dashboards?.EditMode;
const escapeHTML = (text) => text
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>');
const patched = new WeakSet();
const originalInit = EditMode.prototype.init;
EditMode.prototype.init = function (...args) {
const labels = this.lang?.sidebar;
if (labels && !patched.has(this)) {
patched.add(this);
for (const key of Object.keys(labels)) {
if (typeof labels[key] === 'string') {
labels[key] = escapeHTML(labels[key]);
}
}
}
return originalInit.apply(this, args);
};
}
```
アプリケーションで編集モードが不要な場合は、無効にすることで(`editMode.enabled: false`)、この脆弱性を回避できます。
### パッチが適用されたバージョンの入手方法
パッチが適用されたバージョンは、通常の配布チャネルから入手できます。npmを使用している場合は、影響を受けるパッケージを上記のパッチが適用されたバージョンにアップグレードしてください。例えば、`npm install @highcharts/dashboards@4.2.3`と入力します。Highcharts DashboardsをCDNから読み込んでいる場合は、バージョン番号付きのURLを使用してください。例えば、`https://code.highcharts.com/dashboards/4.2.3/dashboards.js`です。各インストール方法の詳細については、[インストールガイド](https://www.highcharts.com/docs/dashboards/installation)を参照してください。
影響を受けるパッケージ:
- npm (JavaScript) @highcharts/dashboards: 影響を受けるバージョンは1.0.0以上、4.2.2以下。4.2.3で修正済み。