[C#] Improve "isExponentialRegex" detection logic in ReDoSQuery.qll to prevent false negatives
还没有人认领这个 Issue。
评估
调研方向
从 csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll 开始,重点查看第 58–72 行,并跟踪查询 cs/redos 如何使用 isExponentialRegex 和 regexpMatch。将现有的匹配逻辑与列出的嵌套量词和重叠交替分支示例进行比较。完成标准是:查询能够检测这些变体,同时不丢失现有覆盖范围,也不引入有问题的匹配行为。
由索引模型根据 Issue 内容生成。
描述
Hello,
In the C# security analysis suite, the query Denial of Service from comparison of user input against expensive regex (cs/redos) relies heavily on underlying helper logic to flag regular expressions with potential exponential behavior. Specifically, in csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll (lines 58–72). This uses a set of hardcoded regular expressions via regexpMatch to identify string literals that represent exponential (ReDoS-vulnerable) regular expressions.
While these three variations catch patterns like ([a-z]+.)+, they are fragile syntactic approximations. This approach misses variations of overlapping or nested quantifiers, creating a scenario where dangerous regex structures easily bypass the query's detection due to minor structural variations.
For example the query overlooks risky patterns like these:
- Nested Quantifiers without literals:
(a*)*b or (x+)* - Overlapping Alternations/Sequences:
(x+x+)+y - Complex or Distant Structural Paths: Patterns that contain non-trivial prefixes/suffixes or specific character class structures can fail to match the strict capture-group structures defined in the QL code. Depending on the engine evaluating these meta-regexes, they could themselves face performance degradation when scanning highly complex, non-matching input paths.
This issue stood out because these specific pattern variants can easily slip through the ReDoS query undetected. This creates a gap between the security results and the actual risk. I'm wondering if it would be possible address this in a future version?
Version: 2.26.0
- 主要语言
- CodeQL
- 星标
- 10.1k
- 派生
- 2.1k
- 平均合并
- 2 天 11 小时
- 30 天内合并 PR
- 129
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
github/codeql 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 84/100
-
难度 2/5 1-3 小时 新手友好度 82/100
-
难度 2/5 1-3 小时 新手友好度 78/100
-
false-positive
难度 2/5 1-3 小时 新手友好度 70/100
-
false-positive
难度 3/5 1-2 天 新手友好度 68/100
相似的 Issue
-
enhancement
难度 2/5 1-3 小时 新手友好度 76/100
TheManticoreProject/Manticore#1383 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
dotnet/arcade-skills#51 ·
-
难度 2/5 1-3 小时 新手友好度 84/100
ethereum-optimism/factory#64 ·
-
难度 2/5 1-3 小时 新手友好度 82/100
zitadel/zitadel-go#628 ·
-
难度 2/5 1-3 小时 新手友好度 84/100
phoenixframework/phoenix#6847 ·