github / github/codeql

[C#] Improve "isExponentialRegex" detection logic in ReDoSQuery.qll to prevent false negatives

Offen
#22,183 3 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen
question
Vorherrschende Sprache
CodeQL
Sterne
10.1k
Forks
2.1k
Ø Merge
2 T. 15 Std.
Gemergte PRs (30 T.)
141

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll, insbesondere mit den Zeilen 58–72, und verfolge, wie die Abfrage cs/redos isExponentialRegex und regexpMatch verwendet. Vergleiche die bestehende Matching-Logik mit den aufgeführten Beispielen für verschachtelte Quantifizierer und sich überschneidende Alternativen. Als erledigt gilt die Aufgabe, wenn die Abfrage diese Varianten erkennt, ohne ihre bestehende Abdeckung zu verlieren oder problematisches Matching-Verhalten einzuführen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp
Bereich
security
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.