Skip to content

Instantly share code, notes, and snippets.

@spiegel-im-spiegel
Last active April 24, 2023 06:32
Show Gist options
  • Save spiegel-im-spiegel/b42d50b99ff89789a58b650cd44e8e3d to your computer and use it in GitHub Desktop.
Save spiegel-im-spiegel/b42d50b99ff89789a58b650cd44e8e3d to your computer and use it in GitHub Desktop.
スタックトレースをログに出力する際のセキュリティ上の問題点を教えてください

Spiegel

スタックトレースをログに出力する際のセキュリティ上の問題点を教えてください。

ChatGPT

  1. 機密情報の漏洩:スタックトレースには、クラス名、メソッド名、変数名、およびその値など、プライバシーに関する情報が含まれています。これらの情報がログに残されていると、攻撃者が情報を収集し、悪用する可能性があります。

  2. 脆弱性の暴露:スタックトレースには、アプリケーションの脆弱性が含まれている場合があり、攻撃者に攻撃するための情報を提供する可能性があります。 攻撃者がこの情報を利用して攻撃することができます。

  3. 特定のアプリケーションの攻撃:攻撃者がスタックトレースを取得することで、ターゲットの特定のアプリケーションに対して特定の攻撃を実行できます。スタックトレースは、アプリケーションに関する詳細情報を提供するため、攻撃者が分析するための情報源になります。

以上の理由から、スタックトレースをログに出力する際は、注意が必要であり、機密性、プライバシー、およびセキュリティの問題が発生しないように、ログレベルを上げたり、スタックトレースの一部の情報を非表示にする機能を使用することがあります。

Spiegel

なるほど。では Java の printStackTrace メソッドを使うのはよくないのでしょうか

ChatGPT

printStackTrace メソッドを使ってスタックトレースを出力すること自体は、悪いことではありません。しかし、そのままログに出力する場合、上記のようなセキュリティ上の問題が発生することがあります。また、スタックトレースはプログラムのデバッグに役立つ情報ですが、エンドユーザーにとっては不要な情報であることが多く、出力する必要がない場合もあります。

そのため、スタックトレースを出力する場合は、以下の提案があります。

  • ログレベルを上げて、重要度の高い例外のみスタックトレースを出力するようにします。
  • スタックトレースのスクリーニング機能を使用して、機密情報や脆弱性を含む部分を非表示にします。
  • 具体的な例外情報やエラーメッセージをログに出力するだけで、スタックトレースは出力しないようにします。
  • プロダクション環境においては、スタックトレースを完全に無効化することも検討できます。

追加で主張したいことがありましたら、おっしゃってください。

Spiegel

printStackTrace メソッドは PrintWriter を引数にすることが出来ます。これを使って出力を制御するのはどうでしょうか。

ChatGPT

はい、printStackTrace メソッドの引数に PrintWriter を指定することにより、出力先を制御することができます。そのため、ログにスタックトレースを出力する場合は、PrintWriter を使用することで、例外出力の制御を行うことができます。

次のように、PrintWriter を使用してスタックトレースをログに出力する方法があります。

try {
   // some code that may throw an exception
} catch (Exception e) {
   StringWriter sw = new StringWriter();
   PrintWriter pw = new PrintWriter(sw);
   e.printStackTrace(pw);
   logger.error(sw.toString());
}

ここで、StringWriter および PrintWriter は、スタックトレースを文字列に変換してlogger にログ出力するために使用されます。

この方法を使用することで、ログにスタックトレースを出力する際の制御性が向上し、機密情報や脆弱性を含む部分をスクリーニングすることも可能になります。ただし、スタックトレースを完全に無効化することも検討するべきであるということには変わりありません。

Spiegel

ありがとうございます。これまでの回答に関するオンラインの参考文献を教えてください。

ChatGPT

以下に、このテーマに関連するオンラインのリソースをいくつかご紹介します。

これらのリソースは、Javaでのログと例外の扱いに関する概要を把握するのに役立ちます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment