CodeQL 文档

通过堆栈跟踪泄露信息

ID: java/stack-trace-exposure
Kind: problem
Security severity: 5.4
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-209
   - external/cwe/cwe-497
Query suites:
   - java-code-scanning.qls
   - java-security-extended.qls
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

软件开发人员经常将堆栈跟踪添加到错误消息中,作为调试辅助工具。每当最终用户出现该错误消息时,开发人员可以使用堆栈跟踪来帮助确定如何解决问题。特别是,堆栈跟踪可以告诉开发人员更多有关导致故障的事件序列的信息,而不仅仅是错误发生时软件的最终状态。

不幸的是,攻击者也可以利用相同的信息。堆栈跟踪中的类名序列可以揭示应用程序的结构以及它所依赖的任何内部组件。此外,堆栈跟踪顶部的错误消息可能包含应用程序所依赖的服务器端文件名和 SQL 代码等信息,从而允许攻击者微调后续注入攻击。

建议

向用户发送更通用的错误消息,以泄露更少的信息。完全禁止堆栈跟踪,或仅在服务器上记录堆栈跟踪。

示例

在以下示例中,异常以两种不同的方式进行处理。在标记为 BAD 的第一个版本中,异常使用 sendError() 方法发送回远程用户。因此,用户能够看到包含敏感信息的详细堆栈跟踪。在第二个版本中,错误消息仅记录在服务器上。这样,开发人员仍然可以访问和使用错误日志,但远程用户将看不到这些信息。

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
	try {
		doSomeWork();
	} catch (NullPointerException ex) {
		// BAD: printing a stack trace back to the response
		ex.printStackTrace(response.getWriter());
		return;
	}

	try {
		doSomeWork();
	} catch (NullPointerException ex) {
		// GOOD: log the stack trace, and send back a non-revealing response
		log("Exception occurred", ex);
		response.sendError(
			HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
			"Exception occurred");
		return;
	}
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私