TortoiseCVS 脆弱コード改修

1. 改修の目的

Windows 11(64bit環境)への移行および今後の継続利用(延命)にあたり、長年放置されていたレガシーなC++コードに潜む潜在的なバグ、および不正入力によるメモリ破壊(バッファオーバーフロー)のリスクを排除し、システムの堅牢性を高める。

2. 改修対象の特定(AIスカウティング)

Windows側のエージェント(Claude Code)がソースツリーをスキャンし、シェル拡張の主要ロジックである src/cvstree/CvsLog.cpp を「改修の費用対効果が高い(=不安全な記述が密集している)」箇所として特定しました。

3. 脆弱性の検出と分析

WSL2側のエージェント(OpenClaw)が、静的解析ツール(cppcheck)と目視レビューを組み合わせて以下の脆弱性を抽出しました。

  • バッファオーバーフローのリスク: 外部(CVSサーバー等)からの入力に対し、固定長バッファ(char buf[30] 等)への境界チェックなしの書き込み。
  • 64bit環境での型安全性: strlen() の結果(size_t)を int へ切り詰めることによる符号反転のリスク。
  • 未定義動作: isdigit() への signed char 渡しによる、非ASCII文字混入時のクラッシュリスク。

4. 検証・修正プロセス(OS間連携パイプライン)

本プロジェクトの核心となる「OSを跨いだ自動検証・修正パイプライン」を構築しました。

  1. 隔離テスト環境の構築: Windows依存(wxWidgets/MSVC)が強いコードから、ロジックのみを抽出。WSL2上で動作するスタブ(身代わり)環境を構築しました。
  2. 安全性の自動検証: AddressSanitizer (ASan) および UndefinedBehaviorSanitizer (UBSan) を有効にした状態でユニットテストを実行。
    • 正常系、境界値(30バイト直前)、異常系(50バイト以上の巨大入力)のすべてでメモリ破壊が起きないことを確認しました。
  3. パッチ適用: 検証済みの安全なコードを、Windows側のソースツリーへ正確に反映しました。

5. 実施結果

  • 修正ファイル: src/cvstree/CvsLog.cpp
  • 主な修正内容: * SetRevTime() および SetLines() における入力バッファの境界チェック処理の追加。
    • 不正な入力(過度に長い文字列)が渡された場合に、オーバーフローさせず安全にスキップ・処理するガードロジックの実装。
  • ステータス: 動作検証完了、Gitへのコミット・プッシュ済み。