Summary
With NC_SECURE_ATTACHMENTS=true, an authenticated uploader could deliver .html or.svg attachments that the browser rendered inline from the NocoDB origin instead of
forcing a download.
Details
The signed attachment handler stored response-header overrides under PascalCase keys
(ResponseContentDisposition, ResponseContentType) while the controller that served
the file read them under lowercase-hyphen names (response-content-disposition). The
mismatch dropped the Content-Disposition: attachment header, leaving Express to
auto-render .html, .svg, and similar inline. The fix corrects the key case and
additionally forces Content-Disposition: attachment andContent-Type: application/octet-stream for any MIME type not on the preview
allowlist.
Credit
This issue was reported by @bugbunny-research.
It was independently reported by @DavidCarliez.
Impact
Stored Cross-Site Scripting in the NocoDB origin from inline-rendered uploads. Script
executing in the victim's browser can read the auth JWT from localStorage.
Exploitation requires authenticated upload permission and the secure-attachment mode
to be enabled.
Untrusted input is rendered as active markup in a victim's browser, which can run script in their session. Typical impact: session or credential theft, and actions taken as the user.
Affected versions
Security releases
Kodem intelligence
Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.
Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.
Remediation advice
In the interim: Validate and encode untrusted input before rendering it as HTML. Applying a Content Security Policy reduces the impact if encoding is bypassed.
Kodem Kai can prioritize this vulnerability in your dependency tree and generate a fix recommendation.
Frequently Asked Questions
- What is CVE-2026-53929? CVE-2026-53929 is a medium-severity cross-site scripting (XSS) vulnerability in nocodb (npm), affecting versions <= 0.301.3. No fixed version is listed yet. Untrusted input is rendered as active markup in a victim's browser, which can run script in their session.
- Which versions of nocodb are affected by CVE-2026-53929? nocodb (npm) versions <= 0.301.3 is affected.
- Is there a fix for CVE-2026-53929? No fixed version is listed for CVE-2026-53929 yet. Monitor the advisory for updates and apply mitigations in the interim.
- Is CVE-2026-53929 exploitable, and should I be worried? Whether CVE-2026-53929 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
- What actually determines whether CVE-2026-53929 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
- How do I fix CVE-2026-53929? No fixed version is listed yet. In the interim: Validate and encode untrusted input before rendering it as HTML. Applying a Content Security Policy reduces the impact if encoding is bypassed.