本文へカーネルのバグは平均で2年間隠れ続ける。中には20年隠れるものもある
概要
- Linuxカーネルのバグは 平均2.1年 発見されずに残存
- CAN bus や SCTP など一部サブシステムでバグ寿命が特に長い
- バグ検出は年々 高速化 しているが、古いバグのバックログが存在
- 自己修正 (バグ導入者自身が修正)も多く、コード所有意識が影響
- 長寿命バグは 参照カウントミス や レースコンディション などが多い
Linuxカーネルのバグ寿命と発見の傾向
- Fixes:タグ 付きのバグ修正ペアを 125,183件 分析
- 有効な記録 は123,696件(寿命0~27年)
- 平均バグ寿命 は2.1年、最長は 20.7年 (ethtoolのバッファオーバーフロー)
- 2010年では 1年以内発見率0%、2022年には 69% に向上
- VulnBERT によるバグ検出精度は 92.2%、偽陽性率は1.2%(CodeBERTは48%)
バグ発見までの時間とその変化
- 2025年のみのデータでは 平均寿命2.8年、全履歴では 2.1年 に短縮
- 5年以上発見されないバグ は全体の13.5%(全履歴)、19.4%(2025年のみ)
- バグ発見までの速度は 年々向上 傾向
- 2010年導入バグ:平均寿命9.9年、1年以内発見0%
- 2022年導入バグ:平均寿命0.8年、1年以内発見69%
- Syzkaller や KASAN などのサニタイザ、静的解析、レビュー体制強化が寄与
バグの発見と修正のパターン
- 新規バグは 早期発見、古いバグは バックログ として残存
- 2024-2025年修正バグの60%が直近2年で導入
- 18%が5-10年前、6.5%が10年以上前に導入
- カーネルの Fixes:タグ を活用したバグ追跡手法
- git logによるFixes:タグ抽出
- 修正・導入コミットの日付取得
- サブシステム分類・バグ種別分類
- バグ寿命計算
サブシステムごとのバグ寿命
- CAN bus (4.2年)、 SCTP (4.0年)、 USB (3.5年)などが長寿命
- BPF (1.1年)、 GPU (1.4年)は短寿命
- ニッチなプロトコル や テストカバレッジ不足 が長寿命の要因
- GPU や BPF は専用のファジングインフラ整備により短期間で発見
バグ種別ごとの寿命
- レースコンディション は平均5.1年と最も発見が遅い
- 整数オーバーフロー (3.9年)、 use-after-free (3.2年)、 メモリリーク (3.1年)なども長め
- null参照 や デッドロック は比較的早期に発見
長寿命バグの特徴と事例
- 参照カウント漏れ、 NULLチェック漏れ、 整数オーバーフロー、 状態機械のレース が典型
- 19年間修正されなかった netfilterのrefcountリーク 事例
- テスト条件が特殊で再現困難
- メモリリークとして長期間放置
- 不完全な修正 も多く、"未定義動作"や"再現できなかった"旨のコミットは要注意
なぜ一部バグが長期間隠れるのか
- ファジングカバレッジ不足
- Syzkallerはシステムコールには強いが状態遷移が必要なプロトコルに弱い
- トリガー条件が複雑
- 特定のパケットシーケンスや同時実行、メモリ圧迫などが必要
- 古いコードのレビュー不足
長寿命バグのアナトミー
- 参照カウントミス
- 例:kref_get後にエラーパスでkref_putし忘れ
- NULLチェックタイミングの誤り
- 取得直後にデリファレンスし、その後でNULLチェック
- 整数オーバーフロー
- 状態機械のレース
今後の課題と展望
- 検出ツールのさらなる精度向上
- テストカバレッジの拡大
- コード所有意識とレビュー体制の強化
- 不完全修正の早期発見
- "未定義動作"や"再現できなかった"コミットへの追加レビュー
提供: ハクソク · 要約更新:
AIによる日本語要約です。内容は原文とあわせてご確認ください。
Hacker Newsの議論を読む
Firefoxのバグって、そんなに長く放置されるんだね。