10.4. ユーザ空間ではとりわけ秘密(パスワードや鍵)を守る

アプリケーションがパスワードや非公開鍵(セッション鍵や秘密鍵)を扱う必要がある なら、公開を最小限にとどめるために、使用後はすぐに上書きしてください。 たとえば、Java では String 型にパスワードを保存しないでください。String 型は 変更されないからです(ガーベジコレクトされるか、再利用されない限り、上書き されません。こうなるには時間がかかるでしょう)。 String 型のかわりに、char[] を使ってパスワードを保存してください。そうすれば すぐに上書きされます。

また、プログラムがそのような秘密の値を扱うなら、コアダンプを絶対作らないよう にしてください(ulimit を使って)。さもないと攻撃者がプログラムを中断させて、 ダンプしたデータから秘密の値を見つけ出すかもしれません。 もう 1 つ注意しなければならない点があります。それは、一般プロセスがデバッガー (たとえば、ptrace(2)を使ったり、/proc の擬似ファイルシステムを使ったりして)を 呼び出すことで、他のプロセスを監視できる点です[Venema 1996]。 カーネルは通常、そのプロセスが setuid もしくは setgid してあるとそのような 監視ルーチンからプロセスを保護します(古いカーネルでは保護が働きません。 保護するためにはアップグレードするしか方法はありません)。 つまり、プロセスが秘密の値を扱うなら、そのプログラムに(特権を持たないグループ やユーザで)setuid もしくは setgid をかけて、この種の監視を強制的に禁止するよう にしてください。