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を跨いだ自動検証・修正パイプライン」を構築しました。
- 隔離テスト環境の構築: Windows依存(wxWidgets/MSVC)が強いコードから、ロジックのみを抽出。WSL2上で動作するスタブ(身代わり)環境を構築しました。
- 安全性の自動検証: AddressSanitizer (ASan) および UndefinedBehaviorSanitizer (UBSan) を有効にした状態でユニットテストを実行。
- 正常系、境界値(30バイト直前)、異常系(50バイト以上の巨大入力)のすべてでメモリ破壊が起きないことを確認しました。
- パッチ適用: 検証済みの安全なコードを、Windows側のソースツリーへ正確に反映しました。
5. 実施結果
- 修正ファイル:
src/cvstree/CvsLog.cpp - 主な修正内容: *
SetRevTime()およびSetLines()における入力バッファの境界チェック処理の追加。- 不正な入力(過度に長い文字列)が渡された場合に、オーバーフローさせず安全にスキップ・処理するガードロジックの実装。
- ステータス: 動作検証完了、Gitへのコミット・プッシュ済み。