Skip to content

chore(dependencies): update dependency nanoid to v3.3.12 [security] - #311

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

chore(dependencies): update dependency nanoid to v3.3.12 [security]#311
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/npm-nanoid-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Aug 6, 2024

Copy link
Copy Markdown

This PR contains the following updates:

PackageChangeAgeConfidence
nanoid3.1.203.3.12ageconfidence

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).


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):

functionfillPool(bytes){if(!pool||pool.length<bytes){// false: pool exists, -2B < pool.lengthpool=Buffer.allocUnsafe(bytes*POOL_SIZE_MULTIPLIER)crypto.getRandomValues(pool)poolOffset=0}elseif(poolOffset+bytes>pool.length){// false: poolOffset + (-2B) < pool.lengthcrypto.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(leti=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 operationconsole.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 deterministicconsole.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.

v3.1.22

Compare Source

  • Added default and browser.default to package.exports.

v3.1.21

Compare Source

  • Reduced npm package size.

Configuration

📅 Schedule: (in timezone UTC)

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

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, 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
renovateBotforce-pushed the renovate/npm-nanoid-vulnerability branch from df790c6 to 0c67eafCompareDecember 10, 2024 04:35
@renovaterenovateBot changed the title fix(dependencies): update dependency nanoid to v3.1.31 [security]fix(dependencies): update dependency nanoid to v3.3.8 [security]Dec 10, 2024
@renovate
renovateBotforce-pushed the renovate/npm-nanoid-vulnerability branch from 0c67eaf to a7c32c7CompareDecember 10, 2024 06:19
@renovaterenovateBot changed the title fix(dependencies): update dependency nanoid to v3.3.8 [security]fix(dependencies): update dependency nanoid to v3.1.31 [security]Dec 10, 2024
@renovaterenovateBot changed the title fix(dependencies): update dependency nanoid to v3.1.31 [security]chore(dependencies): update dependency nanoid to v3.1.31 [security]Sep 25, 2025
@renovaterenovateBot changed the title chore(dependencies): update dependency nanoid to v3.1.31 [security]chore(dependencies): update dependency nanoid to v3.1.31 [security] - autoclosedMar 27, 2026
@renovaterenovateBot closed this Mar 27, 2026
@renovate
renovateBot deleted the renovate/npm-nanoid-vulnerability branch March 27, 2026 00:49
@renovaterenovateBot changed the title chore(dependencies): update dependency nanoid to v3.1.31 [security] - autoclosedchore(dependencies): update dependency nanoid to v3.1.31 [security]Mar 30, 2026
@renovaterenovateBot reopened this Mar 30, 2026
@renovate
renovateBotforce-pushed the renovate/npm-nanoid-vulnerability branch 2 times, most recently from a7c32c7 to 50ee07aCompareMarch 30, 2026 17:44
@renovaterenovateBot changed the title chore(dependencies): update dependency nanoid to v3.1.31 [security]chore(dependencies): update dependency nanoid to v3.1.31 [security] - autoclosedApr 27, 2026
@renovaterenovateBot closed this Apr 27, 2026
@renovaterenovateBot changed the title chore(dependencies): update dependency nanoid to v3.1.31 [security] - autoclosedchore(dependencies): update dependency nanoid to v3.1.31 [security]Apr 27, 2026
@renovaterenovateBot reopened this Apr 27, 2026
@renovate
renovateBotforce-pushed the renovate/npm-nanoid-vulnerability branch 2 times, most recently from 50ee07a to b3c6081CompareApril 27, 2026 21:58
@renovate
renovateBotforce-pushed the renovate/npm-nanoid-vulnerability branch from b3c6081 to f335a40CompareSeptember 4, 2026 21:57
@renovaterenovateBot changed the title chore(dependencies): update dependency nanoid to v3.1.31 [security]chore(dependencies): update dependency nanoid to v3.3.12 [security]Sep 4, 2026
Sign up for freeto 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