第7章 データ漏えい対策
コマンドラインからの情報漏えい対策

Unix系およびGNU/Linux系のプラットフォームにおいては、秘密保持が必要なパラメータをコマンドライン引数を通じてプログラムに渡すことを避けた方がよい。これらのプラットフォームには、システム内で動作中のプロセスの情報を誰でも調べることのできるpsコマンドが備わっているからである。

psコマンド

Unix系およびGNU/Linux系のプラットフォームには、システム内で現在動作中のプロセスの情報を収集するpsコマンドが備わっている。

例 psコマンド
$ ps -ax
  PID TTY      STAT   TIME COMMAND
    1 ?        S      0:03 init
    2 ?        SW     0:00 [keventd]
  721 ?        S      0:00 /sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-eth0.
  730 ?        S      0:00 /sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-eth0.
  821 ?        S      0:00 syslogd -m 0
  825 ?        S      0:00 klogd -x
 1177 tty1     S      0:00 /bin/sh /usr/X11R6/bin/startx
 1188 tty1     S      0:00 xinit /etc/X11/xinit/xinitrc --
 1189 ?        S<     0:40 X :0
 1192 tty1     S      0:00 /usr/bin/gnome-session
 1208 tty1     S      0:00 /bin/sh /etc/X11/xinit/xinitrc
 1210 tty1     S      0:00 kinput2 -canna
 1212 ?        S      0:00 ssh-agent /etc/X11/xinit/Xclients
$

上記の例は、実行中のプロセスの次の情報を表示している。

このほかにもpsコマンドは、プロセスの動作状況に関する諸情報を数十種類表示する機能をもっている。このようなことから、例えば、次のような必要が生じたときにはpsコマンドで情報を収集し、コンピュータ運用に役立てることができる。

また、psコマンドは一般ユーザに使用が解放されており、そのコンピュータにログインできる人物であれば誰でも使えるコマンドである。

psコマンドがもたらす問題

psコマンドは便利ゆえに一部に情報漏えいの心配がある。それは、他のアカウントが所有しているプロセスであっても、起動時のコマンドライン文字列を表示してしまうことである。

プログラムを起動する際、コマンドライン引数にパラメータを指定することがしばしば行われる。これらの引数は、そのプロセスがシステム内に存在している間であればpsコマンドによって収集され、そのシステムにログイン可能なユーザすべての目に触れる可能性がある。

したがって、次のようなデータをコマンドライン引数で受け渡すことは避けたほうがよい。

図27: コマンドライン引数の暴露

コマンドライン引数の対策

プロセス起動時のコマンドライン引数がpsコマンドによって盗み見られる問題への対策として次のものが考えられる。

(1) コマンドラインを用いないパラメータ受渡し

可能なら、プロセスへのパラメータをコマンドライン引数で渡すのではなく、パイプやテンポラリファイルを通じて渡すようにする。その際、パラメータの受渡しに使うテンポラリファイルへの部外者のアクセスを防ぐ工夫をする。

(2) コマンドライン引数の暗号化

プロセスへのパラメータをコマンドライン引数で渡さざるを得ない場合、値を平文で渡すのではなく、暗号化して渡す。その際、弱い暗号アルゴリズムの使用を避け、暗号鍵の保護に留意する。

(3) psコマンドの使用制限

可能なら、一般ユーザのpsコマンドの使用を制限する。psコマンドのファイルのアクセスパーミッションの設定を厳しくし、psコマンドの使用をrootや管理者グループのみに許すようにする。

ただし、psコマンドに制限をかけることのみをこの問題への対策とすることは推奨できない。上記1) 2) を補強する手段として用いるべきである。

まとめ

Unix、GNU/Linuxに備わっているpsコマンドは、他人が所有するプロセスのコマンドライン引数の閲覧を可能にする。重要なパラメータをコマンドライン引数で受け渡さない工夫およびコマンドライン引数を覗き見られても支障が起きないようにする工夫が必要である。