CVE-2026-47121

Source
https://cve.org/CVERecord?id=CVE-2026-47121
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-47121.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-47121
Aliases
Published
2026-07-21T13:53:05.030Z
Modified
2026-07-25T03:56:29.612234896Z
Severity
  • 6.1 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:H/A:N CVSS Calculator
Summary
Sparkle: Binary delta apply intermediate-symlink traversal in malicious .delta
Details

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.

Database specific
{
    "cna_assigner": "GitHub_M",
    "cwe_ids": [
        "CWE-22",
        "CWE-59"
    ],
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/47xxx/CVE-2026-47121.json"
}
References

Affected packages

Git / github.com/sparkle-project/sparkle

Affected ranges

Type
GIT
Repo
https://github.com/sparkle-project/sparkle
Events
Introduced
0 Unknown introduced commit / All previous commits are affected
Fixed
Database specific
{
    "source": [
        "AFFECTED_FIELD",
        "REFERENCES"
    ],
    "extracted_events": [
        {
            "introduced": "0"
        },
        {
            "fixed": "2.9.2"
        }
    ]
}

Affected versions

1.*
1.10.0
1.10.0rc1
1.11.0
1.11.0rc1
1.11.0rc2
1.12.0
1.12.0a1
1.12.0a2
1.12.0a3
1.14.0rc1
1.6.0
1.6.1
1.7.0
1.7.1
1.8.0
1.9.0
1.9.0rc1
2.*
2.0.0
2.0.0-beta.1
2.0.0-beta.2
2.0.0-beta.3
2.0.0-beta.4
2.0.0-beta.5
2.0.0-beta.6
2.0.0-rc.1
2.1.0
2.1.0-beta.1
2.1.0-beta.2
2.2.0
2.2.0-beta.1
2.2.0-beta.2
2.2.1
2.3.0
2.3.0-beta.1
2.3.0-beta.2
2.4.0
2.4.0-beta.1
2.4.0-beta.2
2.4.1
2.4.1-beta.1
2.4.2
2.5.0
2.5.0-beta.1
2.5.0-beta.2
2.5.1
2.6.0
2.6.0-beta.1
2.6.0-beta.2
2.6.1
2.6.2
2.7.0
2.7.0-beta.1
2.8.0
2.8.0-beta.1
2.8.0-beta.2
2.8.0-beta.3
2.9.0
2.9.0-beta.1
2.9.0-beta.2
2.9.1
sparkle-1.*
sparkle-1.5b1
sparkle-1.5b2
sparkle-1.5b3
sparkle-1.5b4
sparkle-1.5b5
sparkle-1.5b6

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-47121.json"