事の終わりは始めにまさる。 気位が高いよりも気が長いのがよい。 | |
旧約聖書 コヘレトの言葉 7 章 8 節(NIV) |
Linux や Unix のような Unix ライクなシステムで、完璧に安全なプログラムを 設計・実装するのは、実際とても難しいことです。 完璧に安全なプログラムが難しい理由は、考えられる入力すべてに適切に対応し、 敵意を持っているかもしれないユーザが制御している環境に対しても、同様に対応 しなければならない点にあります。 安全性が求められるプログラムの開発者は、使用しているプラットフォームについて 深く理解し、ガイドライン(このドキュメント等)を調べて適用し、品質を上げる プロセスを設けて(ピア・レビュー等)、プログラムの脆弱なところを減らして行く 必要があります。
ここでは結論として、このドキュメントで鍵となるガイドラインをいくつか あげておきます。
入力をすべて検証してください。入力にはコマンドラインの入力や環境変数、CGI からの入力があります。 「不正な」入力をただ拒否しないでください。何が「受け入れられる」入力なのか を定義して、マッチしないものを拒否してください。
バッファオーバーフローを避けてください。 プログラムが長い入力(と長い中間データ値)で絶対乗っ取られないようにして ください。 現時点では、プログラミングでのエラーの代表格です。
プログラムの内部構成をきちんとしてください。 インタフェースを安全にして、特権を最少にし、初期設定とデフォルトを安全にし、 フェイル・セーフにしてください。 競合状態を回避してください(たとえば、/tmp のような共有ディレクトリで安全に ファイルをオープンする)。 信頼に足る経路だけを信じてください(たとえば、ほとんどのサーバは、セキュリティ チェックや買い入れ価格のような機密データ類で、クライアントを信頼してはいけ ません)。
注意深く他のリソースを呼び出してください。 値を適切なものに制限し(特にメタキャラクタ関連)、システムコールの返り値 は、すべてチェックしてください。
慎重に情報を返してください。 特に信頼できないユーザに対しては、フィードバックは最小限にし、出力が溢れて いたり、反応が遅い場合にも対処してください。