{"id":"CVE-2026-63501","kind":"vulnerability","aliases":["CVE-2026-63501"],"related":[],"title":"ag-psd: crafted Photoshop files exhaust memory and crash parsing","description":"ag-psd is a JavaScript library for reading and writing Photoshop Document files. Prior to 31.0.3, readPsd() accepts a totalMemoryLimit for parsing untrusted PSD files, but decodeLayerImageData expects a differently named memoryLimit property and therefore passes an undefined limit to createImageDataBitDepth. An attacker who can supply a PSD to an application with layer decoding enabled can use attacker-controlled layer dimensions to trigger an allocation larger than the configured limit, causing process memory exhaustion and denial of service. The advisory also identifies inflateSync(compressed) decompressing ZIP-encoded channel data without an output-size cap, which can cause a similar denial of service through unbounded decompression. This vulnerability is fixed in 31.0.1.","summary":"ag-psd is a JavaScript library that reads and writes Photoshop PSD files. A crafted PSD with oversized layer dimensions or compressed data can make the parser allocate more memory than the configured limit, which exhausts process memory and causes denial of service.","severity":"high","cvss":7.5,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["image-processing","javascript","npm","package","psd"],"not_affected_if":["no-layer-decoding","trusted-input-only"],"how_to_check":"- Check the installed version with `npm ls ag-psd`\n- Search for `readPsd(` calls in code that handles untrusted PSD uploads\n- Check whether layer decoding is enabled in those calls","fix":"- Upgrade ag-psd to `31.0.3` or later (the description says it is fixed in 31.0.1, and the prior-to bound is 31.0.3)","status":"open","published_at":"2026-11-03T20:18:17+00:00","first_seen_at":"2026-11-03T20:49:23+00:00","triaged_at":"2026-11-03T20:50:12+00:00","updated_at":"2026-11-03T20:50:12+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-03T20:50:12Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade ag-psd to `31.0.3` or later (the description says it is fixed in 31.0.1, and the prior-to bound is 31.0.3)","reach":"internet","title":"ag-psd: crafted Photoshop files exhaust memory and crash parsing","impact":"low","summary":"ag-psd is a JavaScript library that reads and writes Photoshop PSD files. A crafted PSD with oversized layer dimensions or compressed data can make the parser allocate more memory than the configured limit, which exhausts process memory and causes denial of service.","audience":"developers","category":"package","nicknames":[],"who_cares":["javascript","npm","image-processing","psd"],"confidence":0.6,"fix_status":"available","needs_auth":"unknown","worst_case":"Attacker crashes the server process by exhausting memory.","analyst_note":"Confirm the exact fixed version: the description says 31.0.1 but also 'prior to 31.0.3'; check the release notes and patch links at github.com.","how_to_check":"- Check the installed version with `npm ls ag-psd`\n- Search for `readPsd(` calls in code that handles untrusted PSD uploads\n- Check whether layer decoding is enabled in those calls","plain_action":"","needs_analyst":true,"not_affected_if":["trusted-input-only","no-layer-decoding"],"who_is_affected":"Applications that parse PSD files supplied by untrusted users, such as upload or image-processing services, with layer decoding enabled. Apps that only read trusted local PSD files, or that never parse user uploads, can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000725,"input_tokens":4324,"output_tokens":586,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A '-63501':14A,17A '31.0.1':183C '31.0.3':85C 'accept':87C 'advisori':150C 'ag':2A,26B,70C 'ag-psd':1A,25B,69C 'alloc':53B,135C 'also':151C 'applic':120C 'attack':112C,128C 'attacker-control':127C 'cap':166C 'caus':65B,141C,169C 'channel':159C 'compress':47B,154C 'configur':58B,139C 'control':129C 'craft':4A,40B 'crash':10A 'createimagedatabitdepth':110C 'cve':12A,15A 'data':48B,160C 'decod':123C 'decodelayerimagedata':96C 'decompress':155C,177C 'denial':66B,146C,172C 'differ':99C 'dimens':45B,131C 'document':81C 'enabl':124C 'encod':158C 'exhaust':7A,61B,144C 'expect':97C 'file':6A,38B,82C,94C 'fix':181C 'identifi':152C 'imag':19B 'image-process':18B 'inflatesync':153C 'javascript':21B,30B,74C 'larger':136C 'layer':44B,122C,130C 'librari':31B,75C 'limit':59B,108C,140C 'make':50B 'memori':8A,55B,63B,143C 'memorylimit':101C 'name':100C 'npm':22B 'output':164C 'output-s':163C 'overs':43B 'packag':23B 'pars':11A,91C 'parser':52B 'pass':105C 'photoshop':5A,36B,80C 'prior':83C 'process':20B,62B,142C 'properti':102C 'psd':3A,24B,27B,37B,41B,71C,93C,117C 'read':33B,77C 'readpsd':86C 'servic':68B,148C,174C 'similar':171C 'size':165C 'suppli':115C 'therefor':104C 'totalmemorylimit':89C 'trigger':133C 'unbound':176C 'undefin':107C 'untrust':92C 'use':126C 'vulner':179C 'without':161C 'write':35B,79C 'zip':157C 'zip-encod':156C","nicknames":[],"mitigations":[],"who_affected":"Applications that parse PSD files supplied by untrusted users, such as upload or image-processing services, with layer decoding enabled. Apps that only read trusted local PSD files, or that never parse user uploads, can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["high","imageprocessing","javascript","npm","package","psd"],"campaign_type":null,"first_public_at":"2026-07-01T14:15:57+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-63501","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-63501","severity":null,"published_at":"2026-11-03T20:18:17+00:00","modified_at":"2026-11-03T20:18:17+00:00","first_seen_at":"2026-11-03T20:49:23+00:00","fetched_at":"2026-11-03T20:49:23+00:00","note":null}],"documents":[{"id":60616,"url":"https://github.com/Agamnentzar/ag-psd/commit/57ea7d865238b6b7c8a2e976bcf2a77e03116e2f","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":60617,"url":"https://github.com/Agamnentzar/ag-psd/releases/tag/31.0.3","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":60618,"url":"https://github.com/Agamnentzar/ag-psd/security/advisories/GHSA-6w3r-6hpr-hp6p","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-07-01T14:15:57+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}