CVE-2026-62866
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune`
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
6.2
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune`
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
CVE-2026-62866- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-129
- Updated
- 2026-11-02
EUVDEUVD-2026-84016
6.2
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
EUVD-2026-84016- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-65gg-g7rw-6cpc
6.2
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune`
Same panic class as GHSA-m5j3-4634-c2vq and GHSA-m6xr-fvfg-5g64, sister site on the same function. Trigger is any selector ending in whitespace: dasel query 'a ' panics at selector/lexer/tokenize.go:60.
The whitespace-skip loop right above (lines 55-57) advances p.i to p.srcLen when the input is all-whitespace or whitespace-trailing. The very next line reads p.src[p.i] without a bounds check.
Vulnerable code
selector/lexer/tokenize.go:53-74 (v3.11.0):
func (p *Tokenizer) parseCurRune() (Token, error) {
// Skip over whitespace
for p.i < p.srcLen && unicode.IsSpace(rune(p.src[p.i])) {
p.i++
}
// Skip over comments
if p.src[p.i] == '/' && p.i+1 < p.srcLen && p.src[p.i+1] == '/' {
// ...
Lines 69-71 right below already do the bounds check after the comment-skip path. The whitespace-only path slipped past it.
Reproduce
$ echo '{"a":1}' | dasel query -i json 'a '
panic: runtime error: index out of range [2] with length 2
goroutine 1 [running]:
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).parseCurRune(...)
selector/lexer/tokenize.go:60
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).Next(...)
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).Tokenize(...)
github.com/tomwright/dasel/v3/selector.Parse(...)
github.com/tomwright/dasel/v3/execution.ExecuteSelector(...)
Other inputs that hit it: ' ', $'a\t', $'a\n', 'a ?? ', 'a + '. Any token (or no token) followed by whitespace.
Reachable directly from the library too - dasel.Query(ctx, input, "a ") panics the same way. Project-style test reproducer that fails on current main:
// drop into selector/lexer/ as tokenize_trailing_ws_test.go
package lexer_test
import (
"testing"
"github.com/tomwright/dasel/v3/selector/lexer"
)
func TestTokenize_TrailingWhitespacePanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Fatalf("Tokenize panicked: %v", r)
}
}()
_, _ = lexer.NewTokenizer("a ").Tokenize()
}
Impact
Process crash, no auth, no preconditions. Same severity tier as the two May 13 advisories on this file.
Affected versions
All v3.x. The whitespace-skip loop was added in 78fcca9 (Dasel V3, ~9 months ago); line 60's indexing landed in 9bfe966 (~6 months ago). Reproduced on github.com/tomwright/dasel/[email protected].
Suggested fix
One line, between the whitespace-skip loop and the comment-skip access. Same shape as lines 69-71:
func (p *Tokenizer) parseCurRune() (Token, error) {
for p.i < p.srcLen && unicode.IsSpace(rune(p.src[p.i])) {
p.i++
}
if p.i >= p.srcLen {
return NewToken(EOF, "", p.i, 0), nil
}
if p.src[p.i] == '/' && p.i+1 < p.srcLen && p.src[p.i+1] == '/' {
Prevalence
The other two cases in this class shipped fixes two weeks ago; this one wasn't covered in those patches. I checked the rest of parseCurRune for other unguarded direct-access points after a pos++ - nothing else stood out. A testing.F harness on lexer.NewTokenizer(s).Tokenize() catches all three with trivially short inputs and would close the class.
- Record
GHSA-65gg-g7rw-6cpc- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-129
- Updated
- 2026-11-02
NVD
6.2
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
CVE-2026-62866- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-129
- Updated
- 2026-11-02
OSV
6.2
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune`
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
CVE-2026-62866- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-129
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-62866
6.2
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
DEBIAN-CVE-2026-62866- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVGHSA-65gg-g7rw-6cpc
6.2
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune`
Same panic class as GHSA-m5j3-4634-c2vq and GHSA-m6xr-fvfg-5g64, sister site on the same function. Trigger is any selector ending in whitespace: dasel query 'a ' panics at selector/lexer/tokenize.go:60.
The whitespace-skip loop right above (lines 55-57) advances p.i to p.srcLen when the input is all-whitespace or whitespace-trailing. The very next line reads p.src[p.i] without a bounds check.
Vulnerable code
selector/lexer/tokenize.go:53-74 (v3.11.0):
func (p *Tokenizer) parseCurRune() (Token, error) {
// Skip over whitespace
for p.i < p.srcLen && unicode.IsSpace(rune(p.src[p.i])) {
p.i++
}
// Skip over comments
if p.src[p.i] == '/' && p.i+1 < p.srcLen && p.src[p.i+1] == '/' {
// ...
Lines 69-71 right below already do the bounds check after the comment-skip path. The whitespace-only path slipped past it.
Reproduce
$ echo '{"a":1}' | dasel query -i json 'a '
panic: runtime error: index out of range [2] with length 2
goroutine 1 [running]:
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).parseCurRune(...)
selector/lexer/tokenize.go:60
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).Next(...)
github.com/tomwright/dasel/v3/selector/lexer.(*Tokenizer).Tokenize(...)
github.com/tomwright/dasel/v3/selector.Parse(...)
github.com/tomwright/dasel/v3/execution.ExecuteSelector(...)
Other inputs that hit it: ' ', $'a\t', $'a\n', 'a ?? ', 'a + '. Any token (or no token) followed by whitespace.
Reachable directly from the library too - dasel.Query(ctx, input, "a ") panics the same way. Project-style test reproducer that fails on current main:
// drop into selector/lexer/ as tokenize_trailing_ws_test.go
package lexer_test
import (
"testing"
"github.com/tomwright/dasel/v3/selector/lexer"
)
func TestTokenize_TrailingWhitespacePanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Fatalf("Tokenize panicked: %v", r)
}
}()
_, _ = lexer.NewTokenizer("a ").Tokenize()
}
Impact
Process crash, no auth, no preconditions. Same severity tier as the two May 13 advisories on this file.
Affected versions
All v3.x. The whitespace-skip loop was added in 78fcca9 (Dasel V3, ~9 months ago); line 60's indexing landed in 9bfe966 (~6 months ago). Reproduced on github.com/tomwright/dasel/[email protected].
Suggested fix
One line, between the whitespace-skip loop and the comment-skip access. Same shape as lines 69-71:
func (p *Tokenizer) parseCurRune() (Token, error) {
for p.i < p.srcLen && unicode.IsSpace(rune(p.src[p.i])) {
p.i++
}
if p.i >= p.srcLen {
return NewToken(EOF, "", p.i, 0), nil
}
if p.src[p.i] == '/' && p.i+1 < p.srcLen && p.src[p.i+1] == '/' {
Prevalence
The other two cases in this class shipped fixes two weeks ago; this one wasn't covered in those patches. I checked the rest of parseCurRune for other unguarded direct-access points after a pos++ - nothing else stood out. A testing.F harness on lexer.NewTokenizer(s).Tokenize() catches all three with trivially short inputs and would close the class.
- Record
GHSA-65gg-g7rw-6cpc- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-129
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-62866
6.2
Dasel is a command-line tool and library for querying, modifying, and transforming data structures. From 3.0.0 until 3.11.2, selector/lexer/tokenize.go parseCurRune advances the input index across trailing whitespace and then reads the source at the exhausted index without an end-of-input check. A selector ending in whitespace, including input passed through lexer.NewTokenizer(...).Tokenize() or dasel.Query, can therefore cause an index-out-of-range panic and terminate the process. This issue is fixed in version 3.11.2.
- Record
UBUNTU-CVE-2026-62866- CVSS 3.1
- 6.2 Medium
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVGO-2026-6548 No score
Dasel: Selector lexer panics on trailing whitespace in `parseCurRune` in github.com/tomwright/dasel
Dasel: Selector lexer panics on trailing whitespace in parseCurRune in github.com/tomwright/dasel
- Record
GO-2026-6548- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/tomwright/dasel/v3Go |
3.0.0 up to 3.11.2 | 3.11.2 |
daselDebian:14 |
before 3.11.2-1, plus listed versions 2.8.1-13.11.0-13.8.0-13.8.1-1 |
3.11.2-1 |
github.com/tomwright/daselGo |
All versions | None known |
github.com/tomwright/dasel/v2Go |
All versions | None known |
daselUbuntu:Pro:24.04:LTS |
All versions, plus listed versions 2.6.0-12.6.0-1build12.6.0-1ubuntu0.12.6.0-1ubuntu0.22.6.0-1ubuntu0.2+esm12.6.0-1ubuntu0.32.6.0-1ubuntu0.3+esm12.6.0-1ubuntu0.3+esm2 |
None known |
daselUbuntu:26.10 |
All versions, plus listed versions 2.8.1-1build13.11.0-13.11.2-13.11.2-2 |
None known |
daselUbuntu:26.04:LTS |
All versions, plus listed versions 2.8.1-12.8.1-1build1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-62866 is a medium vulnerability (CVSS 6.2) in Tomwright Dasel, published September 21, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.19%, the 8th percentile. Fixed in github.com/tomwright/dasel/v3 3.11.2.
References
github.com/TomWright/dasel/security/advisories/GHSA-65gg-g7rw-6cpc
github.com/TomWright/dasel/commit/eee03aec28d4a33d6138098d065b7b37b85e3c55
github.com/TomWright/dasel/releases/tag/v3.11.2
nvd.nist.gov/vuln/detail/CVE-2026-62866
github.com/advisories/GHSA-65gg-g7rw-6cpc
github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62866.json