nocodb

Ecosystem: npm

Downloads: 29.62 K

Vulnerabilities from the last (months)
  • 0CriticalAffects 0 versions
  • 7HighAffects 7 versions
  • 0MediumAffects 0 versions
  • 41ModerateAffects 41 versions
  • 6LowAffects 6 versions
Severity distribution (all time)
54vulnerabilities
  • 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.

Vulnerabilities affecting nocodb
IDSeveritySummaryAffected versionsPublishedSource
GHSA-6mhr-74x2-98v9ModerateNocoDB: 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
  • <= 0.301.3
GitHub (opens in a new tab)
GHSA-gprh-27j3-g5h4ModerateNocoDB: 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
  • <= 0.301.3
GitHub (opens in a new tab)
GHSA-h6vv-pcq8-7xm4ModerateNocoDB: 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 `
  • <= 0.301.3
GitHub (opens in a new tab)
GHSA-hmcr-rmjq-47qrModerateNocoDB: 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
  • <= 0.301.3
GitHub (opens in a new tab)
GHSA-r989-7g3j-wjhwModerateNocoDB: 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
  • <= 0.301.3
GitHub (opens in a new tab)
GHSA-4w6r-5c2j-qf5fModerateNocoDB: 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
  • < 2026.04.1
GitHub (opens in a new tab)
GHSA-6xcx-7qmg-vjfqModerateNocoDB: 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
  • < 2026.04.1
GitHub (opens in a new tab)
GHSA-8m7c-hf24-5g47ModerateNocoDB: 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
  • < 2026.05.1
GitHub (opens in a new tab)
GHSA-96fh-m4r8-6v9vModerateNocoDB: 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
  • < 2026.05.1
GitHub (opens in a new tab)
GHSA-9wgh-m22w-9xj8ModerateNocoDB: 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
  • < 2026.05.1
GitHub (opens in a new tab)
  • GHSA-6mhr-74x2-98v9Moderate
    NocoDB: 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-g5h4Moderate
    NocoDB: 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-7xm4Moderate
    NocoDB: 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-47qrModerate
    NocoDB: 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-wjhwModerate
    NocoDB: 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-qf5fModerate
    NocoDB: 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-vjfqModerate
    NocoDB: 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-5g47Moderate
    NocoDB: 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-6v9vModerate
    NocoDB: 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-9xj8Moderate
    NocoDB: 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

Showing 1-10 of 54 vulnerabilities