Vulnerability Details CVE-2026-47121
Sparkle is a software update framework for macOS. Prior to version 2.9.2, `Autoupdate/SUBinaryDeltaApply.m` enforces `relativePath.pathComponents containsObject:@".."` and rejects writes whose immediate parent directory IS itself a symbolic link, but does not detect symlinks deeper in the relative path. `Autoupdate/SPUSparkleDeltaArchive.m`'s `extractItem:` will create symlinks in the destination tree from archive content (no `..` check on the symlink target), and a subsequent `Extract` item targeting `<symlink>/foo/bar` then escapes the destination tree via `fopen(path, "wb")` because the kernel resolves the intermediate symlink during the open call. This is a defense-in-depth issue: exploitation requires a maliciously-crafted `.delta` that passes EdDSA signature verification, i.e. EdDSA private-key compromise. With the AppInstaller running as root for system-domain installs, it gives the holder of a stolen signing key arbitrary file write at root level via the delta-apply path, which is a strictly broader primitive than the "drop-in replacement bundle" install they would otherwise have. Version 2.9.2 contains a patch for the issue.
Exploit prediction scoring system (EPSS) score
EPSS Score 0.002
EPSS Ranking 13.7%
CVSS Severity
CVSS v3 Score 6.1
Products affected by CVE-2026-47121
-
cpe:2.3:a:sparkle-project:sparkle:1.10.0
-
cpe:2.3:a:sparkle-project:sparkle:1.11.0
-
cpe:2.3:a:sparkle-project:sparkle:1.11.1
-
cpe:2.3:a:sparkle-project:sparkle:1.12.0
-
cpe:2.3:a:sparkle-project:sparkle:1.13.0
-
cpe:2.3:a:sparkle-project:sparkle:1.13.1
-
cpe:2.3:a:sparkle-project:sparkle:1.14.0
-
cpe:2.3:a:sparkle-project:sparkle:1.14.2
-
cpe:2.3:a:sparkle-project:sparkle:1.14.3
-
cpe:2.3:a:sparkle-project:sparkle:1.15.0
-
cpe:2.3:a:sparkle-project:sparkle:1.15.1
-
cpe:2.3:a:sparkle-project:sparkle:1.16.0
-
cpe:2.3:a:sparkle-project:sparkle:1.17.0
-
cpe:2.3:a:sparkle-project:sparkle:1.18.0
-
cpe:2.3:a:sparkle-project:sparkle:1.18.1
-
cpe:2.3:a:sparkle-project:sparkle:1.18.2
-
cpe:2.3:a:sparkle-project:sparkle:1.19.0
-
cpe:2.3:a:sparkle-project:sparkle:1.19.1
-
cpe:2.3:a:sparkle-project:sparkle:1.20.0
-
cpe:2.3:a:sparkle-project:sparkle:1.21.0
-
cpe:2.3:a:sparkle-project:sparkle:1.21.1
-
cpe:2.3:a:sparkle-project:sparkle:1.21.2
-
cpe:2.3:a:sparkle-project:sparkle:1.21.3
-
cpe:2.3:a:sparkle-project:sparkle:1.22.0
-
cpe:2.3:a:sparkle-project:sparkle:1.23.0
-
cpe:2.3:a:sparkle-project:sparkle:1.24.0
-
cpe:2.3:a:sparkle-project:sparkle:1.25.0
-
cpe:2.3:a:sparkle-project:sparkle:1.26.0
-
cpe:2.3:a:sparkle-project:sparkle:1.27.0
-
cpe:2.3:a:sparkle-project:sparkle:1.27.1
-
cpe:2.3:a:sparkle-project:sparkle:1.27.2
-
cpe:2.3:a:sparkle-project:sparkle:1.27.3
-
cpe:2.3:a:sparkle-project:sparkle:1.6.0
-
cpe:2.3:a:sparkle-project:sparkle:1.6.1
-
cpe:2.3:a:sparkle-project:sparkle:1.7.0
-
cpe:2.3:a:sparkle-project:sparkle:1.7.1
-
cpe:2.3:a:sparkle-project:sparkle:1.8.0
-
cpe:2.3:a:sparkle-project:sparkle:1.9.0
-
cpe:2.3:a:sparkle-project:sparkle:2.0.0
-
cpe:2.3:a:sparkle-project:sparkle:2.1.0
-
cpe:2.3:a:sparkle-project:sparkle:2.2.0
-
cpe:2.3:a:sparkle-project:sparkle:2.2.1
-
cpe:2.3:a:sparkle-project:sparkle:2.2.2
-
cpe:2.3:a:sparkle-project:sparkle:2.3.0
-
cpe:2.3:a:sparkle-project:sparkle:2.3.1
-
cpe:2.3:a:sparkle-project:sparkle:2.3.2
-
cpe:2.3:a:sparkle-project:sparkle:2.4.0
-
cpe:2.3:a:sparkle-project:sparkle:2.4.1
-
cpe:2.3:a:sparkle-project:sparkle:2.4.2
-
cpe:2.3:a:sparkle-project:sparkle:2.5.0
-
cpe:2.3:a:sparkle-project:sparkle:2.5.1
-
cpe:2.3:a:sparkle-project:sparkle:2.5.2
-
cpe:2.3:a:sparkle-project:sparkle:2.6.0
-
cpe:2.3:a:sparkle-project:sparkle:2.6.1
-
cpe:2.3:a:sparkle-project:sparkle:2.6.2
-
cpe:2.3:a:sparkle-project:sparkle:2.6.3
-
cpe:2.3:a:sparkle-project:sparkle:2.6.4
-
cpe:2.3:a:sparkle-project:sparkle:2.7.0
-
cpe:2.3:a:sparkle-project:sparkle:2.7.1
-
cpe:2.3:a:sparkle-project:sparkle:2.7.2
-
cpe:2.3:a:sparkle-project:sparkle:2.7.3
-
cpe:2.3:a:sparkle-project:sparkle:2.8.0
-
cpe:2.3:a:sparkle-project:sparkle:2.8.1
-
cpe:2.3:a:sparkle-project:sparkle:2.9.0
-
cpe:2.3:a:sparkle-project:sparkle:2.9.1