NanaSQLite セキュリティ/性能監査レポート(2026-07-22)
対象: NanaSQLite v1.6.0(現行 HEAD)
範囲: src/nanasqlite/ 全体、SQL 構築経路、暗号化、バックアップ/復元、Async/V2 境界、および回帰テスト群
結論
現行 HEAD では、ライブラリが受け取るべき入力を経由して再現可能な新規 Critical / High 脆弱性は確認されませんでした。
既知の識別子・列型・式・PRAGMA に関する SQL injection の回帰は、テストと実装レビューでブロックされていることを確認しました。なお、この結論はアプリケーションが SQL 文字列やファイルパスを未検証の利用者入力として直接渡さないことを前提にします。
| 区分 | Critical | High | Medium | Low | 状態 |
|---|---|---|---|---|---|
| 新規の再現可能な脆弱性 | 0 | 0 | 0 | 0 | 確認されず |
| 設計上の信頼境界 | 0 | 0 | 0 | 3 | 運用上の注意 |
実施した確認
- SQL が動的に組み立てられる全経路をレビュー
- AES-GCM / ChaCha20-Poly1305、バックアップ/復元、Async/V2 の境界をレビュー
python -m tox -e lint,type— PASSpython -m pytest tests -x -q— 1051 passed, 12 skipped
確認済みの防御
| 攻撃面 | 現行の防御 |
|---|---|
| 識別子 | _sanitize_identifier() による許可リスト検証と引用 |
| 列型 | 文字種・括弧深さの検証で列定義の割り込みを拒否 |
| SQL 式 | 危険な SQL、サブクエリ系キーワード、未許可関数を検査 |
| PRAGMA | 読取/書込の許可リスト |
| 暗号化値 | ランダム nonce の AEAD。復号失敗時に平文へフォールバックしない |
| バックアップ/復元 | integrity check、一時ファイルからの原子的置換、WAL/SHM の隔離 |
信頼境界と運用上の注意
SQL 文字列 API
execute() / execute_many() は任意 SQL を実行する管理者向け API です。query() の where、非識別子の columns、order_by も SQL 式を受け取ります。外部入力を文字列連結して渡さず、値は必ずプレースホルダーで渡してください。
python
db.query("users", where="email = ?", parameters=(email,))strict_sql_validation=True は追加の防御層ですが、任意 SQL を安全な検索 DSL に変換する機能ではありません。
バックアップ/復元のパス
Web API 等から受け取ったパスを直接 backup() / restore() に渡さず、アプリケーション側で許可ディレクトリを解決・検証してください。
高負荷時の非同期投入
サービス境界では semaphore 等で同時実行数を制限してください。無制限の投入は待ち行列とメモリ使用量を増加させます。
継続方針
- 値は必ずバインドし、識別子は
_sanitize_identifier()を経由させる。 - SQL 構築 API の変更時は注入回帰テストを追加する。
- リリース前に lint・型検査・全回帰テストを実行する。
- 依存パッケージの CVE は本レポートの対象外として、別途依存関係監査を行う。