# セキュリティ設計書

## 概要

本ドキュメントは、libuv（v1.48.0相当）のセキュリティ設計を記述する。libuvはクロスプラットフォーム対応の非同期I/Oライブラリであり、Node.jsのコアランタイムとして使用される。Webアプリケーションとは異なるシステムレベルのCライブラリであるため、認証・認可やCSRF/XSS対策は設計スコープ外となる。本書では、ライブラリとしてのメモリ安全性、通信セキュリティ、入力検証、暗号的乱数生成、ファイルディスクリプタ管理、シグナル処理の安全性を中心に記載する。

## 認証設計

### 認証方式

libuvはシステムレベルの非同期I/Oライブラリであり、認証機能は設計スコープ外である。認証はlibuvを利用する上位アプリケーション層（例：Node.jsのHTTPモジュール、OpenSSL統合層）で実装される。

### セッション管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| セッション有効期限 | 該当なし | libuvはセッション管理を提供しない |
| セッション固定化対策 | 該当なし | 上位アプリケーション層で対応 |

## 認可設計

### 権限体系

| ロール | 権限 | 説明 |
| --- | --- | --- |
| 該当なし | - | libuvは認可機構を提供しない。OSのプロセス権限モデルに依存する |

### アクセス制御

libuvはOSレベルのアクセス制御機構に依存する。ファイルシステム操作（`uv_fs_*` API群）はOS標準のパーミッションチェックを経由し、ソケット操作はOSのネットワークアクセス制御に従う。ライブラリ自体は追加のアクセス制御レイヤーを実装しない。

ただし、以下のセキュリティ設計が含まれる：

- **ファイルディスクリプタの自動クローズ**（`SOCK_CLOEXEC`, `O_CLOEXEC`）: `exec()`時に子プロセスへファイルディスクリプタが漏洩することを防止（`src/unix/core.c`, `src/unix/pipe.c`）
- **プロセス管理**: 子プロセスのステータス検証とPID検証（`src/unix/process.c`）

## 通信セキュリティ

| 項目 | 対策 |
| --- | --- |
| HTTPS | libuvはTLS/SSLを実装しない。上位層（OpenSSL等）で対応 |
| HSTS | 該当なし（HTTPプロトコルはスコープ外） |
| ソケットセキュリティ | `SOCK_CLOEXEC`による`exec()`時のFD漏洩防止（`src/unix/core.c`） |
| ソケット非同期化 | `SOCK_NONBLOCK`によるブロッキング回避（`src/unix/core.c`） |
| パイプセキュリティ | `O_CLOEXEC`によるFD漏洩防止、パイプ名のNULバイト検証（`src/unix/pipe.c`） |
| IPアドレス検証 | `uv_inet_pton()`/`uv_inet_ntop()`でNULLチェック・バッファ境界チェック実施（`src/inet.c`） |

## データセキュリティ

### 暗号化

| 対象 | 暗号化方式 |
| --- | --- |
| 通信 | libuvは暗号化を実装しない。上位層（OpenSSL/BoringSSL等）で対応 |
| 保存データ | libuvは暗号化を実装しない。上位アプリケーション層で対応 |

### 機密情報管理

libuvは暗号的に安全な乱数生成API `uv_random()` を提供する（`src/random.c`）。プラットフォームごとに最も安全な乱数ソースを優先的に使用する：

| プラットフォーム | 一次ソース | フォールバック |
| --- | --- | --- |
| Linux | `getrandom(2)` syscall | `/dev/urandom` |
| macOS/OpenBSD | `getentropy()` | `/dev/urandom` |
| FreeBSD | `getrandom(2)` syscall | `/dev/urandom` |
| NetBSD | `sysctl(KERN_ARND)` | - |
| Windows | `RtlGenRandom()` | - |
| AIX/QNX | `/dev/random` | - |
| IBM i (PASE) | `/dev/urandom` | - |

**バッファサイズ制限**: `buflen > 0x7FFFFFFFu` の場合は `UV_E2BIG` エラーを返却（`src/random.c:94-107`）

**注意事項**: 機密データ（パスワード等）のメモリ上での確実な消去機構（`explicit_bzero()`相当）は実装されていない。`memset()`による初期化のみであり、コンパイラの最適化によって消去処理が削除される可能性がある。

## 入出力対策

| 脅威 | 対策 |
| --- | --- |
| XSS | 該当なし（libuvはHTMLレンダリングを行わないシステムレベルライブラリ） |
| SQLインジェクション | 該当なし（libuvはデータベースアクセスを行わない） |
| CSRF | 該当なし（libuvはHTTPプロトコルを処理しない） |
| バッファオーバーフロー | `uv__strscpy()`による安全な文字列コピー（常にNULL終端保証）（`src/strscpy.c`）。IPv4/IPv6変換でのバッファサイズ検証（`src/inet.c`）。`uv_random()`のバッファサイズ上限チェック（`src/random.c`） |
| NULバイトインジェクション | パイプ名内の埋め込みNULバイト検出関数`includes_invalid_nul()`（`src/unix/pipe.c:34-45`）。Linuxアブストラクトソケット名前空間への対応 |
| UTF-8インジェクション | IDNA処理における`uv__wtf8_decode1()`でUTF-8シーケンスの厳密な検証（`src/idna.c:28-68`）。無効なUTF-8シーケンスの検出・拒否 |
| 整数オーバーフロー | `uv__strscpy()`で`SSIZE_MAX`超過チェック。乱数バッファサイズで`0x7FFFFFFFu`上限チェック |

## メモリ安全性

### サニタイザーサポート

libuvはビルド時に以下のメモリ/スレッドサニタイザーを有効化可能（`CMakeLists.txt:44-100`）：

| サニタイザー | フラグ | 検出対象 |
| --- | --- | --- |
| AddressSanitizer (ASan) | `-fsanitize=address` | ヒープ/スタックバッファオーバーフロー、Use-After-Free |
| MemorySanitizer (MSan) | `-fsanitize=memory` | 初期化されていないメモリの読み取り |
| ThreadSanitizer (TSan) | `-fsanitize=thread` | データ競合、デッドロック |
| UndefinedBehaviorSanitizer (UBSan) | `-fsanitize=undefined` | 未定義動作（符号付き整数オーバーフロー等） |

### MSan統合

`src/unix/internal.h:43-55` で `uv__msan_unpoison` マクロを定義。MSan有効時は `__msan_unpoison` にマッピングし、カーネルから返却されるデータの誤検出を防止する。

### コンパイラ警告設定

| コンパイラ | フラグ | 目的 |
| --- | --- | --- |
| GCC/Clang | `-Wall -Wextra -Wstrict-prototypes` | 暗黙の型変換、未使用変数、プロトタイプ宣言の強制（`CMakeLists.txt:121-126`） |
| MSVC | `/W4` | 警告レベル4（`CMakeLists.txt:108`） |
| GCC/Clang | `-fno-strict-aliasing` | Strict aliasing違反による未定義動作の防止（`CMakeLists.txt:167-168`） |

### アサーション

プロジェクト全体で811件以上の`assert()`が使用されており、デバッグビルドにおいてプログラム状態の前提条件を検証する。

### 未実装のセキュリティフラグ

| フラグ | 説明 | 状態 |
| --- | --- | --- |
| `-D_FORTIFY_SOURCE=2` | glibc関数（memcpy, sprintf等）の実行時バッファ検査 | 未実装 |
| `-fstack-protector-strong` | スタックカナリアによるスタックバッファオーバーフロー検出 | 未実装 |

## シグナル処理の安全性

libuvのシグナル処理（`src/unix/signal.c`）は以下のセキュリティ設計を採用する：

| 設計要素 | 実装 | ファイル位置 |
| --- | --- | --- |
| パイプベースロック | シグナルセーフな同期機構。`read()`/`write()`のみ使用 | `src/unix/signal.c:56, 115-136` |
| シグナルマスキング | `pthread_sigmask(SIG_SETMASK)`で全シグナルをブロックし操作の原子性を保証 | `src/unix/signal.c:139-161` |
| メッセージ初期化 | シグナルハンドラ内で`memset(&msg, 0, sizeof msg)`によるゼロ初期化 | `src/unix/signal.c:188` |
| Red-Blackツリー | 複数シグナルハンドラの効率的な管理 | `src/unix/signal.c:40, 54-60` |
| フォーク後リセット | `uv__signal_loop_fork()`でパイプFDの再初期化 | `src/unix/signal.c:286-310` |
| エラー時abort | ロック取得失敗・シグナルマスク設定失敗時に即座に`abort()` | `src/unix/signal.c:139-161` |

## スレッド安全性

| 設計要素 | 実装 | ファイル位置 |
| --- | --- | --- |
| スタックサイズ検証 | 最小8192バイト保証、`PTHREAD_STACK_MIN`との比較 | `src/unix/thread.c:72-80` |
| ThreadSanitizer対応 | `__SANITIZE_THREAD__`マクロ定義 | `src/unix/internal.h:85-94` |
| シグナルマスク操作 | `pthread_sigmask()`使用（スレッドセーフ） | `src/unix/signal.c` |

## Seccomp/コンテナ対応

libuvはLinux環境でのSeccompフィルタリングを認識し、適切にエラーハンドリングを行う（`src/unix/linux.c:457`, `src/unix/fs.c:1548-1549`）。Docker環境（libseccomp < 2.3.3）でのEPERMエラーをSeccomp制限として認識する。

## DNS解決のセキュリティ

| 設計要素 | 実装 | ファイル位置 |
| --- | --- | --- |
| エラーコード標準化 | `uv__getaddrinfo_translate_error()`でプラットフォーム間エラーコードを統一 | `src/unix/getaddrinfo.c` |
| IDNA 2008対応 | `uv__wtf8_decode1()`でUTF-8デコードの厳密な検証 | `src/idna.c:28-68` |
| 無効シーケンス検出 | 不正なUTF-8 continuationバイト、サロゲートペア等の検出・拒否 | `src/idna.c` |

## 監査ログ

| ログ種別 | 記録内容 | 保持期間 |
| --- | --- | --- |
| 該当なし | libuvはログ出力機構を提供しない | - |

libuvはシステムレベルのI/Oライブラリであり、監査ログ機構は設計スコープ外である。ログ出力は上位アプリケーション層で実装する。エラー発生時はエラーコード（`UV_ERRNO_MAP`で定義、`include/uv.h`）を呼び出し元に返却し、ログ出力の判断は呼び出し側に委ねる。

## 備考

### セキュリティポリシー

libuvはセキュリティ脆弱性報告プロセスを`SECURITY.md`で定義している。

### 推奨事項

1. **コンパイル時フラグの強化**: `-D_FORTIFY_SOURCE=2`および`-fstack-protector-strong`の有効化を推奨
2. **機密データの安全な消去**: `explicit_bzero()`または`OPENSSL_cleanse()`相当の関数実装を推奨
3. **定期的なセキュリティ監査**: サニタイザー（ASan/MSan/TSan/UBSan）を有効にしたCIビルドの継続的実行

### セキュリティ設計の前提

- libuvはアプリケーションフレームワークではなくシステムレベルライブラリであるため、認証・認可・セッション管理・CSRF/XSS対策はスコープ外
- 暗号化通信（TLS/SSL）は上位層で実装される前提
- OSのプロセス権限モデルとファイルシステムパーミッションに依存
