MSC18-C. プログラムコードの中でパスワードなどの機密情報を扱うときは注意する
多くのアプリケーションは、メモリ内またはディスク上で機密情報を扱う必要がある。機密情報が正しく保護されないと、データの機密性や完全性が失われる可能性がある。すべての機密情報の安全性を完全に確保することは非常に困難(または高価)である。ユーザはあらゆる場所で同じパスワードを用いる傾向がある。そのため、ユーザのプロファイル情報を格納する簡単なゲームプログラムで、パスワードの入力を求められた場合、ユーザはオンライン銀行口座に使用しているパスワードをゲームプログラムにも選択する可能性がある。すると、ユーザの銀行口座の安全性はゲームプログラムと同程度でしかなくなる。
プログラム中の機密情報を保護するための簡単な方法がある。
特権が必要なサービスに対する認証を行う場合は、システムの認証ダイアログ(またはOSが提供する仕組み)を使用する。
システムにインストール済みの、特権が必要なサービスにアクセスするとき、そのサービスは何らかのメカニズムを使ってユーザからパスワードを取得することが多いだろう。プログラム自身でユーザ名とパスワードの入力を求める前に、サービス自体がユーザを何らかの方法で認証していないか確認せよ。サービス自体が認証を行う場合は、そのサービスに認証を任せることで、少なくとも機密情報の量を増やさずに済む。
プログラム内に機密情報をハードコードしない。
機密情報のハードコードは非常に悪いプログラミング作法と考えられている。というのも、開発環境が安全である、という条件を強制するからである。
メモリダンプを無効にする。
メモリダンプはプログラムがクラッシュすると自動的に作成される。メモリダンプには、プログラムメモリの任意の場所に保存されている情報が含まれている可能性がある。それゆえ、アプリケーションを出荷する前にメモリダンプは無効にする必要がある。詳細は「MEM06-C. 機密情報をディスクに書き出さない」を参照。
プログラムで使い終わった機密情報は格納しておかない。
メモリに格納されている機密情報は、物理メモリからページのスワップが行われる際にディスクに書き出されることがある(機密情報のディスクへの格納に関しては、次の項目を参照)。スワップアウトされないように、データを「ロック」しておくことができる。通常は、「ロック」するために管理者権限が必要になるが、試してみる価値はある。詳細は「MEM06-C. 機密情報をディスクに書き出さない」を参照。
機密情報をプレーンテキストで格納しない(ディスク、メモリのいずれの場合も)
「MEM06-C. 機密情報をディスクに書き出さない」を参照。パスワードの使用時、プレーンテキストではなく、そのハッシュ値を格納することを検討する。比較やその他の目的でハッシュを使用する。以下のコード [Viega 01] はこれを表したものである。
int validate(char *username) { char *password; char *checksum; password = read_password(); checksum = compute_checksum(password); erase(password); /* パスワードを安全に消去 */ return !strcmp(checksum, get_stored_checksum(username)); }
機密情報を格納する必要がある場合は、まず暗号化する。
- 機密情報の暗号化やハッシュ化を行う場合は、独自の暗号化関数(またはライブラリ)は実装しない。セキュリティテストを詳細に行った、実証済みの暗号化ライブラリを使用する。
- 標準の暗号化ライブラリを使用する場合、鍵のサイズやその他のプロパティに関して(ライブラリに文書化されている)一定の要件がある点に注意する。これらの条件を満たす鍵を選択する。
- 暗号化鍵は格納しない(上記の条件を満たしていれば、ユーザのパスワードのハッシュ、またはその他の暗号化の仕組みによって鍵を導出することができる)。鍵を格納する場合、安全な方法で格納する。
機密情報をディスクとメモリから安全な方法で消去する。
- メモリを消去する際は、コンパイラの最適化に注意する(「MSC06-C. 機密データを扱う場合はコンパイラの最適化に注意する」を参照)。
- 米国国防総省規格 5220 [DOD 5220] または Peter Gutmann の論文 [Gutmann 96] で指定された安全な消去方法を使用する。
リスク評価
プログラム内で機密情報を正しく扱わないと、機密情報が攻撃者によってアクセスされるおそれがある。
レコメンデーション | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
MSC18-C | 中 | 中 | 中 | P8 | L2 |
参考情報
- [MITRE 07] CWE-798, "Use of Hard-coded Credentials," CWE-326, "Inadequate Encryption Strength," CWE-311, "Missing Encryption of Sensitive Data"
- [DOD 5220]
- [Gutmann 96]
- [Lewis 06]
- [Viega 01]
翻訳元
これは以下のページを翻訳したものです。
MSC18-C. Be careful while handling sensitive data, such as passwords, in program code