第7章 データ漏えい対策
コマンドラインからの情報漏えい対策
Unix系およびGNU/Linux系のプラットフォームにおいては、秘密保持が必要なパラメータをコマンドライン引数を通じてプログラムに渡すことを避けた方がよい。これらのプラットフォームには、システム内で動作中のプロセスの情報を誰でも調べることのできるpsコマンドが備わっているからである。
psコマンド
Unix系およびGNU/Linux系のプラットフォームには、システム内で現在動作中のプロセスの情報を収集する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
$
上記の例は、実行中のプロセスの次の情報を表示している。
- プロセスID(PID)
- 使用しているターミナル(TTY)
- プロセスの状態(STAT)──R=実行中もしくは実行待ち、S=割り込み可能なスリープ状態 等
- これまでに消費したCPU時間(TIME)
- プロセスを起動したときのコマンドライン(COMMAND)
このほかにもpsコマンドは、プロセスの動作状況に関する諸情報を数十種類表示する機能をもっている。このようなことから、例えば、次のような必要が生じたときにはpsコマンドで情報を収集し、コンピュータ運用に役立てることができる。
- プロセスを多量に実行させているユーザの特定
- 実行時間が異常に長いプロセスの特定
- CPUやメモリ等のリソース占有率が異常に大きいプロセスの特定、等
また、psコマンドは一般ユーザに使用が解放されており、そのコンピュータにログインできる人物であれば誰でも使えるコマンドである。
psコマンドがもたらす問題
psコマンドは便利ゆえに一部に情報漏えいの心配がある。それは、他のアカウントが所有しているプロセスであっても、起動時のコマンドライン文字列を表示してしまうことである。
プログラムを起動する際、コマンドライン引数にパラメータを指定することがしばしば行われる。これらの引数は、そのプロセスがシステム内に存在している間であればpsコマンドによって収集され、そのシステムにログイン可能なユーザすべての目に触れる可能性がある。
したがって、次のようなデータをコマンドライン引数で受け渡すことは避けたほうがよい。
- 暗号鍵
- パスワード
- クレジットカード番号
- 個人情報 等

コマンドライン引数の対策
プロセス起動時のコマンドライン引数がpsコマンドによって盗み見られる問題への対策として次のものが考えられる。
(1) コマンドラインを用いないパラメータ受渡し
可能なら、プロセスへのパラメータをコマンドライン引数で渡すのではなく、パイプやテンポラリファイルを通じて渡すようにする。その際、パラメータの受渡しに使うテンポラリファイルへの部外者のアクセスを防ぐ工夫をする。
(2) コマンドライン引数の暗号化
プロセスへのパラメータをコマンドライン引数で渡さざるを得ない場合、値を平文で渡すのではなく、暗号化して渡す。その際、弱い暗号アルゴリズムの使用を避け、暗号鍵の保護に留意する。
(3) psコマンドの使用制限
可能なら、一般ユーザのpsコマンドの使用を制限する。psコマンドのファイルのアクセスパーミッションの設定を厳しくし、psコマンドの使用をrootや管理者グループのみに許すようにする。
ただし、psコマンドに制限をかけることのみをこの問題への対策とすることは推奨できない。上記1) 2) を補強する手段として用いるべきである。
まとめ
Unix、GNU/Linuxに備わっているpsコマンドは、他人が所有するプロセスのコマンドライン引数の閲覧を可能にする。重要なパラメータをコマンドライン引数で受け渡さない工夫およびコマンドライン引数を覗き見られても支障が起きないようにする工夫が必要である。