为什么正确记录完整的 http 请求是不好的做法?

信息安全 http 日志记录
2021-08-18 23:40:18

我目前正在查看 Veracode 及其代码分析工具套件提供的安全编码实践文档。

在“安全日志记录实践”部分中,他们提到在发生错误时记录完整的 HTTP 请求是一个常见错误,但他们没有解释原因。

我正在一个个人网站上工作,其中有 2 个单独的日志文件:

  • errors.log :任何意外异常最终都会被捕获并记录在该文件中。在那里,我只记录堆栈跟踪(经典的简单基本异常记录)

  • security.log :任何无法通过 UI 发出的请求,这是伪造请求的标志(例如:IDOR 尝试就像有人试图访问另一个用户的数据一样),导致引发自定义运行时安全异常。该安全异常特别存储了发出的 http 请求,然后被记录下来。基本上,当出现问题时,我所有的后端验证器(与前端验证器进行相同的检查)都会抛出此安全异常 - 想法是我(或 Cronned 任务;))可以定期验证 security.log 是否为空.

我决定记录完整的 http 请求(我的意思是:不是原始请求,但我提取所有标头/cookie 和参数并以可读方式显示它们,以及时间戳、原始 IP 等信息)仅用于安全例外(以方便分析潜在的与商业逻辑相关的攻击)。

该日志文件将仅在文本编辑器中打开(很可能是 VI),并且不会被工具自动解析或显示在 web 应用程序中。

现在,我知道在某些情况下可以利用记录完整的 http 请求。一个典型的例子是帮助台使用的容易受到 XSS 攻击的日志分析 Web 应用程序 - 在这种情况下,一旦帮助台人员通过易受攻击的 Web 应用程序检查日志内容,攻击者就可以伪造一个恶意请求,让有效负载爆炸。

我也明白,由于磁盘已满,记录太多内容会导致拒绝服务,但堆栈跟踪已经是这种情况。

就我而言,在特定情况下,记录请求会带来哪些危险?我看到的唯一(技术上有效但不切实际,考虑到网站的低敏感性)是一个特制的有效载荷,当被 VI 解析时可能会导致某种缓冲区溢出(攻击者必须知道我使用 VI + 使用一个 0 天等。对于 NSA 来说可能是可行的,但对于这个小站点来说是不切实际的,除了一些脚本小子之外,它不是感兴趣的目标)。

我想有人可以进行一些日志伪造,但祝你好运找到我独特的请求显示:P 因为我在请求中提取数据并以我自己的方式显示它们,所以实际上不可能通过日志伪造来欺骗我。

我是否应该专门检查文件结尾 VI 控制字符(甚至存在吗?)?

还有什么问题?我在这里错过了什么吗?现在我意识到我的问题可以解释为:“如果我让用户将文本(通过请求内容..)写入我机器上的单个受控文件,该文件只能由最新的井打开,会出现什么问题-经过验证的文本编辑器”

更新

更新以提供有关 3 个第一反馈的更多信息(顺便说一句,感谢您的反馈!)

  • 该机制不涵盖登录表单(但注册表是!)
  • 我不经营商店,没有高度敏感的信息。最敏感的信息是用户注册期间的名字/姓氏和出生日期。有一个有积分和排名的游戏,所以安全性对于防止作弊很重要(因此这个自定义日志记录)
  • 坚持仅记录恶意(绕过前端验证)请求这一事实,在乌托邦世界中,安全日志文件将永远保持空白

感谢您的反馈,我意识到以下几点:

  • 由于从请求中提取会话 cookie,披露此文件的内容可能会导致会话劫持
  • 请求解析器中的错误可能导致请求未被记录
  • 我的代码中的一个错误可能会记录格式错误的用户注册请求,该请求会将敏感信息存储在 secu-log 中(密码显然是最敏感的)

处理:

  • 关于文件内容的披露,我假设如果有人到达那里,我已经被 pwned 了:)
  • 关于解析器中的错误,确实,但至少它会触发将记录在“正常”记录器中的异常,这是可以接受的
  • 关于注册表单,我认为即使发生这种罕见的错误,我也不应该访问明文密码,即使是偶然的。我将调整解析器,使其不存储任何与*password*模式匹配的请求参数。

我想我实际上不能更进一步来保护我的用户(如果我希望能够实时检测 biz 逻辑攻击)。我想网络上 99% 的网站都没有达到这些考虑的一半 :) )。我似乎很清楚,这种自定义日志记录提供的安全优势超过了增加的小攻击面。

我将在代码库的那部分添加额外的全面单元测试,以最终降低错误的风险。

在公司环境中,关于敏感数据的记录,我会猜测两次——我想我会与数据合规官这样的人讨论这个问题

2个回答

关键词是正确的

在需要时正确记录 HTTP 请求是不错的做法。我是一名渗透测试员,我会记录我在测试中发出的所有 HTTP 请求;这样做是意料之中的。我还在一个与许多复杂遗留系统集成的服务器系统上工作。记录完整的 HTTP 错误请求是一项必要功能。它可以显示详细信息,例如集群中的哪个系统发出了错误请求,否则这些请求会丢失。

Veracode 是一个自动化的源代码分析系统。它可以判断您是否将 HTTP 请求传递给日志函数。但它不能真正判断您是否“正确”记录。所以他们提出了这个相当模糊的发现,因为这是他们的系统所能做的最好的事情。不要把太多的重量放在它上面。该问题是否有风险评级?我怀疑这将是低风险的。大多数人都没有你那么彻底,很少关注低风险问题。

它们正确记录的关键部分是:

  • 原木注入/锻造
  • 拒绝服务
  • 日志的保密性

您在问题中提到了前两个。对于个人网站,第三个是无关紧要的——你是所有者、系统管理员、一切——只有你才能访问。这在公司环境中是一个更大的问题,您当然不希望公司中的每个人都可以访问请求中的机密数据(如用户密码)。一些系统故意掩盖日志中的部分数据——尤其是信用卡号,以符合 PCI 规定。

您提到您提取标题、cookie 和参数并在日志文件中对其进行格式化。我建议您记录原始请求,并使用单独的后处理器来格式化它们。会有一些奇怪的情况——例如在 URL 和 POST 正文中重复的参数——可能会导致错误。提取和格式化可能会导致原始请求中的特征丢失。

记录所有内容的问题不在于您可以错误地实现它(例如,允许 XSS、代码执行、缓冲区溢出等),因为解决方案就是正确地执行它,就像所有代码一样。[您确实提供了额外的攻击面,但如果您认为保留额外的日志很重要,那可能是值得的]

问题在于您记录的内容:all the headers / cookies and parameters. 这些显然可能包含明文的敏感信息,例如会话 ID、登录 cookie、密码、信用卡信息等。

现在,如果您只记录您知道是恶意的请求,则可以记录这些请求。但你能确定吗?也许您不小心在有效操作上抛出了安全异常,或者您在可能由有效用户产生的安全事件上抛出了一个安全异常 - 例如由于拼写错误而导致的无效登录。

即使您安全地存储这些日志,您的代码中也可能存在允许攻击者读取它们的漏洞(例如通过 LFI)。您可能还拥有这些日志的备份,这些日志可能已被泄露。或者,攻击者可能已经获得了对服务器的有限访问权限,并从这些日志中获得了其他有用的信息。