nocodb
Ecosystem: npm
Downloads: 29.62 K
- 0CriticalAffects 0 versions
- 7HighAffects 7 versions
- 0MediumAffects 0 versions
- 41ModerateAffects 41 versions
- 6LowAffects 6 versions
- Critical0 (0.0%)
- High7 (13.0%)
- Medium0 (0.0%)
- Moderate41 (75.9%)
- Low6 (11.1%)
Monthly breakdown
- Critical
- High
- Medium
- Moderate
- Low
- 21 vulnerabilities
- Critical: 0
- High: 2
- Medium: 0
- Moderate: 18
- Low: 1
- 8 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 5
- Low: 3
- 10 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 8
- Low: 2
- 4 vulnerabilities
- Critical: 0
- High: 1
- Medium: 0
- Moderate: 3
- Low: 0
- 1 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 1
- Low: 0
- 3 vulnerabilities
- Critical: 0
- High: 1
- Medium: 0
- Moderate: 2
- Low: 0
- 1 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 1
- Low: 0
- 1 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 1
- Low: 0
- 1 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 1
- Low: 0
- 4 vulnerabilities
- Critical: 0
- High: 3
- Medium: 0
- Moderate: 1
- Low: 0
Vulnerabilities (54)
Known vulnerabilities affecting nocodb, based on data from OSV.
| ID | Severity | Summary | Affected versions | Published | Source |
|---|---|---|---|---|---|
| GHSA-6mhr-74x2-98v9 | Moderate | NocoDB: Stored Cross-Site Scripting via Secure Attachment### 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 in |
| GitHub (opens in a new tab) | |
| GHSA-gprh-27j3-g5h4 | Moderate | NocoDB: Server-Side Request Forgery via Spreadsheet Fetch URL### Summary The spreadsheet-fetch endpoint (`axiosRequestMake`) accepted URLs whose path contained a permitted extension anywhere in the string, and applied a hand-rolled regex blocklist that omitted `127.0.0.0/8` and `169.254.0.0/16`, allowing the cloud-metadata endpoint to be reached with a crafted URL. ### Details The extension matcher is now anchored to the end of the path or immediately before the query string (`/\.(xls|xlsx|xlsm|ods|ots)(\?|$)/i` and `/\.(csv)(\?|$)/i`), so `http://169.254.169.254/credentials/.xlsx` no longer satisfies the format gate. The hand-rolled IP blocklist is re |
| GitHub (opens in a new tab) | |
| GHSA-h6vv-pcq8-7xm4 | Moderate | NocoDB: Server-Side Request Forgery via Base Migration URL### Summary The base-migration endpoint accepted a caller-supplied URL that the migration worker dereferenced without enforcing protocol or destination, allowing scheme abuse (`file:`, `ftp:`, etc.) and probing of internal HTTP destinations. ### Details The `migrate` endpoint is restricted to the workspace owner role by ACL. The remaining gaps were (a) protocol validation — the controller now parses `body.migrationUrl` as a `URL` and rejects anything whose protocol is not `http:` or `https:` — and (b) private destination filtering — the worker already runs through `useAgent(targetUrl)` from ` |
| GitHub (opens in a new tab) | |
| GHSA-hmcr-rmjq-47qr | Moderate | NocoDB: Server-Side Request Forgery via Spreadsheet Import Endpoint### Summary The spreadsheet-import endpoint `axiosRequestMake` could be used as a generic HTTP proxy. Before the fix it was reachable unauthenticated, and its URL-extension allowlist was a regex tested against the full URL string, so URLs whose query string ended in `.csv` (for example `https://example.com/robots.txt?.csv`) satisfied the gate even though the underlying request was for `robots.txt`. ### Details Three layers of protection now apply to the endpoint: - The controller is decorated with `@UseGuards(DataApiLimiterGuard, GlobalGuard)` and `@Acl('fetchViaUrl')`, so unauthenticated |
| GitHub (opens in a new tab) | |
| GHSA-r989-7g3j-wjhw | Moderate | NocoDB: Refresh Tokens Persist Through Password Recovery### Summary A stolen refresh token survived a password-forgot flow and could be used to mint fresh JWTs even after the user reset their password. ### Details `passwordChange` and `passwordReset` deleted the user's refresh tokens, but `passwordForgot` only rotated `token_version` and revoked OAuth tokens — it did not call `UserRefreshToken.deleteAllUserToken(user.id)`. An attacker holding a captured refresh cookie could still exchange it for a new access token after the victim triggered the recovery flow. ### Impact Persistent unauthorized access after password recovery. Once a refresh token |
| GitHub (opens in a new tab) | |
| GHSA-4w6r-5c2j-qf5f | Moderate | NocoDB: Hidden Column Exposure in Public Shared View Endpoints### Summary Public shared-view endpoints exposed values from columns that the view owner had hidden, via three independent paths: groupBy returned raw values for any column named in the request, filter and sort arrays operated on hidden columns enabling boolean-blind extraction, and the related-data list accepted arbitrary link-column IDs from other tables in the same base. ### Details A new `sanitizeListArgsForPublicView` helper now strips request keys that should never be caller-controlled (e.g. `getHiddenColumn`, `nested`), parses `where` clauses against a restricted alias map that only co |
| GitHub (opens in a new tab) | |
| GHSA-6xcx-7qmg-vjfq | Moderate | NocoDB: Reflected Cross-Site Scripting via Password Reset Token### Summary The password-reset page rendered the URL token directly into a JavaScript string literal in a server-rendered EJS template. EJS `<%= %>` HTML-entity-encodes a fixed set of characters but does not escape single quotes or backslashes, so a crafted token could break out of the JS string context and execute attacker-controlled script in the NocoDB origin. Triggering required only that a victim follow a malicious password-reset link. ### Details The vulnerable template embedded the token as: ```ejs token: '<%= token %>', ``` A token containing `';alert(document.cookie);//` closes t |
| GitHub (opens in a new tab) | |
| GHSA-8m7c-hf24-5g47 | Moderate | NocoDB: OAuth Authorization Code Race Condition### Summary Two concurrent token-exchange requests using the same OAuth authorization code could each mint a distinct valid `(access_token, refresh_token)` pair, breaking the single-use guarantee that PKCE relies on. ### Details The token-exchange flow read `is_used` and called `markAsUsed` as an unconditional update at the end of the path. A new `OAuthAuthorizationCode.claimByCode` method now performs an atomic compare-and-swap (`WHERE code = ? AND is_used = false`) and is called immediately before `OAuthToken.insert`, after redirect-URI, PKCE, and client authentication have all succeeded. O |
| GitHub (opens in a new tab) | |
| GHSA-96fh-m4r8-6v9v | Moderate | NocoDB: Cross-Workspace Integration Use in Connection Test### Summary A user in one workspace could exercise another workspace's integration through the `testConnection` endpoint by supplying its ID, because the integration was fetched in a bypass scope and the caller's permission check matched any base in any workspace. ### Details The connection-test endpoint fetched the integration in `RootScopes.BYPASS` scope and checked only that the integration was non-private and that the caller held an owner/creator role on any base in any workspace. The permission lookup is now scoped to the integration's workspace by joining on `fk_workspace_id`, and the c |
| GitHub (opens in a new tab) | |
| GHSA-9wgh-m22w-9xj8 | Moderate | NocoDB: Hidden LTAR Column Exposure in Public Shared-View Relation Endpoints### Summary The public shared-view relation endpoints accepted a caller-supplied column ID without verifying that the column was visible in the shared view, so anyone holding a share UUID could read links from any LTAR column on the view's table — including columns the view owner had hidden. ### Details `publicMmList`, `publicHmList`, and `relDataList` already ensured that the requested column belonged to the view's model, but did not check the view-column entry's `show` flag. All three handlers now also fetch the shared view's column entries and reject the request unless the matching entry h |
| GitHub (opens in a new tab) |
- GHSA-6mhr-74x2-98v9ModerateNocoDB: Stored Cross-Site Scripting via Secure Attachment
<= 0.301.3
### 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 in
CVE: CVE-2026-53929
- GHSA-gprh-27j3-g5h4ModerateNocoDB: Server-Side Request Forgery via Spreadsheet Fetch URL
<= 0.301.3
### Summary The spreadsheet-fetch endpoint (`axiosRequestMake`) accepted URLs whose path contained a permitted extension anywhere in the string, and applied a hand-rolled regex blocklist that omitted `127.0.0.0/8` and `169.254.0.0/16`, allowing the cloud-metadata endpoint to be reached with a crafted URL. ### Details The extension matcher is now anchored to the end of the path or immediately before the query string (`/\.(xls|xlsx|xlsm|ods|ots)(\?|$)/i` and `/\.(csv)(\?|$)/i`), so `http://169.254.169.254/credentials/.xlsx` no longer satisfies the format gate. The hand-rolled IP blocklist is re
CVE: CVE-2026-53927
- GHSA-h6vv-pcq8-7xm4ModerateNocoDB: Server-Side Request Forgery via Base Migration URL
<= 0.301.3
### Summary The base-migration endpoint accepted a caller-supplied URL that the migration worker dereferenced without enforcing protocol or destination, allowing scheme abuse (`file:`, `ftp:`, etc.) and probing of internal HTTP destinations. ### Details The `migrate` endpoint is restricted to the workspace owner role by ACL. The remaining gaps were (a) protocol validation — the controller now parses `body.migrationUrl` as a `URL` and rejects anything whose protocol is not `http:` or `https:` — and (b) private destination filtering — the worker already runs through `useAgent(targetUrl)` from `
CVE: CVE-2026-53930
- GHSA-hmcr-rmjq-47qrModerateNocoDB: Server-Side Request Forgery via Spreadsheet Import Endpoint
<= 0.301.3
### Summary The spreadsheet-import endpoint `axiosRequestMake` could be used as a generic HTTP proxy. Before the fix it was reachable unauthenticated, and its URL-extension allowlist was a regex tested against the full URL string, so URLs whose query string ended in `.csv` (for example `https://example.com/robots.txt?.csv`) satisfied the gate even though the underlying request was for `robots.txt`. ### Details Three layers of protection now apply to the endpoint: - The controller is decorated with `@UseGuards(DataApiLimiterGuard, GlobalGuard)` and `@Acl('fetchViaUrl')`, so unauthenticated
CVE: CVE-2026-53931
- GHSA-r989-7g3j-wjhwModerateNocoDB: Refresh Tokens Persist Through Password Recovery
<= 0.301.3
### Summary A stolen refresh token survived a password-forgot flow and could be used to mint fresh JWTs even after the user reset their password. ### Details `passwordChange` and `passwordReset` deleted the user's refresh tokens, but `passwordForgot` only rotated `token_version` and revoked OAuth tokens — it did not call `UserRefreshToken.deleteAllUserToken(user.id)`. An attacker holding a captured refresh cookie could still exchange it for a new access token after the victim triggered the recovery flow. ### Impact Persistent unauthorized access after password recovery. Once a refresh token
CVE: CVE-2026-53928
- GHSA-4w6r-5c2j-qf5fModerateNocoDB: Hidden Column Exposure in Public Shared View Endpoints
< 2026.04.1
### Summary Public shared-view endpoints exposed values from columns that the view owner had hidden, via three independent paths: groupBy returned raw values for any column named in the request, filter and sort arrays operated on hidden columns enabling boolean-blind extraction, and the related-data list accepted arbitrary link-column IDs from other tables in the same base. ### Details A new `sanitizeListArgsForPublicView` helper now strips request keys that should never be caller-controlled (e.g. `getHiddenColumn`, `nested`), parses `where` clauses against a restricted alias map that only co
CVE: CVE-2026-47378
- GHSA-6xcx-7qmg-vjfqModerateNocoDB: Reflected Cross-Site Scripting via Password Reset Token
< 2026.04.1
### Summary The password-reset page rendered the URL token directly into a JavaScript string literal in a server-rendered EJS template. EJS `<%= %>` HTML-entity-encodes a fixed set of characters but does not escape single quotes or backslashes, so a crafted token could break out of the JS string context and execute attacker-controlled script in the NocoDB origin. Triggering required only that a victim follow a malicious password-reset link. ### Details The vulnerable template embedded the token as: ```ejs token: '<%= token %>', ``` A token containing `';alert(document.cookie);//` closes t
CVE: CVE-2026-47376
- GHSA-8m7c-hf24-5g47ModerateNocoDB: OAuth Authorization Code Race Condition
< 2026.05.1
### Summary Two concurrent token-exchange requests using the same OAuth authorization code could each mint a distinct valid `(access_token, refresh_token)` pair, breaking the single-use guarantee that PKCE relies on. ### Details The token-exchange flow read `is_used` and called `markAsUsed` as an unconditional update at the end of the path. A new `OAuthAuthorizationCode.claimByCode` method now performs an atomic compare-and-swap (`WHERE code = ? AND is_used = false`) and is called immediately before `OAuthToken.insert`, after redirect-URI, PKCE, and client authentication have all succeeded. O
CVE: CVE-2026-47386
- GHSA-96fh-m4r8-6v9vModerateNocoDB: Cross-Workspace Integration Use in Connection Test
< 2026.05.1
### Summary A user in one workspace could exercise another workspace's integration through the `testConnection` endpoint by supplying its ID, because the integration was fetched in a bypass scope and the caller's permission check matched any base in any workspace. ### Details The connection-test endpoint fetched the integration in `RootScopes.BYPASS` scope and checked only that the integration was non-private and that the caller held an owner/creator role on any base in any workspace. The permission lookup is now scoped to the integration's workspace by joining on `fk_workspace_id`, and the c
CVE: CVE-2026-47381
- GHSA-9wgh-m22w-9xj8ModerateNocoDB: Hidden LTAR Column Exposure in Public Shared-View Relation Endpoints
< 2026.05.1
### Summary The public shared-view relation endpoints accepted a caller-supplied column ID without verifying that the column was visible in the shared view, so anyone holding a share UUID could read links from any LTAR column on the view's table — including columns the view owner had hidden. ### Details `publicMmList`, `publicHmList`, and `relDataList` already ensured that the requested column belonged to the view's model, but did not check the view-column entry's `show` flag. All three handlers now also fetch the shared view's column entries and reject the request unless the matching entry h
CVE: CVE-2026-47279