通过异常暴露信息¶
ID: py/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:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
软件开发人员通常将堆栈跟踪添加到错误消息中,以帮助调试。每当最终用户遇到该错误消息时,开发人员可以使用堆栈跟踪来帮助确定如何解决问题。特别是,堆栈跟踪可以告诉开发人员更多关于导致故障的事件序列的信息,而不是仅仅告诉开发人员错误发生时软件的最终状态。
不幸的是,相同的信息对攻击者也很有用。堆栈跟踪中类名称的序列可以揭示应用程序的结构以及它依赖的任何内部组件。此外,堆栈跟踪顶部的错误消息可能包含服务器端文件名和应用程序依赖的 SQL 代码等信息,使攻击者能够微调后续的注入攻击。
建议¶
向用户发送更通用的错误消息,以减少信息的泄露。完全抑制堆栈跟踪,或仅在服务器上记录堆栈跟踪。
示例¶
在以下示例中,异常以两种不同的方式处理。在第一个版本(标记为 BAD)中,异常通过从函数返回来发送回远程用户。因此,用户能够看到详细的堆栈跟踪,其中可能包含敏感信息。在第二个版本中,错误消息仅记录在服务器上,并且向用户显示通用错误消息。这样,开发人员仍然可以访问和使用错误日志,但远程用户将看不到信息。
from flask import Flask
app = Flask(__name__)
import traceback
def do_computation():
raise Exception("Secret info")
# BAD
@app.route('/bad')
def server_bad():
try:
do_computation()
except Exception as e:
return traceback.format_exc()
# GOOD
@app.route('/good')
def server_good():
try:
do_computation()
except Exception as e:
log(traceback.format_exc())
return "An internal error has occurred!"