Skip to content

NanaSQLite セキュリティ/性能監査レポート(2026-07-22)

対象: NanaSQLite v1.6.0(現行 HEAD)
範囲: src/nanasqlite/ 全体、SQL 構築経路、暗号化、バックアップ/復元、Async/V2 境界、および回帰テスト群

結論

現行 HEAD では、ライブラリが受け取るべき入力を経由して再現可能な新規 Critical / High 脆弱性は確認されませんでした。

既知の識別子・列型・式・PRAGMA に関する SQL injection の回帰は、テストと実装レビューでブロックされていることを確認しました。なお、この結論はアプリケーションが SQL 文字列やファイルパスを未検証の利用者入力として直接渡さないことを前提にします。

区分CriticalHighMediumLow状態
新規の再現可能な脆弱性0000確認されず
設計上の信頼境界0003運用上の注意

実施した確認

  • SQL が動的に組み立てられる全経路をレビュー
  • AES-GCM / ChaCha20-Poly1305、バックアップ/復元、Async/V2 の境界をレビュー
  • python -m tox -e lint,type — PASS
  • python -m pytest tests -x -q1051 passed, 12 skipped

確認済みの防御

攻撃面現行の防御
識別子_sanitize_identifier() による許可リスト検証と引用
列型文字種・括弧深さの検証で列定義の割り込みを拒否
SQL 式危険な SQL、サブクエリ系キーワード、未許可関数を検査
PRAGMA読取/書込の許可リスト
暗号化値ランダム nonce の AEAD。復号失敗時に平文へフォールバックしない
バックアップ/復元integrity check、一時ファイルからの原子的置換、WAL/SHM の隔離

信頼境界と運用上の注意

SQL 文字列 API

execute() / execute_many() は任意 SQL を実行する管理者向け API です。query()where、非識別子の columnsorder_by も SQL 式を受け取ります。外部入力を文字列連結して渡さず、値は必ずプレースホルダーで渡してください。

python
db.query("users", where="email = ?", parameters=(email,))

strict_sql_validation=True は追加の防御層ですが、任意 SQL を安全な検索 DSL に変換する機能ではありません。

バックアップ/復元のパス

Web API 等から受け取ったパスを直接 backup() / restore() に渡さず、アプリケーション側で許可ディレクトリを解決・検証してください。

高負荷時の非同期投入

サービス境界では semaphore 等で同時実行数を制限してください。無制限の投入は待ち行列とメモリ使用量を増加させます。

継続方針

  1. 値は必ずバインドし、識別子は _sanitize_identifier() を経由させる。
  2. SQL 構築 API の変更時は注入回帰テストを追加する。
  3. リリース前に lint・型検査・全回帰テストを実行する。
  4. 依存パッケージの CVE は本レポートの対象外として、別途依存関係監査を行う。