mirror of
https://github.com/utmapp/UTM.git
synced 2026-10-12 02:24:01 +00:00
A downloaded VM archive is attacker-controlled, so an entry named `some.utm/../../elsewhere` must not be able to write outside the package it claims to belong to. The extraction path was built by substituting the archive's .utm prefix out of the entry path and appending the remainder, and `appendingPathComponent()` does not resolve `..` -- the traversal was only resolved by the filesystem at write time, landing anywhere in the app container the depth reached. Derive the relative path by dropping the prefix, and resolve every destination through a containment check before extracting. Separators are collapsed in a loop because `fopen()` and `URL.standardized` disagree on a path such as `/../elsewhere`, and a single collapse pass still lets `///../elsewhere` through. Also bump ZIPFoundation to 0.9.20 for its accumulated fixes. This file is the only call site in the tree and the deprecated failable initializer it uses is still present, so the bump is source compatible. Reported-by: Vo Duc Thang (ugvxb) Assisted-by: Claude:claude-fable-5-1