b105fe3cbdafd2deea08704dd96a5fb9cc5d2ad7
原来 unzipSync 先把整包解进内存,再逐个查大小 —— 检查之前就已经解完了。 实测一个 300KB 的 zip(10 个 30MB 的全零文件)让进程 RSS 涨 455MB, 容器只有 512MB。 - 第一遍 unzipSync 的 filter 只读目录、恒返回 false,按条目头的 originalSize 累计,单个超 32MB / 总计超 128MB 就抛;第二遍才真解,而且只解 N.in / N.out / N.sql(N ≤ 500),压缩包里别的文件一律不解 - originalSize 可以造假,但 fflate 按它分配输出缓冲、不扩容(解多了只截断), 所以按它限额就是按实际内存限额 实测:同一个 zip bomb 被拦下时 RSS 只涨 1MB;单文件 300MB 的包按单文件上限拦; 正常测试点照常落盘、CRLF 照常归一、带 ../ 的条目名照常被忽略。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Languages
TypeScript
51%
Vue
47%
Shell
1%
CSS
0.6%
Dockerfile
0.4%