4.3. ファイル・ディスクリプタ

プログラムには「オープンしたファイル・ディスクリプタ」、つまりあらかじめ オープンされているファイルが渡ります。 setuid や setgid されたプログラムでは、オープンしているファイルとその内容を ユーザが(パーミッションの範囲内で)切り替えられる、ということに配慮する必要が あります。 setuid や setgid されたプログラムでは、新しくオープンしたファイルが常に固定 したファイル・ディスクリプタ ID に割り当てられていると想定してはいけません。 また端末が標準入力や標準出力、標準エラーの出力先になっていること、また端末が 既にオープンされていることも前提にしてはいけません。

この理論的根拠は難しくありません。攻撃者がプログラムを起動する前にファイル・ ディスクリプタをオープンしたりクローズしたりできますので、攻撃者は予想外の 状況にしようと思えばできてしまいます。 攻撃者が標準出力を閉じ、その時にプログラムが次のファイルをオープンした時に、 あたかも標準出力がオープンしているかのようになります。そしてプログラムは、 すべて標準出力に書くがごとく、そのファイルに書き込んでしまいます。 C ライブラリの中には、stdin や stdout、stderr が開いていなければ(/dev/null に対して)、自動的にオープンするものがあります。しかしこれは Unix ライクな システムすべてに当てはまるわけではありません。