『C/C++セキュアコーディング』発売です

JPCERT/CC の連中と翻訳していた『C/C++セキュアコーディング』が Amazon で予約可能になってます (なんと1896位だっ!)。出版予定は 11/6。協力して頂いた方々、ありがとうございました。Cのプログラマはもちろんなんですが、基本的な仕組みがきっちり解説してあるので、案外コンピュータアーキテクチャの勉強にもなると思いますよ。普通の教科書で勉強するよか面白いかも。


Robert C. Seacord: C/C++セキュアコーディング


また、この本の著者である Robert C. Seacode (すごい名前でしょ :-) さんを呼んで行うセミナーの受け付けも始まってます。26日まで早期割引受付中。


http://www.jpcert.or.jp/seminar.html



目次はこんな感じです。

  • 序文
    • 本書について
    • 前書き
      • 想定している読者
      • 構成と内容
      • 謝辞
    • 著者について
    • 第2章 文字列操作
      • 2.1 文字列の特性
        • 2.1.1 C++ における文字列
      • 2.2 犯しやすい文字列操作の間違い
        • 2.2.1 無制限文字列コピー
        • 2.2.2 オフバイワンエラー
        • 2.2.3 NULL 終端エラー
        • 2.2.4 文字列の切り捨て
        • 2.2.5 関数なしの文字列エラー
      • 2.3 文字列の脆弱性
      • 2.4 プロセスのメモリ構造
        • 2.4.1 スタック管理
      • 2.5 スタック破壊
      • 2.6 コードインジェクション
      • 2.7 アークインジェクション
      • 2.8 脅威の緩和方法
        • 2.8.1 予防
        • 2.8.2 文字列ストリーム
        • 2.8.3 検出と回復
        • 2.8.4 カナリー
      • 2.9 代表的な脆弱性
        • 2.9.1 リモートログイン
        • 2.9.2 Kerberos
        • 2.9.3 Metamail
      • 2.10 まとめ
      • 2.11 参考資料
    • 第3章 ポインタ偽装
      • 3.1 データロケーション
      • 3.2 関数ポインタ
      • 3.3 データポインタ
      • 3.4 命令ポインタの変更
      • 3.5 グローバルオフセットテーブル
      • 3.6 .dtors セクション
      • 3.7 仮想ポインタ
      • 3.8 atexit() と on_exit()
      • 3.9 longjmp() 関数
      • 3.10 例外処理
        • 3.10.1 構造化例外処理
        • 3.10.2 システムデフォルト例外処理
      • 3.11 脅威の緩和方法
        • 3.11.1 W^X
        • 3.11.2 カナリー
      • 3.12 まとめ
      • 3.13 参考資料
    • 第4章 動的メモリ管理
      • 4.1 動的メモリ管理
      • 4.2 動的メモリ管理に発生する間違い
        • 4.2.1 初期化
        • 4.2.2 戻り値検査の誤り
        • 4.2.3 解放済みメモリの参照
        • 4.2.4 メモリの多重解放
        • 4.2.5 メモリ管理関数の不適合
        • 4.2.6 スカラと配列の識別間違い
        • 4.2.7 割り当て関数の誤った使用
      • 4.3 Doug Lea メモリアロケータ
      • 4.4 RtlHeap
      • 4.5 脅威の緩和方法
        • 4.5.1 NULL ポインタ
        • 4.5.2 一貫したメモリ管理
        • 4.5.3 ヒープの完全性検査
        • 4.5.4 phkmalloc
        • 4.5.5 ランダム化
        • 4.5.6 ガードページ
        • 4.5.7 OpenBSD
        • 4.5.8 実行時解析ツール
        • 4.5.9 Windows XP SP2
      • 4.6 代表的な脆弱性
      • 4.7 まとめ
      • 4.8 参考資料
    • 第5章 整数演算
      • 5.1 整数型
        • 5.1.1 整数の表現形式
        • 5.1.2 整数の型
        • 5.1.3 整数の範囲
      • 5.2 整数の変換
        • 5.2.1 整数の格上げ
        • 5.2.2 整数変換順位
        • 5.2.3 符号なし整数型からの変換
        • 5.2.4 符号付き整数型からの変換
        • 5.2.5 符号付き文字と符号なし文字
        • 5.2.6 通常の算術型変換
      • 5.3 整数のエラー条件
        • 5.3.1 整数オーバーフロー
        • 5.3.2 符号エラー
        • 5.3.3 切り捨てエラー
      • 5.4 整数演算
        • 5.4.1 加算
        • 5.4.2 減算
        • 5.4.3 乗算
        • 5.4.4 除算
      • 5.5 脆弱性
        • 5.5.1 整数オーバーフロー
        • 5.5.2 符号エラー
        • 5.5.3 切り捨てエラー
      • 5.6 非例外的な論理エラー
      • 5.7 脅威の緩和方法
        • 5.7.1 範囲検査
        • 5.7.2 強い型付け
        • 5.7.3 コンパイラによる検査
        • 5.7.4 安全な整数演算
        • 5.7.5 任意精度演算
        • 5.7.6 検査
        • 5.7.7 ソースコード監査
      • 5.8 代表的な脆弱性
        • 5.8.1 XDR ライブラリ
        • 5.8.2 Windows DirectX MIDI ライブラリ
        • 5.8.3 Bash
      • 5.9 まとめ
      • 5.10 参考資料
    • 第6章 書式指定出力
      • 6.1 可変引数関数
        • 6.1.1 ANSI C 標準引数
        • 6.1.2 UNIX System V の Varargs
      • 6.2 書式指定出力関数
        • 6.2.1 書式指定文字列
        • 6.2.2 長さ修飾子
        • 6.2.3 GCC
        • 6.2.4 Visual C++ .NET
      • 6.3 書式指定出力関数への攻撃
        • 6.3.1 バッファオーバーフロー
        • 6.3.2 出力ストリーム
        • 6.3.3 プログラムの異常終了
        • 6.3.4 スタック内部の調査
        • 6.3.5 メモリ内容の調査
        • 6.3.6 メモリの上書き
        • 6.3.7 国際化
      • 6.4 スタックのランダム化
        • 6.4.1 ランダム化スタックの回避
        • 6.4.2 連続ワードへのアドレス書き込み
        • 6.4.3 直接引数アクセス
      • 6.5 脅威の緩和方法
        • 6.5.1 静的な内容を動的に使用する
        • 6.5.2 書き込みバイトの制限
        • 6.5.3 ISO/IEC TR 24731
        • 6.5.4 iostream と stdio
        • 6.5.5 検査
        • 6.5.6 コンパイラによる検査
        • 6.5.7 字句解析
        • 6.5.8 静的汚染解析
        • 6.5.9 可変引数関数の改良
        • 6.5.10 Exec Shield
        • 6.5.11 FormatGuard
        • 6.5.12 Libsafe
        • 6.5.13 静的バイナリ解析
      • 6.6 代表的な脆弱性
        • 6.6.1 Washington University FTP Daemon
        • 6.6.2 CDE ToolTalk
      • 6.7 まとめ
      • 6.8 参考資料
    • 第7章 ファイル入出力
      • 7.1 並列処理
      • 7.2 諸行無常
      • 7.3 ロックファイルとファイルロック
      • 7.4 ファイルシステムへの攻撃
        • 7.4.1 シンボリックリンクを利用した攻撃
        • 7.4.2 一時ファイルへの攻撃
        • 7.4.3 unlink() 競合攻撃
        • 7.4.4 ファイル名の信用
        • 7.4.5 一時ファイル名の一意性
      • 7.5 脅威の緩和方法
        • 7.5.1 競合ウィンドウを閉じる
        • 7.5.2 競合オブジェクトの排除
        • 7.5.3 競合オブジェクトのアクセス制御
        • 7.5.4 競合検知ツール
      • 7.6 まとめ
    • 第8章 実践手法
      • 8.1 安全なソフトウェア開発のための原則
        • 8.1.1 効率的なメカニズム
        • 8.1.2 フェイルセーフなデフォルト
        • 8.1.3 完全な仲介
        • 8.1.4 オープンな設計
        • 8.1.5 権限の分離
        • 8.1.6 最小権限
        • 8.1.7 共通メカニズムの最小化
        • 8.1.8 心理的受容性
      • 8.2 システム品質要求工学
      • 8.3 脅威のモデル化
      • 8.4 ユースケースとミスユースケース
      • 8.5 アーキテクチャと設計
      • 8.6 既製ソフトウェア
        • 8.6.1 既存コードに含まれる脆弱性
        • 8.6.2 ラッパー
      • 8.7 コンパイラによる検査
      • 8.8 入力値の検証
      • 8.9 データの無害化
      • 8.10 静的解析
        • 8.10.1 Fortify
        • 8.10.2 Prexis
        • 8.10.3 Prevent
        • 8.10.4 PREfix と PREfast
      • 8.11 品質保証
        • 8.11.1 侵入検査
        • 8.11.2 Fuzzing 検査
        • 8.11.3 ソースコード監査
        • 8.11.4 開発ガイドラインとチェックリスト
        • 8.11.5 第三者によるセキュリティレビュー
      • 8.12 メモリ保護
      • 8.13 縦深防御
      • 8.14 TSP-Secure
        • 8.14.1 計画と工程管理
        • 8.14.2 品質管理
      • 8.15 まとめ
      • 8.16 参考資料