クライアント側(ユーザーのPC)で情報漏えいするパターンの一つについて説明していこう。
ここで解説する概念は、日ごろアプリケーション開発者が意識すべき事項だが、ビジネスユーザーでも知っておけば“アプリケーションのバグ”というものがどのようなものかが理解しやすくなるはずだ。
ユーザーがWebブラウザを介して何らかの情報を入力した場合、ブラウザの持つPCのメモリ空間に一時的に格納されている。アプリケーションが速やかに動作するための仕組みのため、これは特にブラウザだけとは限らない。
Webブラウザを終了させると、そのプロセス(アプリケーションの動作単位)が持つメモリ空間は解放される仕組みだ。ただし、OSの特性にも依存するが、プロセスが解放したメモリ領域では、未使用領域としてOSが認識している状態であり(符号付けしているようなもの)、メモリ内には解放前のデータがそのまま残っている場合がある。例えば、その状態のままOSがフリーズし(Windowsであればブルースクリーンになるなど)、その際のクラッシュダンプ(メモリ状態)が生成保存されてしまうと、そのファイル内に個人情報が残ってしまう可能性もあるのだ。データが暗号化されていなければ、容易にテキスト情報としてのぞかれてしまう可能性が高い。
最後に開発者向けの情報として実際の事例を紹介しておこう。セキュアシェルとして知られるOpenSSHを例に挙げ、メモリ空間の情報がどのようにOSへ渡されるかを示したものだ。
何らかのソフトウェアを開発している人でも、ここで解説する事項はあまり意識していない場合がある。実態はどのようになっているのか? 核心はどのような仕組みになっているのか? 実際のソースコードを見てみることで、セキュリティ技術に関する知識が深まるというのが筆者の見解だ。日ごろプログラミング経験がない人にも理解しやすい解説を心掛けてみた。
セキュリティを意識した比較的行儀の良いソフトウェア(プログラム)であれば、重要な情報が保存されたメモリを解放する前にランダムな文字列を書き込んでから解放する。前述のようなクラッシュダンプの理由からだ。これが情報を残さないための基本的なテクニックといえる。そして、関連情報としてビジネスユーザーであれば、ソフトウェアはハードディスクから読み取り、メモリ上で展開して動作することを理解しておけばよいだろう。
例えば、OpenSSHでは下記のようなソースコードが含まれている。これは開発言語の一つであるCで記述されたコードであり、passphraseというchar型のポインタが指すメモリ領域を g_free() で解放する直前に、ヌル文字(null character: '\0')で書き込んでから解放している処理だ。意味を要約すると、前述のようにメモリ空間の解放時に関係のない文字列で上書きをしているという処理内容になる。
このようにソースコードで配慮していれば、前述のように自らの処理していたメモリ領域をOSへ返す場合、その中身がクリアされるのだ。OpenSSHが強固なセキュリティだと言われるゆえんには、このような地道な処理に配慮する努力があるからだといえるだろう。
リスト■contrib/gnome-ssh-askpass2.c |
static int passphrase_dialog(char *message) { const char *failed; char *passphrase, *local; : /* Zero passphrase in memory */ memset(passphrase, '\b', strlen(passphrase)); gtk_entry_set_text(GTK_ENTRY(entry), passphrase); memset(passphrase, '\0', strlen(passphrase)); g_free(passphrase); : } |
Copyright © ITmedia, Inc. All Rights Reserved.