# セキュリティ設計書

## 概要

本ドキュメントは、F# コンパイラ (dotnet/fsharp) プロジェクトにおけるセキュリティ設計を記載する。本プロジェクトはF#言語のコンパイラ、コアライブラリ、およびエディタツールを提供するオープンソースプロジェクトであり、コンパイラとしてのセキュリティ機能（アセンブリ署名、アクセス制御、ハッシュ生成など）を中心に設計されている。

## 認証設計

### 認証方式

本プロジェクトはコンパイラであり、エンドユーザー認証を直接処理するアプリケーションではない。ただし、以下のコード署名・検証に関する認証機能を提供する。

| 認証種別 | 説明 | 実装箇所 |
| --- | --- | --- |
| アセンブリ厳密名署名 | RSA暗号化を使用したアセンブリの署名と検証 | `src/Compiler/AbstractIL/ilsign.fs` |
| 公開鍵認証 | 公開鍵/秘密鍵ペアによるアセンブリ署名 | `ILStrongNameSigner` クラス |
| InternalsVisibleTo | 信頼されたアセンブリ間のアクセス許可 | `src/FSharp.Build/InternalsVisibleTo.fs` |

### セッション管理

本プロジェクトはコンパイラであり、セッション管理は適用されない。

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | N/A | コンパイラはステートレスなコマンドラインツール |
| セッション固定化対策 | N/A | 該当なし |

## 認可設計

### 権限体系

本プロジェクトでは、.NET のアクセス修飾子に基づくコンパイル時のアクセス制御を実装している。

| ロール | 権限 | 説明 |
| --- | --- | --- |
| Public | 全アセンブリからアクセス可能 | `ILMemberAccess.Public` |
| Internal | 同一アセンブリ内のみアクセス可能 | `ILMemberAccess.Assembly` |
| Private | 定義クラス内のみアクセス可能 | `ILMemberAccess.Private` |
| Protected | 派生クラスからアクセス可能 | `ILMemberAccess.Family` |
| InternalsVisibleTo | 指定されたアセンブリにInternal公開 | `InternalsVisibleToAttribute` |

### アクセス制御

`AccessibilityLogic.fs` モジュールにおいて、以下のアクセス制御ドメインを定義:

| ドメイン | 説明 |
| --- | --- |
| AccessibleFromEverywhere | 公開アイテムのみ返却 |
| AccessibleFromSomeFSharpCode | Public, Family, FamilyOrAssembly を返却 |
| AccessibleFromSomewhere | 全アイテムを返却（エラーパス用） |
| AccessibleFrom | 指定されたコンパイルパスとTyconRefからアクセス可能なアイテムを返却 |

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | コンパイラ自体は通信機能を持たないが、NuGetパッケージ取得時はHTTPSを使用 |
| HSTS | N/A（コンパイラは直接HTTP通信を行わない） |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| アセンブリ署名 | RSA (SHA-1, PKCS#1 v1.5 パディング) |
| ソースファイルチェックサム | SHA-256（デフォルト）、SHA-1（オプション） |
| キャッシュハッシュ | MD5 (内部キャッシュキー生成用) |
| PDB署名 | SHA-256 |

### 暗号化実装詳細

#### アセンブリ厳密名署名 (`ilsign.fs`)

```
- アルゴリズム: RSA (CALG_RSA_SIGN)
- ハッシュ: SHA-1 (HashAlgorithmName.SHA1)
- パディング: PKCS#1 v1.5 (RSASignaturePadding.Pkcs1)
- 鍵形式: CLR形式のキーブロブ (PUBLICKEYBLOB/PRIVATEKEYBLOB)
```

#### キャッシュハッシュ (`Hashing.fs`)

```
- アルゴリズム: MD5 (System.Security.Cryptography.MD5)
- 用途: 内部キャッシュキー生成
- スレッドセーフ: ThreadLocal による実装
```

### 機密情報管理

| 対象 | 管理方式 |
| --- | --- |
| 秘密鍵ファイル | `--keyfile` オプションで外部ファイル参照 |
| キーコンテナ | `--keycontainer` オプション（.NET Framework のみ、非推奨） |
| 遅延署名 | `--delaysign` オプションで公開鍵のみ埋め込み |
| 公開署名 | `--publicsign` オプションで公開鍵署名 |

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | N/A（コンパイラはWebアプリケーションではない） |
| SQLインジェクション | N/A（データベース操作なし） |
| CSRF | N/A（HTTPリクエスト処理なし） |
| コードインジェクション | F#ソースコードの構文解析・型チェックによる入力検証 |
| パス走査攻撃 | ファイルシステムアクセスは絶対パスと相対パス解決による制御 |

### 入力検証

| 検証種別 | 説明 | 実装箇所 |
| --- | --- | --- |
| ソースコード構文検証 | レキサー/パーサーによる構文検証 | `lex.fsl`, `pars.fsy` |
| 型検証 | 型チェッカーによる型安全性検証 | `Checking/` 配下モジュール |
| 属性検証 | コンパイラ属性の妥当性検証 | `AttributeChecking.fs` |
| アセンブリバージョン検証 | ILVersionパース時の検証 | `CreateILModule.fs` |
| RSAパラメータ検証 | 暗号鍵の形式検証 | `ilsign.fs` の `validateRSAField` |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| コンパイラ警告/エラー | 診断メッセージ | ビルドセッション中 |
| コンパイル時メトリクス | ビルド時間、メモリ使用量（オプション） | 出力先による |

## セキュリティ属性

### .NETセキュリティ属性のサポート

| 属性 | 用途 | 実装箇所 |
| --- | --- | --- |
| SecurityCriticalAttribute | セキュリティクリティカルコードの指定 | `AttributeChecking.fs` |
| SecuritySafeCriticalAttribute | 安全なセキュリティクリティカルコードの指定 | `AttributeChecking.fs` |
| AllowPartiallyTrustedCallersAttribute | 部分信頼呼び出し許可 | `TcGlobals.fs` |
| UnverifiableAttribute | 検証不可能コードの警告 | `AttributeChecking.fs` |

### Windows マニフェスト

```xml
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
```

コンパイラは管理者権限を要求せず、呼び出し元の権限で実行される（`default.win32manifest`）。

## コンパイラオプション（セキュリティ関連）

| オプション | 説明 | デフォルト値 |
| --- | --- | --- |
| `--keyfile` | アセンブリ署名用キーファイルの指定 | なし |
| `--keycontainer` | キーコンテナ名の指定（非推奨） | なし |
| `--delaysign` | 遅延署名の有効化 | false |
| `--publicsign` | 公開署名の有効化 | false |
| `--checksumAlgorithm` | ソースファイルチェックサムアルゴリズム | SHA256 |

## 備考

### セキュリティ上の考慮事項

1. **SHA-1の使用**: アセンブリ署名には依然としてSHA-1が使用されている。これは.NETランタイムとの互換性のためであるが、セキュリティ観点からはSHA-256への移行が推奨される。

2. **MD5の内部使用**: キャッシュキー生成にMD5が使用されている。これはセキュリティ目的ではなくパフォーマンス目的であるが、SHA-256への置き換えを検討してもよい。

3. **キーコンテナのサポート**: .NET Core/.NET 5+ではキーコンテナはサポートされておらず、使用時に警告が発生する。

4. **型プロバイダーのセキュリティ**: 型プロバイダー（Type Providers）は外部コードを実行する可能性があり、信頼できるソースからのみ使用する必要がある。

5. **InternalsVisibleTo**: 公開鍵を指定してInternalsVisibleToを使用することで、なりすまし攻撃を防止できる。
