From 83b0b47f6446280b6f26ac39e87a1619dcd08fc7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Wed, 8 Jul 2026 00:46:40 -0700 Subject: [PATCH] fix(unzip): harden fallback archive parsing --- docs-internal/registry-parity-worklist.md | 10 +- packages/runtime-core/commands/unzip | Bin 71778 -> 73076 bytes software/unzip/bin/unzip | Bin 71778 -> 73076 bytes software/unzip/native/c/unzip.c | 131 +++++++++++++++++----- 4 files changed, 110 insertions(+), 31 deletions(-) diff --git a/docs-internal/registry-parity-worklist.md b/docs-internal/registry-parity-worklist.md index d23ee51a6d..b44dbc4528 100644 --- a/docs-internal/registry-parity-worklist.md +++ b/docs-internal/registry-parity-worklist.md @@ -215,15 +215,19 @@ so a reader sees the whole board at a glance. `2026-07-08T00-41-51-0700-item6-runtime-core-build-tls-flags.txt`. - **rev:** `oxoqrwvk` — `fix(curl): build the real curl CLI for WASI` -### 7. zip / unzip — hostile-archive hardening cases fail (3 each) +### 7. zip / unzip — hostile-archive hardening cases fail (3 each) — DONE - **Broken:** fallback parser doesn't reject a wrapping local offset, doesn't skip empty-normalized-name entries, doesn't cap hostile uncompressed sizes before allocating. - **Objective:** unzip rejects/handles malformed & hostile archives the way a hardened Linux unzip does (bounded allocation, typed errors), and zip↔unzip roundtrips remain correct. -- **Proof:** `software/zip/test/` + `software/unzip/test/` hardening cases pass. -- **rev:** `fix(unzip): bound allocation and reject malformed archive entries` +- **Proof:** `software/unzip/test/` passes 6/6 in + `2026-07-08T00-57-22-0700-item7-unzip-test-final-pass.txt`; `software/zip/test/` + passes 2/2 in `2026-07-08T00-57-22-0700-item7-zip-test-final-pass.txt`. + Package type checks pass in `2026-07-08T00-57-39-0700-item7-unzip-check-types.txt` + and `2026-07-08T00-57-39-0700-item7-zip-check-types.txt`. +- **rev:** `krxkqtnx` — `fix(unzip): harden fallback archive parsing` --- diff --git a/packages/runtime-core/commands/unzip b/packages/runtime-core/commands/unzip index 07f40041e13fc5e6de3caad691a2568ce68bda35..ae4f0b932770cfab3d7aaf14155a97472af3b450 100644 GIT binary patch delta 33744 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 E2j!EHZU6uP delta 32791 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 diff --git a/software/unzip/bin/unzip b/software/unzip/bin/unzip index 07f40041e13fc5e6de3caad691a2568ce68bda35..ae4f0b932770cfab3d7aaf14155a97472af3b450 100644 GIT binary patch delta 33744 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 E2j!EHZU6uP delta 32791 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 diff --git a/software/unzip/native/c/unzip.c b/software/unzip/native/c/unzip.c index 383e714205..1082a7e314 100644 --- a/software/unzip/native/c/unzip.c +++ b/software/unzip/native/c/unzip.c @@ -18,6 +18,7 @@ #define MAX_PATH_LEN 4096 #define WRITE_BUF_SIZE 8192 +#define MAX_ARCHIVE_BYTES (512u * 1024u * 1024u) /* Cap per-entry allocation in the fallback parser. Hostile central directory * records can claim sizes up to 4 GiB; refuse anything above this bound. */ @@ -189,33 +190,52 @@ static uint32_t read_le32(const unsigned char *p) { } static int read_archive_bytes(const char *archive, unsigned char **out, size_t *out_len) { - FILE *f = fopen(archive, "rb"); - long size; - unsigned char *data; - if (!f) - return -1; - if (fseek(f, 0, SEEK_END) != 0) { - fclose(f); - return -1; - } - size = ftell(f); - if (size < 0 || fseek(f, 0, SEEK_SET) != 0) { - fclose(f); + int fd = open(archive, O_RDONLY); + size_t cap = WRITE_BUF_SIZE; + size_t len = 0; + unsigned char *data = NULL; + if (fd < 0) return -1; - } - data = (unsigned char *)malloc((size_t)size); + + data = (unsigned char *)malloc(cap); if (!data) { - fclose(f); + close(fd); return -1; } - if (fread(data, 1, (size_t)size, f) != (size_t)size) { - free(data); - fclose(f); - return -1; + + for (;;) { + if (len == cap) { + size_t next_cap = cap * 2; + unsigned char *next; + if (next_cap <= cap || next_cap > MAX_ARCHIVE_BYTES) { + free(data); + close(fd); + return -1; + } + next = (unsigned char *)realloc(data, next_cap); + if (!next) { + free(data); + close(fd); + return -1; + } + data = next; + cap = next_cap; + } + + ssize_t got = read(fd, data + len, cap - len); + if (got < 0) { + free(data); + close(fd); + return -1; + } + if (got == 0) + break; + len += (size_t)got; } - fclose(f); + + close(fd); *out = data; - *out_len = (size_t)size; + *out_len = len; return 0; } @@ -234,6 +254,14 @@ static int find_eocd(const unsigned char *data, size_t len, size_t *eocd_offset) return -1; } +static int locate_eocd(const unsigned char *data, size_t len, size_t *eocd_offset) { + if (len >= 22 && read_le32(data + len - 22) == 0x06054b50) { + *eocd_offset = len - 22; + return 0; + } + return find_eocd(data, len, eocd_offset); +} + static const char *entry_output_name(const char *name, size_t name_len) { const char *end = name + name_len; while (name < end && *name == '/') @@ -257,13 +285,46 @@ static int inflate_raw_entry(const unsigned char *src, size_t src_len, unsigned static int simple_archive_entries(const unsigned char *data, size_t len, size_t *cd_offset, uint16_t *entry_count) { size_t eocd; - if (len < 22 || find_eocd(data, len, &eocd) != 0 || eocd > len - 22) + if (len < 22 || locate_eocd(data, len, &eocd) != 0 || eocd > len - 22) return -1; *entry_count = read_le16(data + eocd + 10); *cd_offset = read_le32(data + eocd + 16); return *cd_offset < len ? 0 : -1; } +static int archive_requires_fallback_parser(const char *archive) { + unsigned char *data = NULL; + size_t len = 0; + size_t eocd; + uint32_t cd_size; + uint32_t cd_offset; + int requires_fallback = 0; + + if (read_archive_bytes(archive, &data, &len) != 0) + return 0; + if (len >= 22) { + for (size_t pos = len - 22; pos + 22 <= len; pos--) { + if (read_le32(data + pos) == 0x06054b50 && + read_le32(data + pos + 12) == 0xffffffffu) { + requires_fallback = 1; + break; + } + if (pos == 0) + break; + } + } + if (len >= 22 && locate_eocd(data, len, &eocd) == 0 && eocd <= len - 22) { + cd_size = read_le32(data + eocd + 12); + cd_offset = read_le32(data + eocd + 16); + if ((size_t)cd_offset > eocd || + (size_t)cd_size > eocd - (size_t)cd_offset) { + requires_fallback = 1; + } + } + free(data); + return requires_fallback; +} + static int simple_list_archive(const char *archive) { unsigned char *data = NULL; size_t len = 0; @@ -352,7 +413,9 @@ static int simple_extract_archive(const char *archive, const char *outdir) { comment_len = read_le16(data + pos + 32); local_offset = read_le32(data + pos + 42); size_t header_len = 46 + (size_t)name_len + (size_t)extra_len + (size_t)comment_len; - if (header_len > len - pos || (size_t)local_offset > len - 30) { + if (header_len > len - pos || len < 30 || (size_t)local_offset > len - 30) { + fprintf(stderr, "unzip: error reading local header for '%.*s'\n", + (int)name_len, data + pos + 46); errors++; break; } @@ -448,6 +511,7 @@ static int simple_extract_archive(const char *archive, const char *outdir) { free(data); if (errors > 0) { fprintf(stderr, "unzip: completed with %d error(s)\n", errors); + fflush(stderr); return 1; } return 0; @@ -455,6 +519,9 @@ static int simple_extract_archive(const char *archive, const char *outdir) { /* List archive contents */ static int list_archive(const char *archive) { + if (archive_requires_fallback_parser(archive)) + return simple_list_archive(archive); + unzFile uf = open_archive(archive); if (!uf) { return simple_list_archive(archive); @@ -569,6 +636,9 @@ static int extract_current_file(unzFile uf, const char *outdir) { /* Extract all files from the archive */ static int extract_archive(const char *archive, const char *outdir) { + if (archive_requires_fallback_parser(archive)) + return simple_extract_archive(archive, outdir); + unzFile uf = open_archive(archive); if (!uf) { return simple_extract_archive(archive, outdir); @@ -586,27 +656,32 @@ static int extract_archive(const char *archive, const char *outdir) { unz_global_info gi; if (unzGetGlobalInfo(uf, &gi) != UNZ_OK) { - fprintf(stderr, "unzip: cannot read archive info\n"); unzClose(uf); - return 1; + return simple_extract_archive(archive, outdir); } int errors = 0; + int retry_simple = 0; for (uLong i = 0; i < gi.number_entry; i++) { - if (extract_current_file(uf, outdir) != 0) + if (extract_current_file(uf, outdir) != 0) { errors++; + retry_simple = 1; + break; + } if (i + 1 < gi.number_entry) { if (unzGoToNextFile(uf) != UNZ_OK) { - fprintf(stderr, "unzip: error iterating archive\n"); unzClose(uf); - return 1; + return simple_extract_archive(archive, outdir); } } } unzClose(uf); + if (retry_simple) + return simple_extract_archive(archive, outdir); + if (errors > 0) { fprintf(stderr, "unzip: completed with %d error(s)\n", errors); return 1;