Wails: `wildcardPatternToRegex`は、`BindingsAllowedOrigins`におけるサフィックスマッチによるOriginのバイパスを可能にする。

# セキュリティ脆弱性レポート: Wails v2 — ワイルドカードパターンによるOriginバリデータ回避

| | |
|---|---|
| **製品** | wailsapp/wails (v2) |
| **影響を受けるファイル** | `v2/internal/frontend/originvalidator/originValidator.go` |
| **影響を受けるバージョン** | `originValidator`を含むすべてのバージョン (2026年3月26日現在) |
| **CVSSv4.0** | **7.6 HIGH** — `CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:L/SC:L/SI:L/SA:N` |
| **CWE** | CWE-625: 緩い正規表現 |
| **プラットフォーム** | Windows / Linux / macOS (すべてのデスクトップ環境) |

---

## 概要

Wails v2は、`BindingsAllowedOrigins`を提供し、どのWebオリジンがIPC経由でGoバックエンドのメソッドを呼び出すことができるかを制限する。`wildcardPatternToRegex`におけるワイルドカードパターンのマッチングは、`*`を`.*`に変換するが、サブコンポーネントにアンカーが設定されていないため、サフィックスマッチされたオリジンが制限を回避できる。

許可されたオリジンと共通のプレフィックスを持つドメインを制御する攻撃者は(例:`myapp.com*`が設定されている場合、`myapp.community`)、任意のバインドされたGoメソッドを呼び出すことができ、アプリケーションが公開するAPIの範囲によっては、ファイルシステムへのアクセス、データの不正取得、またはコード実行が可能になる可能性がある。

---

## 脆弱性の詳細

### 根本原因

`wildcardPatternToRegex`は、ワイルドカードパターンを正規表現に変換する際に、特殊文字をエスケープし、`*`を`.*`に置き換える。置換された`.*`には制限がなく、ドットや追加のドメインコンポーネントを含む任意の文字シーケンスにマッチする。

### 脆弱なコード

**ファイル:** `v2/internal/frontend/originvalidator/originValidator.go`

```go
func (v *OriginValidator) wildcardPatternToRegex(wildcardPattern string) string {
specialChars := []string{"\\", ".", "+", "?", "^", "$", "{", "}", "(", ")", "|", "[", "]"}

escaped := wildcardPattern
for _, specialChar := range specialChars {
escaped = strings.ReplaceAll(escaped, specialChar, "\\"+specialChar)
}
```

```
// * は .* に置き換えられます — これは、ドットやドメイン区切り文字を含む、任意の文字シーケンスに一致します。
escaped = strings.ReplaceAll(escaped, "*", ".*")

return "^" + escaped + "$"
}
```

`https://myapp.com*` の正規表現は次のようになります。

```
^https://myapp\.com.*$
```

これは、`https://myapp.com` で始まるすべての文字列に一致します。例えば:

- `https://myapp.community` — 異なるトップレベルドメイン
- `https://myapp.com.attacker.com` — 攻撃者が制御するサブドメイン
- `https://myapp.comXXXXX` — 任意のサフィックス

### 範囲に関する注意

`options.go` の公式コメントでは、`https://*.myapp.com` がサブドメインプレフィックスのワイルドカードの例として示されています。このパターンは**影響を受けません**。この脆弱性は、開発者が末尾のワイルドカード (`myapp.com*`) を使用する場合にのみ発生します。これは、ドメインとそのすべてのサブパスまたはポートを許可しようとする場合に、自然な誤用です。

---

## 影響

Wails バインディングで登録されたすべての Go メソッドが、攻撃者のオリジンから呼び出し可能になります。アプリケーションによっては、次の影響が考えられます。

- ファイルシステムの読み取り/書き込み (デスクトップアプリで一般的)
- データベースクエリ
- OS コマンドの実行 (バインディングを介して公開されている場合)
- 機密設定または認証情報のアクセス

---

## 修正

**プルリクエスト:** https://github.com/wailsapp/wails/pull/5074

ワイルドカードは、フルドメインコンポーネントを表す場合にのみ展開されるようになりました (`://`、`.`、または `:` の直後)。部分的なラベルに付加されたワイルドカード (例: `com*`) は削除され、サフィックスベースの回避を防止します。包括的なテストスイートが追加されました。

---

## 公開までのタイムライン

| 日付 | イベント |
|---|---|
| 2026-03-26 | @Saku0512 によるソースコード監査中に脆弱性が発見されました |
| 2026-03-26 | GitHub Security Advisory を通じて非公開レポートが提出されました |
| 2026-03-26 | ベンダーによる確認と修正プルリクエストの作成 (#5074) |
| 未定 | パッチリリース |
| 未定 + 90 日 | 公開期限 |

影響を受けるパッケージ:
- go github.com/wailsapp/wails/v2: 影響を受けるバージョン >= 2.0.0、< 2.13.0、修正バージョン 2.13.0