ログ保存中に例外がスローされると、特別に考慮したコーディングを行わないかぎり、正しくログが保存されない可能性がある。ログの保存中に発生する例外を考慮しないと、脆弱性が作りこまれてしまうかもしれない。たとえば攻撃者は、例外のログ保存を妨害することで、重要なセキュリティ例外の発生を隠すことができるかもしれない。したがって、ログの保存中に例外が発生しても、正しくログが保存されるようにしなくてはならない。
違反コード
以下の違反コード例は重要なセキュリティ例外を標準エラーストリームに出力している。
try { // ... } catch (SecurityException se) { System.err.println(se); // 例外から回復 }
このような例外をログ保存のために標準エラーストリームに書き込むのは不適切である。第一に、標準エラーストリームは溢れたり、クローズされたりして、例外を記録できなくなる可能性がある。第二に、情報を漏えいすることなくある種のセキュリティ例外やエラーを安全に記録することが目的である場合、標準エラーストリームは信頼性に欠ける。また、セキュリティ例外の書込み中にI/Oエラーが発生すると、catchブロックがIOExceptionをスローし、重要なセキュリティ例外は失われてしまうだろう。最後に、攻撃者は、セキュリティ例外に合わせて害のない例外を発生させ、例外の発生をごまかそうとするかもしれない。
同様に、Console.printf(), System.out.print*(), Throwable.printStackTrace() を使用してセキュリティ例外を出力することも、このルールの違反になる。
適合コード
以下の適合コードでは、JDK 1.4以降でデフォルトのログ保存APIとして提供されているAPI java.util.logging.Loggerを使用している。その他、log4jなどを使ってもよいだろう。
try { // ... } catch(SecurityException se) { logger.log(Level.SEVERE, se); // 例外から回復 }
通常、プログラム全体に必要なロガーは1つだけである。
リスク評価
ログ保存中に例外がスローされると、データが失われたりセキュリティ上の問題が隠されることにつながる。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
ERR02-J | 中 | 高 | 高 | P6 | L2 |
関連する脆弱性
HARMONY の Java実装に見つかった脆弱性についてHARMONY-5981に記されている。この実装では、FileHandler クラスはログメッセージを受け取るが、あるスレッドがログ出力先ファイルをクローズすると、メッセージをログに保存しようとした他のスレッドは例外をスローする。
参考文献
[API 2006] | Class Logger |
[JLS 2005] | Chapter 11, Exceptions |
[Ware 2008] |
翻訳元
これは以下のページを翻訳したものです。
ERR02-J. Prevent exceptions while logging data (revision 82)