JPCERT/CC の連中と翻訳していた『C/C++セキュアコーディング』が Amazon で予約可能になってます (なんと1896位だっ!)。出版予定は 11/6。協力して頂いた方々、ありがとうございました。Cのプログラマはもちろんなんですが、基本的な仕組みがきっちり解説してあるので、案外コンピュータアーキテクチャの勉強にもなると思いますよ。普通の教科書で勉強するよか面白いかも。
また、この本の著者である Robert C. Seacode (すごい名前でしょ :-) さんを呼んで行うセミナーの受け付けも始まってます。26日まで早期割引受付中。
http://www.jpcert.or.jp/seminar.html
目次はこんな感じです。
↓
- 本書について
- 前書き
- 想定している読者
- 構成と内容
- 謝辞
- 想定している読者
- 著者について
- 第1章 今そこにある危機
- 1.1 現状認識
- 1.1.1 被害規模
- 1.1.2 攻撃主体
- 1.1.3 ソフトウェアセキュリティ
- 1.1.1 被害規模
- 1.2 セキュリティの概念
- 1.2.1 セキュリティポリシー
- 1.2.2 セキュリティ上の問題
- 1.2.3 脆弱性
- 1.2.4 攻撃コード
- 1.2.5 緩和策
- 1.2.1 セキュリティポリシー
- 1.3 C と C++
- 1.3.1 簡単な歴史
- 1.3.2 C 言語の問題点
- 1.3.3 レガシーコード
- 1.3.4 その他の言語
- 1.3.1 簡単な歴史
- 1.4 開発環境
- 1.4.1 オペレーティングシステム
- 1.4.2 コンパイラ
- 1.4.1 オペレーティングシステム
- 1.5 まとめ
- 1.6 参考資料
- 1.1 現状認識
- 第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.2.1 無制限文字列コピー
- 2.3 文字列の脆弱性
- 2.3.1 セキュリティ上の欠陥
- 2.3.2 バッファオーバーフロー
- 2.3.1 セキュリティ上の欠陥
- 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.8.1 予防
- 2.9 代表的な脆弱性
- 2.9.1 リモートログイン
- 2.9.2 Kerberos
- 2.9.3 Metamail
- 2.9.1 リモートログイン
- 2.10 まとめ
- 2.11 参考資料
- 2.1 文字列の特性
- 第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.10.1 構造化例外処理
- 3.11 脅威の緩和方法
- 3.11.1 W^X
- 3.11.2 カナリー
- 3.11.1 W^X
- 3.12 まとめ
- 3.13 参考資料
- 3.1 データロケーション
- 第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.2.1 初期化
- 4.3 Doug Lea メモリアロケータ
- 4.3.1 メモリ管理
- 4.3.2 バッファオーバーフロー
- 4.3.3 二重解放の脆弱性
- 4.3.4 解放済みメモリへの書き込み
- 4.3.1 メモリ管理
- 4.4 RtlHeap
- 4.4.1 Win32 のメモリ管理
- 4.4.2 RtlHeap のデータ構造
- 4.4.3 バッファオーバーフロー
- 4.4.4 再びバッファオーバーフロー
- 4.4.5 解放済みメモリへの書き込み
- 4.4.6 二重解放
- 4.4.7 索引テーブル
- 4.4.1 Win32 のメモリ管理
- 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.5.1 NULL ポインタ
- 4.6 代表的な脆弱性
- 4.6.1 CVS バッファオーバーフローの脆弱性
- 4.6.2 Microsoft データアクセスコンポーネント
- 4.6.3 CVS サーバの二重解放
- 4.6.4 MIT Kerberos 5 における脆弱性
- 4.6.1 CVS バッファオーバーフローの脆弱性
- 4.7 まとめ
- 4.8 参考資料
- 4.1 動的メモリ管理
- 第5章 整数演算
- 5.1 整数型
- 5.1.1 整数の表現形式
- 5.1.2 整数の型
- 5.1.3 整数の範囲
- 5.1.1 整数の表現形式
- 5.2 整数の変換
- 5.2.1 整数の格上げ
- 5.2.2 整数変換順位
- 5.2.3 符号なし整数型からの変換
- 5.2.4 符号付き整数型からの変換
- 5.2.5 符号付き文字と符号なし文字
- 5.2.6 通常の算術型変換
- 5.2.1 整数の格上げ
- 5.3 整数のエラー条件
- 5.3.1 整数オーバーフロー
- 5.3.2 符号エラー
- 5.3.3 切り捨てエラー
- 5.3.1 整数オーバーフロー
- 5.4 整数演算
- 5.4.1 加算
- 5.4.2 減算
- 5.4.3 乗算
- 5.4.4 除算
- 5.4.1 加算
- 5.5 脆弱性
- 5.5.1 整数オーバーフロー
- 5.5.2 符号エラー
- 5.5.3 切り捨てエラー
- 5.5.1 整数オーバーフロー
- 5.6 非例外的な論理エラー
- 5.7 脅威の緩和方法
- 5.8 代表的な脆弱性
- 5.9 まとめ
- 5.10 参考資料
- 5.1 整数型
- 第6章 書式指定出力
- 6.1 可変引数関数
- 6.2 書式指定出力関数
- 6.3 書式指定出力関数への攻撃
- 6.3.1 バッファオーバーフロー
- 6.3.2 出力ストリーム
- 6.3.3 プログラムの異常終了
- 6.3.4 スタック内部の調査
- 6.3.5 メモリ内容の調査
- 6.3.6 メモリの上書き
- 6.3.7 国際化
- 6.3.1 バッファオーバーフロー
- 6.4 スタックのランダム化
- 6.4.1 ランダム化スタックの回避
- 6.4.2 連続ワードへのアドレス書き込み
- 6.4.3 直接引数アクセス
- 6.4.1 ランダム化スタックの回避
- 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.5.1 静的な内容を動的に使用する
- 6.6 代表的な脆弱性
- 6.7 まとめ
- 6.8 参考資料
- 第7章 ファイル入出力
- 第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.1.1 効率的なメカニズム
- 8.2 システム品質要求工学
- 8.3 脅威のモデル化
- 8.4 ユースケースとミスユースケース
- 8.5 アーキテクチャと設計
- 8.6 既製ソフトウェア
- 8.6.1 既存コードに含まれる脆弱性
- 8.6.2 ラッパー
- 8.6.1 既存コードに含まれる脆弱性
- 8.7 コンパイラによる検査
- 8.8 入力値の検証
- 8.9 データの無害化
- 8.9.1 ブラックリスト
- 8.9.2 ホワイトリスト
- 8.9.3 検査
- 8.9.1 ブラックリスト
- 8.10 静的解析
- 8.10.1 Fortify
- 8.10.2 Prexis
- 8.10.3 Prevent
- 8.10.4 PREfix と PREfast
- 8.10.1 Fortify
- 8.11 品質保証
- 8.11.1 侵入検査
- 8.11.2 Fuzzing 検査
- 8.11.3 ソースコード監査
- 8.11.4 開発ガイドラインとチェックリスト
- 8.11.5 第三者によるセキュリティレビュー
- 8.11.1 侵入検査
- 8.12 メモリ保護
- 8.12.1 W^X
- 8.12.2 PaX
- 8.12.3 データ実行防止
- 8.12.1 W^X
- 8.13 縦深防御
- 8.14 TSP-Secure
- 8.14.1 計画と工程管理
- 8.14.2 品質管理
- 8.14.1 計画と工程管理
- 8.15 まとめ
- 8.16 参考資料
- 8.1 安全なソフトウェア開発のための原則