スケジュール | ||
---|---|---|
開催日 | タイトル | |
2009-10-06 | part1<文字列・整数> | 終了 |
2009-10-20 | part2<ファイル入出力> | 終了 |
2009-11-02 | part3<動的メモリ管理・書式指定文字列> | 終了 |
プログラム | |
---|---|
part1 <文字列・整数> | |
13:30 - | 受付開始 |
14:00 - 16:00 | 文字列 |
16:00 - 16:15 | ~~~~ 休 憩 ~~~~ |
16:15 - 19:00 | 整 数 |
part2 <ファイル入出力> | |
13:30 - | 受付開始 |
14:00 - 15:40 | ファイル入出力 part 1 |
15:40 - 15:55 | ~~~~ 休 憩 ~~~~ |
15:55 - 17:35 | ファイル入出力 part 2 |
17:35 - 17:50 | ~~~~ 休 憩 ~~~~ |
17:50 - 19:30 | ファイル入出力 part 3 |
part3 <動的メモリ管理・書式指定文字列> | |
13:30 - | 受付開始 |
14:00 - 16:00 | 動的メモリ管理 |
16:00 - 16:15 | ~~~~ 休 憩 ~~~~ |
16:15 - 18:30 | 書式指定文字列 |
part1<文字列・整数>
文字列:
ユーザとソフトウエア間に発生するデータのやりとりの大部分は文字列によって行われます。
また、プログラム間でのデータ交換も文字列形式で行われるようになり、その結果、文字列表現や文字列管理、文字列操作における弱点がソフトウエア脆弱性を生み出しています。
C/C++ 言語における文字列操作、一般的なセキュリティ上の欠陥と、その結果発生する脆弱性と対処方法について解説します。
- C/C++ における文字列の特性
- 犯しやすい文字列操作の間違い
- 文字列の脆弱性
- プロセスのメモリ構成
- スタック破壊の仕組み
- コードインジェクション、アークインジェクションの仕組み
- 脅威の緩和方法 など
整数:
C/C++ 言語において整数型の取扱いに起因する脆弱性はこれまであまり重要視されていませんでしたが、その数は確実に増加しています。
攻撃者は、プログラムが本来想定する入力範囲に関わらず、異常動作を引き起こす入力値を見つけ出すことで脆弱性を利用しようとします。C/C++ 言語における整数型の取扱いに関する仕様と、そこから引き起こされるセキュリティ上の問題について体系的に解説します。
- 整数型の取り扱いについて
- 整数型の変換について(格上げ、整数変換順位、通常の算術型変換)
- 整数のエラー条件
- 脆弱性につながる整数演算
- 脆弱性(整数オーバーフロー、符号エラー、切り捨てエラー) など
part2<ファイル入出力>
ファイル入出力 part1:
ファイル入出力 part1 では Linux や UNIX など POSIX システムにおけるファイルシステムの仕組み、C/C++ におけるファイル入出力、プロセスの権限とその管理の方法について解説します。setuid() などを使用したプロセス権限管理は、適切かつ十分に行われないと様々な脆弱性を作り込むことにつながる危険性があります。 また、プロセス権限の管理を行うだけでは十分とは言えず、ファイル許可の管理を適切に行う必要があり、そのなかでプログラマが気をつけねばならないポイントについて解説します。
- ファイルシステム
- C/C++ の入出力
- 識別、所有者、権限、パーミッション
- プロセス権限
- 権限の変更、管理
- パーミッションの管理 など
※POSIX 標準、UNIX/Linux オペレーティングシステム、UNIX ファイルシステムを前提に進めます。
ファイル入出力 part2:
ファイル入出力 part2 では 主にパス名の解決にまつわる以下の問題について取り上げます。
- ディレクトリトラバーサル
- 等値エラー
- シンボリックリンク、ハードリンク
- 正規化
- 特殊ファイル
- サンドボックス など
ファイル入出力 part3:
プログラムは、スレッドやプロセス、タスクなどの単位で 2つ以上の独立した処理を同時に実行する並列処理を行うことがあります。この並列処理が不適切に管理された場合、競合状態が発生し、ソフトウェアの脆弱性につながることがあります。
ファイル入出力 part3 では競合状態に関する脆弱性のメカニズムとその脅威の緩和方法について解説します。
- 並列処理
- 検査・使用のタイミング
- ロックファイルとファイルロック
- ファイルシステムへの攻撃
- 脅威の緩和方法 など
part3<動的メモリ管理・書式指定文字列>
動的メモリ管理:
C/C++ ではプログラムが必要とするメモリを動的に取得・使用することが可能です。 大量のデータを扱うアプリケーションやリソースが限られている組み込み機器など、動的メモリ管理機能を使いこなさなければならない場面は多くあります。 動的メモリ管理に関する脆弱性が存在する場合、DoS 攻撃や任意のコード実行に使われる危険があります。 C/C++ が提供している動的メモリ管理の仕組みを正しく理解し、異常な状態に正しく対処できるようなコードを作ることが求められているのです。
動的メモリ管理では、 C/C++ における動的メモリ管理の仕組みとすでに知られている脆弱性の例、また安全なコードを書くための手法について解説します。
- C/C++ における動的メモリ管理
- 動的メモリ管理に関する脆弱性
- Doug Lea メモリアロケータ
- 動的メモリ管理とバッファオーバフロー
- 動的メモリ管理に関する脆弱性を防ぐ など
※POSIX プラットフォームにフォーカスしたものとなっています。
Linux 環境の exploit デモには Doug Lea の malloc (dlmalloc) を使用します。
書式指定文字列:
C99 標準では書式指定文字列と printf() や sprintf() に代表される可変個の引数を受け付ける書式指定出力関数を定義しています。 これら書式指定の仕組みは UNIX のコマンド行プログラムなどによく見られますが、任意のコードを実行するために悪用される危険性を持っています。 書式指定出力関数に対する攻撃の手法を解説し、その脅威を緩和する方法を紹介します。
- 書式指定出力
- 可変引数関数
- 書式指定出力関数
- 書式指定出力関数に対する攻撃
- スタックのランダム化
- 脅威の緩和方法
- 代表的な脆弱性 など