CVE-2026-46378

HIGHPre-NVD 7.57.5
EchelonGraph scoreLOW confidence

This high-severity CVE scores 7.5 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit probability: 0.1%, top 84% of all CVEs by exploit prediction. GitHub Security Advisory data not yet ingested — confidence will rise once GHSA publishes (typical lag: hours to days for open-source ecosystem CVEs; never for infrastructure-only CVEs).

Triggered by: NVD CVSS baseline
Sources: cna:github_m, epss
7.5
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS: 0%CVSS: 7.5Exploit: NoneExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

Dasel: Denial of service in dasel selector lexer due to infinite loop on unterminated regex literal

Summary

dasel's selector lexer enters a non-terminating loop when tokenizing an unterminated regex pattern such as r/abc. A 2-byte input (r/) is sufficient to cause the tokenizer to consume 100% CPU on one core indefinitely.

I confirmed the issue on v3.3.1 (fba653c7f248aff10f2b89fca93929b64707dfc8) and on master commit 0dd6132e0c58edbd9b1a5f7ffd00dfab1e6085ad. I also verified the same code path is present in v3.0.0 (648f83baf070d9e00db8ff312febef857ec090a3). No fix is available yet.

Details

The bug is in the matchRegexPattern closure within (*Tokenizer).parseCurRune in selector/lexer/tokenize.go#L237-L247:

matchRegexPattern := func(pos int) *Token {
    if p.src[pos] != 'r' || !p.peekRuneEqual(pos+1, '/') {
        return nil
    }
    start := pos
    pos += 2
    for !p.peekRuneEqual(pos, '/') {  // line 243
        pos++
    }
    pos++
    return ptr.To(NewToken(RegexPattern, p.src[start+2:pos-1], start, pos-start))
}

When no closing / exists, peekRuneEqual returns false when pos >= srcLen (because the bounds check at line 40 returns false for out-of-range positions). Since !false = true, the loop condition remains true and pos increments indefinitely. The function never returns.

Notably, the same function already handles unterminated quoted strings by returning UnexpectedEOFError, but the regex pattern path does not perform a similar end-of-input check.

Minimal trigger: r/ (2 bytes)

Test environment:

  • MacBook Air (Apple M2), macOS / Darwin arm64
  • Go 1.26.1
  • dasel v3.3.1 (fba653c7f248aff10f2b89fca93929b64707dfc8)

PoC

package main

import ( "fmt" "runtime" "time"

"github.com/tomwright/dasel/v3/selector/lexer" )

func main() { fmt.Printf("Go version: %s\n", runtime.Version()) fmt.Printf("GOARCH: %s\n", runtime.GOARCH) fmt.Println()

for _, input := range []string{"r/unterminated", "r/"} { fmt.Printf("Input: %s\n", input) done := make(chan string, 1) go func() { t := lexer.NewTokenizer(input) start := time.Now() tokens, err := t.Tokenize() elapsed := time.Since(start) if err != nil { done <- fmt.Sprintf("Error after %v: %v", elapsed, err) } else { done <- fmt.Sprintf("OK after %v: %d tokens", elapsed, len(tokens)) } }()

select { case result := <-done: fmt.Println(result) case <-time.After(5 * time.Second): fmt.Println("CONFIRMED: did not complete within 5s; tokenizer is stuck in non-terminating loop") } fmt.Println() } }

Observed output on v3.3.1 in the test environment above:

Go version: go1.26.1
GOARCH: arm64

Input: r/unterminated CONFIRMED: did not complete within 5s; tokenizer is stuck in non-terminating loop

Input: r/ CONFIRMED: did not complete within 5s; tokenizer is stuck in non-terminating loop

Impact

An attacker who can control or influence the selector/query string passed to dasel can cause the tokenizer to enter a non-terminating loop. The affected process consumes 100% CPU on one core and does not make progress until externally terminated.

The selector string is typically provided by the application developer, but there are deployment scenarios where it may be attacker-influenced:

  • Web applications using dasel for dynamic data querying
  • Applications that construct selectors from user input
  • Shared tooling environments where selectors are passed as parameters

Suggested Fix

The regex scanner should bounds-check and return an error on unterminated regex literals, consistent with unterminated quoted strings. Since matchRegexPattern currently returns *Token, the fix also requires changing the function signature to propagate errors. For example:

matchRegexPattern := func(pos int) (*Token, error) {
    if p.src[pos] != 'r' || !p.peekRuneEqual(pos+1, '/') {
        return nil, nil
    }
    start := pos
    pos += 2
    for pos < p.srcLen && p.src[pos] != '/' {
        pos++
    }
    if pos >= p.srcLen {
        return nil, &UnexpectedEOFError{Pos: pos}
    }
    pos++
    return ptr.To(NewToken(RegexPattern, p.src[start+2:pos-1], start, pos-start)), nil
}

CVSS v3
7.5
EG Score
7.5(low)
EPSS
16.0%
KEV
Not listed

Published

May 19, 2026

Last Modified

May 19, 2026

Vendor Advisories for CVE-2026-46378(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
Go(1)
PackageVulnerable rangeFixed inDependents
github.com/tomwright/dasel/v33.10.1

Data Freshness Timeline

(refreshed 0× in last 7d / 28× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

  1. 2026-06-29 20:40 UTCEG score recompute
  2. 2026-06-28 07:57 UTCEG score recompute
  3. 2026-06-27 20:22 UTCEG score recompute
  4. 2026-06-27 07:29 UTCEG score recompute
  5. 2026-06-26 19:43 UTCEG score recompute
  6. 2026-06-26 03:50 UTCEG score recompute
  7. 2026-06-25 16:29 UTCEG score recompute
  8. 2026-06-17 22:44 UTCEG score recompute
  9. 2026-06-17 11:40 UTCEG score recompute
  10. 2026-06-16 21:41 UTCEG score recompute
  11. 2026-06-16 10:49 UTCEG score recompute
  12. 2026-06-15 22:58 UTCEG score recompute
  13. 2026-06-15 07:51 UTCEG score recompute
  14. 2026-06-14 23:18 UTCEPSS rescore
  15. 2026-06-14 20:14 UTCEG score recompute
  16. 2026-06-14 09:25 UTCEG score recompute
  17. 2026-06-13 23:00 UTCEPSS rescore
  18. 2026-06-13 22:36 UTCEG score recompute
  19. 2026-06-13 07:46 UTCEG score recompute
  20. 2026-06-12 23:12 UTCEPSS rescore
  21. 2026-06-12 20:56 UTCEG score recompute
  22. 2026-06-12 10:07 UTCEG score recompute
  23. 2026-06-11 23:17 UTCEG score recompute
  24. 2026-06-11 12:27 UTCEG score recompute
  25. 2026-06-11 01:38 UTCEG score recompute
Show 24 more
  1. 2026-06-10 14:49 UTCEG score recompute
  2. 2026-06-10 04:00 UTCEG score recompute
  3. 2026-06-09 17:10 UTCEG score recompute
  4. 2026-06-09 06:21 UTCEG score recompute
  5. 2026-06-08 19:31 UTCEG score recompute
  6. 2026-06-08 08:23 UTCEG score recompute
  7. 2026-06-07 21:34 UTCEG score recompute
  8. 2026-06-07 10:45 UTCEG score recompute
  9. 2026-06-06 23:56 UTCEG score recompute
  10. 2026-06-06 13:07 UTCEG score recompute
  11. 2026-06-06 02:17 UTCEG score recompute
  12. 2026-06-06 02:17 UTCEG score recompute
  13. 2026-06-05 15:28 UTCEG score recompute
  14. 2026-06-05 04:39 UTCEG score recompute
  15. 2026-06-04 17:50 UTCEG score recompute
  16. 2026-06-04 07:00 UTCEG score recompute
  17. 2026-06-03 20:11 UTCEG score recompute
  18. 2026-06-03 09:21 UTCEG score recompute
  19. 2026-06-02 22:26 UTCEG score recompute
  20. 2026-06-02 11:37 UTCEG score recompute
  21. 2026-06-02 00:48 UTCEG score recompute
  22. 2026-06-01 13:59 UTCEG score recompute
  23. 2026-06-01 03:04 UTCEG score recompute
  24. 2026-05-24 06:12 UTCEG score recompute

Frequently asked(5)

What is CVE-2026-46378?
CVE-2026-46378 is a high vulnerability published on May 19, 2026. Dasel: Denial of service in dasel selector lexer due to infinite loop on unterminated regex literal Summary dasel's selector lexer enters a non-terminating loop when tokenizing an unterminated regex pattern such as r/abc. A 2-byte input (r/) is sufficient to cause the tokenizer to consume 100% CPU…
When was CVE-2026-46378 disclosed?
CVE-2026-46378 was first published in the National Vulnerability Database on May 19, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2026-46378 actively exploited?
CVE-2026-46378 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 16.0% percentile likelihood of exploitation in the next 30 days — higher percentiles indicate greater predicted risk.
What is the CVSS score of CVE-2026-46378?
CVE-2026-46378 has a CVSS v4.0 base score of 7.5 (CNA self-assessment; NVD's own analysis pending). The EG score is currently aggregating — additional source signals are being incorporated as they become available..
How do I remediate CVE-2026-46378?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-46378, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-46378

Explore →

Is Your Infrastructure Affected by CVE-2026-46378?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.