Secure Programming for Linux and Unix HOWTO

David A. Wheeler

高橋 聡 - 日本語訳

v2.962 Edition

v2.962, 12 March 2002

この文書は、Linux および Unix システム上で安全なプログラムを書く際に必要と なる設計や実装について、そのガイドラインを提供します。 遠隔のデータを見るためのビューアーや Web アプリケーション(CGI スクリプト を含む)、ネットワーク・サーバ、setuid や setgid してあるプログラムが対象です。 C や C++、Java、Perl、PHP、Python、TCL、Ada95 個別のガイドラインも掲載します。


Table of Contents
1. はじめに
2. 背景
2.1. Unix や Linux、オープンソースもしくは フリーソフトウェアについて
2.2. セキュリティの原則
2.3. なぜプログラマは危ないコードを書いてしまうのか
2.4. オープンソースはセキュリティに効果があるのか
2.5. 安全なプログラムの種類
2.6. 疑い深く、こだわりが強いことに価値がある
2.7. このドキュメントを書いた訳は ?
2.8. 設計と実装の指針についての情報源
2.9. その他のセキュリティ情報源
2.10. ドキュメントでの約束事
3. Linux と Unix のセキュリティ機能
3.1. プロセス
3.2. ファイル
3.3. System V IPC
3.4. ソケットとネットワーク接続
3.5. シグナル
3.6. Quota と リソースの制限
3.7. ダイナミックリンク・ライブラリ
3.8. Audit(監査)
3.9. PAM
3.10. Unix ライクなシステムに固有なセキュリティ拡張機能
4. 入力されるものすべてを検証すること
4.1. コマンドライン
4.2. 環境変数
4.3. ファイル・ディスクリプタ
4.4. ファイルの内容
4.5. Web ベースのアプリケーションの入力(特に CGI スクリプト)
4.6. その他の入力
4.7. 自然言語(ロカール)の選択
4.8. 文字のエンコード
4.9. サイトにまたがった悪意あるコンテンツ(Cross-site Malicious Content)を 防ぐ
4.10. 再表示する可能性のある HTML や URI にはフィルタをかける
4.11. クエリ以外の実行に HTTP の GET 命令を使わせない
4.12. SPAM に対抗する
4.13. 入力時間と負荷レベルに制限をかける
5. バッファオーバーフローの回避
5.1. C や C++ の危険なところ
5.2. C と C++ でのライブラリによる解決策
5.3. C や C++ でのコンパイルによる解決
5.4. その他の言語
6. プログラムのインタフェースと内部構成をきちんとすること
6.1. 安全なプログラムを作るためには、ソフトウェア・エンジニアリングの原則に 従うこと
6.2. インタフェースを安全に
6.3. データと制御を切り離す
6.4. 特権を最小限に
6.5. 1 つの構成要素の機能を最小限にする
6.6. setuid や setgid したスクリプトを使わない
6.7. 設定を安全にし、安全なデフォルトを使用する
6.8. 初期値を安全にロードする
6.9. フェイル・セーフ
6.10. 競合状態を避ける
6.11. 信頼できる経路だけ信じること
6.12. 高信頼パス(Trusted Path)を設ける
6.13. 内部で一貫性をチェックするコードを利用する
6.14. リソースを自己制御する
6.15. サイトにまたがって存在する悪意あるコンテンツを防ぐ
6.16. セマンティック攻撃の裏をかく
6.17. データの種類に気を配る
7. 他のリソースを利用する場合は慎重に
7.1. 安全なライブラリ・ルーチンだけを呼び出すこと
7.2. 正しい値でだけ呼び出す
7.3. メタキャラクタを扱う
7.4. プログラマ向けのインタフェースだけを呼び出す
7.5. システムコールの返り値はすべてチェックする
7.6. vfork(2)は使わない
7.7. 組込みコンテンツの読み込み時に発生する Web バグに対処する
7.8. 秘密にしたい情報は隠す
8. 情報はえりすぐってフィードバックする
8.1. フィードバックは最小限に
8.2. コメントはいれない
8.3. 出力が溢れたり、反応が遅い場合も対処する
8.4. データフォーマットを制御する(「書式文字列」)
8.5. 出力時に文字符号化を制御する
8.6. Include ファイルや設定ファイルへのアクセスを防ぐ
9. 言語固有の問題
9.1. C と C++
9.2. Perl
9.3. Python
9.4. シェルスクリプト言語(sh と csh 系)
9.5. Ada
9.6. Java
9.7. TCL
9.8. PHP
10. 専門的な話題
10.1. パスワード
10.2. Web の認証
10.3. 乱数
10.4. ユーザ空間ではとりわけ秘密(パスワードや鍵)を守る
10.5. 暗号化アルゴリズムとプロトコル
10.6. PAM を使う
10.7. ツール
10.8. Windows CE
10.9. 監査記録を書き込む
10.10. 物理的な漏洩
10.11. その他
11. 結論
12. 参考文献
A. 履歴
B. おことわり
C. ドキュメントのライセンスについて
D. GNU Free Documentation License
E. About the Author
F. 日本語版謝辞
List of Tables
4-1. Legal UTF-8 Sequences
List of Figures
1-1. プログラム概念図