Skip to content

♻️ update nanoid to v3.3.12 [SECURITY] - #566

Open
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/npm-nanoid-vulnerability
Open

♻️ update nanoid to v3.3.12 [SECURITY]#566
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/npm-nanoid-vulnerability

Conversation

@renovate

@renovate renovate Bot commented May 28, 2023

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
nanoid 3.1.223.3.12 age adoption passing confidence

Exposure of Sensitive Information to an Unauthorized Actor in nanoid

CVE-2021-23566 / GHSA-qrpm-p2h7-hrv2

More information

Details

The package nanoid from 3.0.0, before 3.1.31, are vulnerable to Information Exposure via the valueOf() function which allows to reproduce the last id generated.

Severity

  • CVSS Score: 5.5 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Predictable results in nanoid generation when given non-integer values

CVE-2024-55565 / GHSA-mwcw-c2x4-8c55

More information

Details

When nanoid is called with a fractional value, there were a number of undesirable effects:

  1. in browser and non-secure, the code infinite loops on while (size--)
  2. in node, the value of poolOffset becomes fractional, causing calls to nanoid to return zeroes until the pool is next filled
  3. if the first call in node is a fractional argument, the initial buffer allocation fails with an error

Version 3.3.8 and 5.0.9 are fixed.

Severity

  • CVSS Score: 4.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


nanoid: Integer Overflow or Wraparound

CVE-2026-73086 / GHSA-xwg4-73v4-xw9w

More information

Details

Summary

An integer overflow in nanoid(size) permanently corrupts the process-wide CSPRNG pool, causing all subsequent ID generation to return the deterministic string "uuuuuuuuuuuuuuuuuuuuu". Any application that passes user-influenced values to the size parameter loses all randomness guarantees for session tokens, CSRF tokens, and unique identifiers until process restart.

Details

nanoid() at index.js:101 coerces the size parameter with size |= 0, which converts it to a signed 32-bit integer. When size >= 2^31 (e.g., 2147483648), this wraps to -2147483648.

The negative value is passed to fillPool() (index.js:15):

function fillPool(bytes) {
  if (!pool || pool.length < bytes) {       // false: pool exists, -2B < pool.length
    pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)
    crypto.getRandomValues(pool)
    poolOffset = 0
  } else if (poolOffset + bytes > pool.length) {  // false: poolOffset + (-2B) < pool.length
    crypto.getRandomValues(pool)
    poolOffset = 0
  }
  poolOffset += bytes  // poolOffset += -2147483648 → deeply negative
}

Neither branch triggers, so the pool is never refreshed. poolOffset becomes ~-2.1 billion.

Subsequent nanoid() calls execute:

for (let i = poolOffset - size; i < poolOffset; i++) {
  id += scopedUrlAlphabet[pool[i] & 63]
}

pool[negative_index] returns undefined. undefined & 63 evaluates to 0. urlAlphabet[0] is 'u'. Every ID becomes "uuuuuuuuuuuuuuuuuuuuu".

The corruption is persistent — it affects all subsequent calls in the process until ~100 million calls eventually wrap poolOffset back to positive, or the process restarts.

PoC
import { nanoid } from 'nanoid'

// Step 1: Normal operation
console.log(nanoid())  // e.g., "V1StGXR8_Z5jdHi6B-myT"

// Step 2: Trigger overflow (e.g., from an API parameter)
try { nanoid(2147483648) } catch(e) {}

// Step 3: All subsequent IDs are deterministic
console.log(nanoid())  // "uuuuuuuuuuuuuuuuuuuuu"
console.log(nanoid())  // "uuuuuuuuuuuuuuuuuuuuu"
console.log(nanoid())  // "uuuuuuuuuuuuuuuuuuuuu"
// ... forever, process-wide

Run with: node --experimental-vm-modules poc.mjs

Attack scenario: Any API endpoint that accepts a user-controlled length/size parameter (URL shortener slug length, configurable token size, etc.) and passes it to nanoid(userInput).

Impact

Complete loss of ID unpredictability and uniqueness, process-wide, from a single request.

  • All session IDs, CSRF tokens, API keys, and database identifiers generated after the attack are identical and predictable
  • An attacker can predict all tokens issued to other users, enabling session hijacking and authentication bypass
  • The corruption is persistent (survives across requests) and affects all consumers of nanoid in the same process
  • No special privileges or preconditions required — a single unauthenticated request is sufficient
  • Affects any application that passes external input to the size parameter without validation

Severity

  • CVSS Score: 7.4 / 10 (High)
  • Vector String: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

ai/nanoid (nanoid)

v3.3.12

Compare Source

  • Fixed breaking Nano ID by requesting big ID.

v3.3.11

Compare Source

  • Fixed React Native support.

v3.3.10

Compare Source

v3.3.9

Compare Source

  • Reduced npm package size.

v3.3.8

Compare Source

  • Fixed a way to break Nano ID by passing non-integer size (by @​myndzi).

v3.3.7

Compare Source

  • Fixed node16 TypeScript support (by Saadi Myftija).

v3.3.6

Compare Source

  • Fixed package.

v3.3.5

Compare Source

  • Backport funding information.

v3.3.4

Compare Source

v3.3.3

Compare Source

  • Reduced size (by Anton Khlynovskiy).

v3.3.2

Compare Source

  • Fixed enhanced-resolve support.

v3.3.1

Compare Source

  • Fixed breaking Nano ID by requesting big ID.

v3.3.0

Compare Source

v3.2.0

Compare Source

v3.1.32

Compare Source

  • Reduced async exports size (by Artyom Arutyunyan).
  • Moved from Jest to uvu (by Vitaly Baev).

v3.1.31

Compare Source

  • Fixed collision vulnerability on object in size (by Artyom Arutyunyan).

v3.1.30

Compare Source

  • Reduced size for project with brotli compression (by Anton Khlynovskiy).

v3.1.29

Compare Source

  • Reduced npm package size.

v3.1.28

Compare Source

  • Reduced npm package size.

v3.1.27

Compare Source

  • Cleaned dependencies from development tools.

v3.1.26

Compare Source

  • Improved performance (by Eitan Har-Shoshanim).
  • Reduced npm package size.

v3.1.25

Compare Source

  • Fixed browserify support.

v3.1.24

Compare Source

  • Fixed browserify support (by Artur Paikin).

v3.1.23

Compare Source

  • Fixed esbuild support.

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from f1fbea0 to 83f4ce3 Compare November 6, 2023 09:35
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from 83f4ce3 to c3a0cfa Compare November 29, 2024 12:29
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed Dec 8, 2024
@renovate renovate Bot closed this Dec 8, 2024
@renovate
renovate Bot deleted the renovate/npm-nanoid-vulnerability branch December 8, 2024 18:36
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed ♻️ update nanoid to v3.1.31 [SECURITY] Dec 8, 2024
@renovate renovate Bot reopened this Dec 8, 2024
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from 683d11a to c3a0cfa Compare December 8, 2024 21:38
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch 2 times, most recently from 186d2b4 to b90c76c Compare March 17, 2025 18:49
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from b90c76c to a9bed6f Compare April 1, 2025 10:28
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] ♻️ update nanoid to v3.3.8 [SECURITY] Aug 13, 2025
@renovate renovate Bot changed the title ♻️ update nanoid to v3.3.8 [SECURITY] ♻️ update nanoid to v3.1.31 [SECURITY] Oct 15, 2025
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed Mar 27, 2026
@renovate renovate Bot closed this Mar 27, 2026
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed ♻️ update nanoid to v3.1.31 [SECURITY] Mar 30, 2026
@renovate renovate Bot reopened this Mar 30, 2026
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch 2 times, most recently from a9bed6f to ec994fa Compare March 30, 2026 21:51
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed Apr 27, 2026
@renovate renovate Bot closed this Apr 27, 2026
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] - autoclosed ♻️ update nanoid to v3.1.31 [SECURITY] Apr 27, 2026
@renovate renovate Bot reopened this Apr 27, 2026
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch 2 times, most recently from ec994fa to 6dd358b Compare April 27, 2026 21:43
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from 6dd358b to ee6f19f Compare May 12, 2026 09:40
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from ee6f19f to fb63ee7 Compare July 12, 2026 09:54
@renovate
renovate Bot force-pushed the renovate/npm-nanoid-vulnerability branch from fb63ee7 to b1c4a45 Compare August 12, 2026 03:45
@renovate renovate Bot changed the title ♻️ update nanoid to v3.1.31 [SECURITY] ♻️ update nanoid to v3.3.8 [SECURITY] Aug 26, 2026
@renovate renovate Bot changed the title ♻️ update nanoid to v3.3.8 [SECURITY] ♻️ update nanoid to v3.3.12 [SECURITY] Sep 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants