通过异常泄露信息¶
ID: cs/information-exposure-through-exception
Kind: path-problem
Security severity: 5.4
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-209
- external/cwe/cwe-497
Query suites:
- csharp-code-scanning.qls
- csharp-security-extended.qls
- csharp-security-and-quality.qls
软件开发人员通常会将堆栈跟踪添加到错误消息中,作为调试辅助工具。每当最终用户遇到该错误消息时,开发人员可以使用堆栈跟踪来帮助确定如何解决问题。特别是,堆栈跟踪可以告诉开发人员更多关于导致故障的事件序列的信息,而不仅仅是发生错误时软件的最终状态。
不幸的是,相同的信息对攻击者也很有用。堆栈跟踪中的类名序列可以揭示应用程序的结构以及它依赖的任何内部组件。此外,堆栈跟踪顶部的错误消息可能包含应用程序依赖的信息,例如服务器端文件名和 SQL 代码,从而允许攻击者微调后续的注入攻击。
建议¶
向用户发送更通用的错误消息,以减少信息的泄露。完全抑制堆栈跟踪,或者仅在服务器上记录它。
示例¶
在以下示例中,以两种不同的方式处理异常。在标记为 BAD 的第一个版本中,通过调用 ToString()
将异常发送回远程用户,并将其写入响应。因此,用户能够看到详细的堆栈跟踪,其中可能包含敏感信息。在第二个版本中,错误消息仅记录在服务器上。这样,开发人员仍然可以访问和使用错误日志,但远程用户将看不到这些信息。
using System;
using System.Web;
public class StackTraceHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
try
{
doSomeWork();
}
catch (Exception ex)
{
// BAD: printing a stack trace back to the response
ctx.Response.Write(ex.ToString());
return;
}
try
{
doSomeWork();
}
catch (Exception ex)
{
// GOOD: log the stack trace, and send back a non-revealing response
log("Exception occurred", ex);
ctx.Response.Write("Exception occurred");
return;
}
}
}