JPCERT コーディネーションセンター

ERR02-J. ログ保存中の例外発生を防ぐ

ログ保存中に例外がスローされると、特別に考慮したコーディングを行わないかぎり、正しくログが保存されない可能性がある。ログの保存中に発生する例外を考慮しないと、脆弱性が作りこまれてしまうかもしれない。たとえば攻撃者は、例外のログ保存を妨害することで、重要なセキュリティ例外の発生を隠すことができるかもしれない。したがって、ログの保存中に例外が発生しても、正しくログが保存されるようにしなくてはならない。

違反コード

以下の違反コード例は重要なセキュリティ例外を標準エラーストリームに出力している。

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)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter