通过异常信息泄露¶
ID: rb/stack-trace-exposure
Kind: path-problem
Security severity: 5.4
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-209
- external/cwe/cwe-497
Query suites:
- ruby-code-scanning.qls
- ruby-security-extended.qls
- ruby-security-and-quality.qls
软件开发人员通常会将堆栈跟踪添加到错误消息中,作为调试辅助手段。每当最终用户遇到该错误消息时,开发人员可以使用堆栈跟踪来帮助识别如何解决问题。特别是,堆栈跟踪可以告诉开发人员更多关于导致故障的事件序列的信息,而不是仅仅告诉软件在错误发生时的最终状态。
不幸的是,相同的信息对攻击者也很有用。堆栈跟踪中类名或方法名的序列可以揭示应用程序的结构以及它依赖的任何内部组件。此外,堆栈跟踪顶部的错误消息可以包含服务器端文件名和应用程序依赖的 SQL 代码等信息,使攻击者能够微调后续的注入攻击。
建议¶
向用户发送更通用的错误消息,以减少信息泄露。要么完全抑制堆栈跟踪,要么仅在服务器上进行记录。
示例¶
在以下示例中,异常以两种不同的方式处理。在第一个版本中,标记为 BAD,异常通过将其渲染为 HTTP 响应而暴露给远程用户。因此,用户能够看到详细的堆栈跟踪,其中可能包含敏感信息。在第二个版本中,错误消息仅在服务器上记录,并将通用错误消息显示给用户。这样,开发人员仍然可以访问和使用错误日志,但远程用户不会看到这些信息。
class UsersController < ApplicationController
def update_bad(id)
do_computation()
rescue => e
# BAD
render body: e.backtrace, content_type: "text/plain"
end
def update_good(id)
do_computation()
rescue => e
# GOOD
logger.error e.backtrace
render body: "Computation failed", content_type: "text/plain"
end
end