【问题标题】:MongoDB $regex query and potential exploitsMongoDB $regex 查询和潜在利用
【发布时间】:2019-03-14 11:25:03
【问题描述】:

我们有一个 REST API 用于查询 MongoDB 中的记录。很简单,大致如下:

GET /api/items?q=foo

在开发过程中,允许正则表达式作为查询q 很方便。我们只需将查询参数传递给 MongoDB $regex 运算符而不进行任何转义:

db.getCollection('items').find({ name: { $regex: req.query.q, $options: 'i' } });

因此,我们有一种非常灵活和方便的方式来查询我们的数据。现在,事情变得“严重”,即接近生产,我在问自己安全隐患。有人可以发送带有昂贵回溯的“DoS”查询吗?

我可能没有足够的破坏性来考虑这样的查询,所以我在互联网上搜索并发现了这篇非常有趣的读物,其中提到了几个攻击:The Explosive Quantifier Trap。

忽略一个事实,即上述页面上提到的查询的行为远非预期的“灾难性”(无论是在 MongoDB 查询中,还是在 regex101.com 等在线工具中),我仍然想知道:

  1. 这是一个真正的问题,还是我在追逐不存在的威胁?
  2. 我们是否最好完全摆脱正则表达式参数?
  3. MongoDB 是否有任何机制(即超时)来防止通过恶意正则表达式进行 DoS 攻击? (fwiw:我们在 Node.js 环境中运行)
  4. 是否有库可以在发出查询之前检测此类攻击?

【问题讨论】:

  • 任何库?我不确定,但了解什么是 ReDoS 攻击将有助于构建您自己的条件。此外,禁止捕获或非捕获组等集群将降低这种风险。您也可能不需要正则表达式,但需要一些模式,例如一些扩展,即 * 或 ?。

标签: regex mongodb backtracking exploit


【解决方案1】:

我个人的直觉告诉我:不要打扰。但是话又说回来,如果您仍然这样做甚至必须这样做,那么这里有一些关于如何处理此要求的建议:

  1. 您可以使用maxTimeMS() 定义查询可以运行的最长时间。
  2. 您可以尝试清理正则表达式输入,但我怀疑是否有库可以帮助您解决可能长时间运行的复杂查询的无尽变化。限制正则​​表达式的长度可能也会有所帮助,但另一方面可能会破坏允许用户使用任意过滤器方便地进行搜索的目的。
  3. 您可以提供更结构化的查询输入,例如只允许用户输入单个字母数字文本,然后将其包装在服务器端的正则表达式中以允许例如“starts-with”、“contains”或“ends-with”查询之类的。
  4. 您可以只允许每个用户执行一个并行查询(会话?ip整个系统的端点。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2013-01-04
    • 2015-04-19
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2016-10-25
    相关资源
    最近更新 更多