MongoDB $ regex查询和潜在漏洞

qqi*_*ihq 5 regex exploit backtracking mongodb

我们有一个REST API,用于查询MongoDB中的记录。很简单,遵循以下步骤:

GET /api/items?q=foo
Run Code Online (Sandbox Code Playgroud)

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

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

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

我可能没有足够的破坏力来考虑这样的查询,因此我已经在Internet上搜索并发现了这一非常有趣的读物,其中提到了几种攻击:爆炸性量词陷阱

舍弃这一事实,即上一页中提到的查询的行为远没有达到预期的“灾难性”(无论是在MongoDB查询中,还是在在线工具(例如regex101.com中)),我仍然想知道:

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

dni*_*ess 5

我很个人的直觉说:不要打扰。但是,再次重申,如果您仍然要这样做,或者甚至必须这样做,那么这里有一些有关如何处理此要求的建议:

  1. 您可以使用maxTimeMS()定义查询可以运行的最长时间。
  2. 您可以尝试清理正则表达式输入,但考虑到可能长期运行的复杂查询的无尽变化,我怀疑那里是否有库可以帮助您解决此问题。限制正则​​表达式的长度也可能有所帮助,但是另一方面,它可能无法达到允许用户使用任意过滤器方便地进行搜索的目的。
  3. 您可以提供更为结构化的查询输入,例如,仅允许用户输入单个字母数字文本,然后将其包装在服务器端的正则表达式中,以实现“ starts-with”,“ contains”或“ “结束于”查询或其他内容。
  4. 您可以只允许每个用户一个单独的并行查询(会话?ip?),这可能对致命的DoS攻击有一点帮助,但肯定不能对分布式的DoS攻击有所帮助...或者您甚至可以只允许跨该端点的单个并行调用。整个系统。