uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided
Affected releases · uuid
- 13.x13.0.0Fixed in 13.0.1
- 12.x12.0.0Fixed in 12.0.1
- 11.x11.0.0 – 11.1.0Fixed in 11.1.1
- 10.x and older0.0.1 – 10.0.0No fix, no longer updated
On 13.x, the newest line:
npm install uuid@13.0.1Every release on a timeline
Not affected
14.0.0 – 14.0.3
4 releases, latest
Affected
13.0.0
1 release
Fixed
13.0.1 – 13.0.2
2 releases
Affected
12.0.0
1 release
Fixed
12.0.1
1 release
Affected
11.0.0 – 11.1.0
7 releases
Fixed
11.1.1
1 release
Affected
10.0.0
1 release
Affected
9.0.0 – 9.0.1
2 releases
Affected
8.0.0 – 8.3.2
6 releases
Affected
7.0.0 – 7.0.3
4 releases
Affected
3.0.0 – 3.4.0
9 releases
Affected
2.0.0 – 2.0.3
4 releases
Affected
1.4.0 – 1.4.2
3 releases
Affected
0.0.1 – 0.0.2
2 releases
What happens
Summary
The v3(), v5(), and v6() API methods (not uuid release versions) accept external output buffers but do not reject out-of-range writes (small buf or large offset).
By contrast, v4(), v1(), and v7() API methods explicitly throw RangeError on invalid bounds.
This inconsistency allows silent partial writes into caller-provided buffers.
Affected code
src/v35.ts(v3()/v5()path) writesbuf[offset + i]without bounds validation.src/v6.tswritesbuf[offset + i]without bounds validation.
Reproducible PoC
cd /home/StrawHat/uuid
npm ci
npm run build
node --input-type=module -e "
import {v4,v5,v6} from './dist-node/index.js';
const ns='6ba7b810-9dad-11d1-80b4-00c04fd430c8';
for (const [name,fn] of [
['v4()',()=>v4({},new Uint8Array(8),4)],
['v5()',()=>v5('x',ns,new Uint8Array(8),4)],
['v6()',()=>v6({},new Uint8Array(8),4)],
]) {
try { fn(); console.log(name,'NO_THROW'); }
catch(e){ console.log(name,'THREW',e.name); }
}"Observed:
v4() THREW RangeErrorv5() NO_THROWv6() NO_THROW
Example partial overwrite evidence captured during audit:
same true buf [ 170, 170, 170, 170, 75, 224, 100, 63 ] v6 [ 187, 187, 187, 187, 31, 19, 185, 64 ]
Security impact
Primary: integrity/robustness issue (silent partial output).
If an application assumes full UUID writes into preallocated buffers, this can produce malformed/truncated/partially stale identifiers without error.
In systems where caller-controlled offsets/buffer sizes are exposed indirectly, this may become a security-relevant logic flaw.
Suggested fix
Add the same guard used by v4()/v1()/v7():
if (offset < 0 || offset + 16 > buf.length) {
throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
}Apply to:
src/v35.ts(coversv3()andv5())src/v6.ts