# セキュリティ設計書

## 概要

本ドキュメントは、Avalonia UIフレームワークのセキュリティ設計について記載します。AvaloniaはクロスプラットフォームUIフレームワークであり、Windows、macOS、Linux、iOS、Android、WebAssemblyをサポートしています。UIフレームワークとしての特性上、従来のWebアプリケーションとは異なるセキュリティモデルを採用しており、主にデータ検証、入力処理、プラットフォーム固有のセキュリティ機構との統合に重点を置いています。

## 認証設計

### 認証方式

AvaloniaはUIフレームワークとして設計されており、認証機能は直接提供していません。認証はアプリケーション層で実装される必要があります。ただし、以下のコンポーネントが認証関連の実装をサポートします。

| 機能 | 説明 | 関連ファイル |
| --- | --- | --- |
| VNC認証 | Headless VNCプラットフォームでのパスワード認証 | `HeadlessVncPlatformExtensions.cs` |
| パスワード入力マスキング | TextBoxコントロールでのPasswordChar機能 | `TextBox.cs`, `MaskedTextBox.cs` |

#### VNC認証の実装詳細

```csharp
// 認証方式の選択
var options = new VncServerSessionOptions
{
    AuthenticationMethod = string.IsNullOrWhiteSpace(password)
        ? AuthenticationMethod.None
        : AuthenticationMethod.Password
};

// パスワード検証
session.PasswordProvided += (s, e) =>
{
    e.Accept(password.ToCharArray());
};
```

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | N/A（UIフレームワーク） | アプリケーション層で管理 |
| セッション固定化対策 | N/A（UIフレームワーク） | アプリケーション層で管理 |

## 認可設計

### 権限体系

AvaloniaはUIフレームワークであるため、固有の権限体系は持ちません。ただし、プラットフォームストレージAPIにおいてアクセス制御を実装しています。

| ロール | 権限 | 説明 |
| --- | --- | --- |
| ユーザー | ファイルアクセス | Storage APIを通じたファイル/フォルダアクセス |
| アプリケーション | セキュリティスコープ | iOS/macOSでのセキュリティスコープドリソースアクセス |

### アクセス制御

#### プラットフォームストレージアクセス制御

Avaloniaは各プラットフォームのストレージセキュリティモデルに準拠したアクセス制御を実装しています。

1. **iOS/macOSセキュリティスコープドリソース**
   - `SecurityScopedStream`クラスによるストリームラッパー
   - `StartAccessingSecurityScopedResource`/`StopAccessingSecurityScopedResource`によるアクセス管理
   - サンドボックス環境でのファイルアクセス保護

2. **ブラウザストレージ（WebAssembly）**
   - File System Access API経由でのアクセス
   - ユーザー許可に基づくファイルアクセス
   - `UnauthorizedAccessException`によるアクセス拒否ハンドリング

3. **ブックマーク管理**
   - `StorageBookmarkHelper`によるプラットフォーム間で統一されたブックマークエンコーディング
   - Base64エンコードされたプラットフォーム固有ブックマーク

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | アプリケーション層で実装（フレームワークは関与せず） |
| HSTS | アプリケーション層で実装（フレームワークは関与せず） |
| WebSocket | Designer Support機能でWebSocket通信を使用（SHA1ハンドシェイク） |

### WebSocket実装詳細

Designer SupportのHTMLTransport機能では、SimpleWebSocketHttpServerを使用してWebSocket通信を実装しています。

```csharp
// WebSocketハンドシェイク
var handshakeSource = _websocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
using (var sha1 = SHA1.Create())
    handshake = Convert.ToBase64String(sha1.ComputeHash(Encoding.UTF8.GetBytes(handshakeSource)));
```

**セキュリティ考慮事項**:
- 開発用途のみを想定
- 認証機能なし
- 本番環境での使用は非推奨

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | WebSocketハンドシェイクでSHA1を使用（RFC 6455準拠） |
| 保存データ | プラットフォームネイティブの暗号化に依存 |
| ブックマーク | Base64エンコーディング（暗号化ではなくエンコーディング） |

### 機密情報管理

#### パスワード入力

TextBoxコントロールは`PasswordChar`プロパティを提供し、入力文字のマスキングを実現します。

```csharp
public static readonly StyledProperty<char> PasswordCharProperty =
    AvaloniaProperty.Register<TextBox, char>(nameof(PasswordChar));
```

#### MaskedTextBoxによる入力制御

`MaskedTextBox`は`MaskedTextProvider`を使用して、入力値の検証とマスキングを行います。

```csharp
// パスワード文字の検証
if (!MaskedTextProvider.IsValidPasswordChar(baseValue))
{
    throw new ArgumentException($"'{baseValue}' is not a valid value for PasswordChar.");
}
```

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | UIフレームワークのため該当なし（ブラウザプラットフォームでは別途考慮が必要） |
| SQLインジェクション | UIフレームワークのため該当なし（データアクセスはアプリケーション層で実装） |
| CSRF | UIフレームワークのため該当なし |
| 不正入力 | DataAnnotations検証プラグイン、入力マスキング |

### データ検証プラグインシステム

Avaloniaは拡張可能なデータ検証プラグインシステムを提供しています。

#### IDataValidationPlugin インターフェース

```csharp
internal interface IDataValidationPlugin
{
    bool Match(WeakReference<object?> reference, string memberName);
    IPropertyAccessor Start(WeakReference<object?> reference, string propertyName, IPropertyAccessor inner);
}
```

#### DataAnnotationsValidationPlugin

.NET標準の`System.ComponentModel.DataAnnotations`に基づく検証を実装しています。

```csharp
public class DataAnnotationsValidationPlugin : IDataValidationPlugin
{
    public bool Match(WeakReference<object?> reference, string memberName)
    {
        reference.TryGetTarget(out var target);
        return target?
            .GetType()
            .GetRuntimeProperty(memberName)?
            .GetCustomAttributes<ValidationAttribute>()
            .Any() ?? false;
    }
}
```

検証エラーは`DataValidationException`または`AggregateException`として報告されます。

### URIバリデーション

`UriExtensions`クラスでURIスキーマの検証を実装しています。

```csharp
public static bool IsResm(this Uri uri) => uri.Scheme == "resm";
public static bool IsAvares(this Uri uri) => uri.Scheme == "avares";

public static Uri EnsureAbsolute(this Uri uri, Uri? baseUri)
{
    if (uri.IsAbsoluteUri)
        return uri;
    if(baseUri == null)
        throw new ArgumentException($"Relative uri {uri} without base url");
    if (!baseUri.IsAbsoluteUri)
        throw new ArgumentException($"Base uri {baseUri} is relative");
    return new Uri(baseUri, uri);
}
```

### パス検証

ブックマークデコード時にパスの検証を行います。

```csharp
if (decodeResult == DecodeResult.InvalidFormat
    && nativeBookmark.IndexOfAny(Path.GetInvalidPathChars()) < 0
    && !string.IsNullOrEmpty(Path.GetDirectoryName(nativeBookmark)))
{
    // 有効なファイルパスとして処理
    localPath = nativeBookmark;
    return true;
}
```

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| エラーログ | ストレージアクセスエラー、ブックマーク操作エラー | アプリケーション層で設定 |
| VNCログ | VNC接続エラー | セッション中のみ |

### ログ実装

Avaloniaは`Avalonia.Logging`名前空間でログ機能を提供しています。

```csharp
Logger.TryGet(LogEventLevel.Error, LogArea.IOSPlatform)?.
    Log(this, "GetBasicPropertiesAsync returned an error: {ErrorCode} {ErrorMessage}",
        error.Code, error.LocalizedFailureReason);

Logger.TryGet(LogEventLevel.Error, LogArea.VncPlatform)?.
    Log(tcpServer, "Error accepting client:{Exception}", e);
```

## プラットフォーム固有のセキュリティ

### iOS/macOS

| 機能 | 実装 |
| --- | --- |
| App Sandbox | SecurityScopedStreamによるスコープドリソースアクセス |
| ブックマーク | NSUrlBookmarkCreationOptions.SuitableForBookmarkFileを使用 |

### WebAssembly/Browser

| 機能 | 実装 |
| --- | --- |
| File System Access API | BrowserStorageProviderによるネイティブダイアログ統合 |
| 権限管理 | ユーザー許可に基づくファイルアクセス |

### Windows

| 機能 | 実装 |
| --- | --- |
| COM相互運用 | Win32StorageProviderによるネイティブダイアログ統合 |

## 備考

### セキュリティに関する制限事項

1. **UIフレームワークの特性**: Avaloniaは純粋なUIフレームワークであり、認証・認可・暗号化などの高レベルセキュリティ機能は直接提供していません。これらはアプリケーション層で実装する必要があります。

2. **Designer Support WebSocket**: 開発者向けのHTMLTransport機能は認証なしでWebSocket接続を受け付けるため、本番環境での使用は避けてください。

3. **ブックマークのエンコーディング**: StorageBookmarkHelperはBase64エンコーディングを使用していますが、これは暗号化ではないため、機密性は提供されません。

4. **SHA1の使用**: WebSocketハンドシェイクでSHA1を使用していますが、これはRFC 6455の仕様に準拠したものであり、セキュリティ目的ではありません。

### 推奨事項

1. アプリケーション開発時は、プラットフォーム固有のセキュリティ機能（iOS Keychain、Windows DPAPI等）を活用してください。
2. ネットワーク通信には必ずTLS/SSLを使用してください。
3. 機密データの保存には、プラットフォーム固有の暗号化APIを使用してください。
4. DataAnnotationsValidationPluginを活用して、入力検証を実装してください。
