安全にする必要があるプログラムは、多岐に渡ります(用語については、この文書 で定義します)。 一般的な種類を下記にいくつかあげます。
離れた所にあるデータを閲覧する場合に利用するアプリケーション・プログラム。 ビューアーとして利用するプログラム(ワード・プロセッサやファイル・フォーマット を見るためのビューアー)では、信頼できないユーザが、離れた場所から閲覧する データを送るように求めることがよくあります(このリクエストは Web ブラウザが 自動的に実行する可能性があります)。 はっきりしていることは、信頼できないユーザの入力によって、アプリケーションが 任意のプログラムを実行してしまってはいけない、ということです。初期化マクロ (データを表示する時に実行する)をサポートするのは浅はかです。サポートせざるを 得ないなら、必ず安全のためのサンドボックスを作成してください(サンドボックス を作る作業は複雑かつ間違いを起こしやすいので、うまくいくとは限りません。 したがって、はなからマクロをサポートするべきではないのです)。 Chapter 5 で議論するバッファオーバーフローのような 問題についても、注意が必要です。この問題は、信頼できないユーザがビューアーを 使って、任意のプログラムを強制的に動かせるようにしてしまいます。 【訳註:サンドボックス(sandbox)とは、制限付きで保護されたメモリ領域。 この領域で動くアプリケーションは、システムにダメージを与えないように設計、 動作します】
システム管理者(root)が使用するアプリケーション・プログラム。 そのようなプログラムは、システム管理者以外が制御できてしまうデータを信頼すべき ではありません。
ローカルでサービスを行うサーバ(デーモンとも呼びます)。
ネットワーク経由でアクセスするサーバ(ネットワーク・デーモンという場合 もあります)。
Web ベースのアプリケーション(CGI スクリプトもその一部)。 これらのアプリケーションは、ネットワーク経由でアクセスするサーバとしては 特殊なケースです。しかし、あまりにも普及しているので、これだけで一分野を作る 価値があります。 この分野に属するプログラムは、Web サーバを経由して間接的に実行され、フィルタ される攻撃も中にはありますが、防御すべきでありながら、多くはなすがままに なっています。
アプレット(すなわち、クライアントにダウンロードされ、自動的に実行するもの)。 Java がとりわけ有名ですが、他の言語(たとえば Python)も同様にモバイル・コード をサポートしています。 ここにセキュリティ上重要な点がいくつかあります。それは、クライアント側で アプレットの実行機構を実装した人が、「安全な」オペレーションをだけを確実に 実行するようにしているか、という点とアプレット作成者が、悪意のあるホストの 問題(つまりクライアントは普通信頼できない)に対処しなければいけない点です。 悪意のあるホスト上で、アプレットを問題なく動かす研究がいくつかありますが、 正直言って、この解決方法は疑問です。斬新なテーマなので、ここではこれ以上 触れません。 【訳註:モバイル・コードは、クライアントプログラム(たとえば Web ブラウザ) が相手のシステム(たとえば Web サーバ等)からダウンロードし、自動的に実行 されるプログラム全般を指します】
setuid や setgid したプログラム。 これらのプログラムは、ローカルにいるユーザが実行します。実行されるやいなや そのプログラムのオーナーもしくはオーナーのグループ(もしくはその両方)の権限 が与えられます。 いろいろな意味で、これらは最も安全にしにくいプログラムです。それは入力の 大部分が信頼できないユーザが制御していて、その入力自体も疑いがあるからです。
この文書は、さまざまな種類のプログラムの課題をひとまとめにして扱っています。 このやり方には欠点があります。それは、ここで扱う問題点には、プログラム全種類 へ適用できないものがある点です。 特に setuid や setgid したプログラムは、思いがけないさまざまな入力があり、 ガイドラインには setuid や setgid したプログラムだけに当てはまるものも あります。 しかし、実際はそんなに区別がはっきりしているわけではなく、あるプログラムでは この範疇を越えるものもあります(たとえば CGI スクリプトは setuid や setgid されたり、同じような影響がある方法で設定してあったりします)。また実行形式が いくつにも分かれていて、そのそれぞれが異なる「種類」のプログラムになっている 場合もあります。 さまざまな種類のプログラムをひとまとめにして検討する利点は、あるカテゴリに プログラムを無理に当てはめることなく、問題を包括的に検討できる点にあります。 こうして見ていくことで、安全が求められるプログラムすべてに対して、原則が当て はまるケースが多いことがわかります。
この文書は、C で書いたプログラムに多少偏っています。C++ や Perl、PHP、Python、 Ada95、Java のような他の言語についても、多少は扱っています。 これは Unix ライクなシステムでは C が安全なプログラムを実装する言語として 最も普及しているためです(CGI は例外で、Perl や PHP、Python をよく使います)。 また C 以外の言語の大部分は、 C のライブラリを呼び出すように作られています。 これをもって C が安全なプログラムを作るという目的に「最良の」言語である、 ということにはなりません。ここで述べられる原則の大部分は、使用している言語の いかんにかかわらず当てはまります。