macOS TCC Bypasses
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यह एक बायपास नहीं है, यह बस TCC कैसे काम करता है: यह लिखने से सुरक्षा नहीं करता। यदि टर्मिनल किसी उपयोगकर्ता के डेस्कटॉप को पढ़ने के लिए एक्सेस नहीं रखता है, तो भी यह उसमें लिख सकता है:
The extended attribute com.apple.macl
को नए file में जोड़ा जाता है ताकि creators app को इसे पढ़ने की अनुमति मिल सके।
यह संभव है कि TCC prompt के ऊपर एक विंडो रखें ताकि उपयोगकर्ता इसे बिना देखे स्वीकृत कर सके। आप TCC-ClickJacking** में एक PoC पा सकते हैं।**
हमलावर किसी भी नाम (जैसे Finder, Google Chrome...) के साथ ऐप बना सकता है Info.plist
में और इसे कुछ TCC सुरक्षित स्थानों तक पहुँचने के लिए अनुरोध करवा सकता है। उपयोगकर्ता सोचेगा कि वैध एप्लिकेशन ही इस पहुँच के लिए अनुरोध कर रहा है।
इसके अलावा, यह संभव है कि Dock से वैध ऐप को हटा दें और फर्जी ऐप को उस पर रखें, ताकि जब उपयोगकर्ता फर्जी ऐप पर क्लिक करे (जो उसी आइकन का उपयोग कर सकता है) तो यह वैध ऐप को कॉल कर सके, TCC अनुमतियों के लिए पूछ सके और एक मैलवेयर निष्पादित कर सके, जिससे उपयोगकर्ता को विश्वास हो कि वैध ऐप ने पहुँच का अनुरोध किया।
अधिक जानकारी और PoC के लिए:
macOS Privilege Escalationडिफ़ॉल्ट रूप से SSH के माध्यम से पहुँच "Full Disk Access" के साथ होती थी। इसे अक्षम करने के लिए आपको इसे सूचीबद्ध करना होगा लेकिन अक्षम करना होगा (सूची से हटाने से उन विशेषाधिकारों को नहीं हटाया जाएगा):
यहाँ आप देख सकते हैं कि कुछ मैलवेयर ने इस सुरक्षा को बायपास करने में कैसे सक्षम रहे हैं:
ध्यान दें कि अब, SSH सक्षम करने के लिए आपको Full Disk Access की आवश्यकता है
com.apple.macl
विशेषता फ़ाइलों को दी जाती है ताकि एक विशिष्ट एप्लिकेशन को इसे पढ़ने की अनुमति मिल सके। यह विशेषता तब सेट होती है जब drag&drop के माध्यम से एक फ़ाइल को एक ऐप पर खींचा जाता है, या जब एक उपयोगकर्ता double-clicks करता है एक फ़ाइल को इसे डिफ़ॉल्ट एप्लिकेशन के साथ खोलने के लिए।
इसलिए, एक उपयोगकर्ता एक दुर्भावनापूर्ण ऐप को पंजीकृत कर सकता है ताकि सभी एक्सटेंशन को संभाल सके और Launch Services को खोलने के लिए कॉल कर सके (ताकि दुर्भावनापूर्ण फ़ाइल को इसे पढ़ने की अनुमति मिल सके)।
com.apple.private.icloud-account-access
विशेषाधिकार के माध्यम से com.apple.iCloudHelper
XPC सेवा के साथ संवाद करना संभव है जो iCloud टोकन प्रदान करेगा।
iMovie और Garageband के पास यह विशेषाधिकार था और अन्य जो अनुमति देते थे।
इस विशेषाधिकार से icloud टोकन प्राप्त करने के लिए शोषण के बारे में अधिक जानकारी के लिए इस वार्ता की जाँच करें: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
एक ऐप जिसके पास kTCCServiceAppleEvents
अनुमति है, वह अन्य ऐप्स को नियंत्रित कर सकेगा। इसका मतलब है कि यह अन्य ऐप्स को दी गई अनुमतियों का दुरुपयोग कर सकता है।
Apple Scripts के बारे में अधिक जानकारी के लिए देखें:
macOS Apple Scriptsउदाहरण के लिए, यदि एक ऐप के पास iTerm
पर Automation अनुमति है, तो इस उदाहरण में Terminal
को iTerm पर पहुँच है:
Terminal, जिसे FDA नहीं है, iTerm को कॉल कर सकता है, जिसके पास यह है, और इसका उपयोग क्रियाएँ करने के लिए कर सकता है:
या यदि किसी ऐप को फ़ाइंडर पर पहुंच है, तो यह एक स्क्रिप्ट हो सकती है जैसे कि यह:
यूजरलैंड tccd daemon HOME
env वेरिएबल का उपयोग करके TCC यूजर्स डेटाबेस तक पहुँच रहा है: $HOME/Library/Application Support/com.apple.TCC/TCC.db
इस Stack Exchange पोस्ट के अनुसार और क्योंकि TCC daemon वर्तमान यूजर के डोमेन के भीतर launchd
के माध्यम से चल रहा है, इसे पास किए गए सभी environment variables को नियंत्रित करना संभव है।
इसलिए, एक हमलावर $HOME
environment वेरिएबल को launchctl
में एक नियंत्रित डायरेक्टरी की ओर सेट कर सकता है, TCC daemon को रीस्टार्ट कर सकता है, और फिर TCC डेटाबेस को सीधे संशोधित कर सकता है ताकि वह हर TCC अधिकार प्राप्त कर सके बिना अंत उपयोगकर्ता को कभी भी संकेत दिए।
PoC:
Notes को TCC संरक्षित स्थानों तक पहुंच प्राप्त थी लेकिन जब एक नोट बनाया जाता है तो यह एक गैर-संरक्षित स्थान में बनाया जाता है। इसलिए, आप नोट्स से एक संरक्षित फ़ाइल को एक नोट में कॉपी करने के लिए कह सकते हैं (तो एक गैर-संरक्षित स्थान में) और फिर फ़ाइल तक पहुंच सकते हैं:
बाइनरी /usr/libexec/lsd
जिसमें लाइब्रेरी libsecurity_translocate
थी, के पास com.apple.private.nullfs_allow
का अधिकार था जो इसे nullfs माउंट बनाने की अनुमति देता था और इसके पास com.apple.private.tcc.allow
का अधिकार था जिसमें kTCCServiceSystemPolicyAllFiles
था ताकि हर फ़ाइल तक पहुंच प्राप्त की जा सके।
"Library" में संगरोध विशेषता जोड़ना संभव था, com.apple.security.translocation
XPC सेवा को कॉल करना और फिर यह Library को $TMPDIR/AppTranslocation/d/d/Library
पर मैप करेगा जहां Library के अंदर सभी दस्तावेज़ों को एक्सेस किया जा सकता था।
Music
में एक दिलचस्प विशेषता है: जब यह चल रहा होता है, यह फ़ाइलों को ~/Music/Music/Media.localized/Automatically Add to Music.localized
में गिराए गए फ़ाइलों को उपयोगकर्ता की "मीडिया लाइब्रेरी" में आयात करेगा। इसके अलावा, यह कुछ इस तरह कॉल करता है: rename(a, b);
जहां a
और b
हैं:
a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"
b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3
यह rename(a, b);
व्यवहार एक Race Condition के प्रति संवेदनशील है, क्योंकि यह संभव है कि Automatically Add to Music.localized
फ़ोल्डर के अंदर एक नकली TCC.db फ़ाइल डाली जाए और फिर जब नया फ़ोल्डर(b) बनाया जाए तो फ़ाइल को कॉपी करें, उसे हटा दें, और इसे ~/Library/Application Support/com.apple.TCC
पर इंगित करें।
यदि SQLITE_SQLLOG_DIR="path/folder"
का अर्थ है कि कोई भी खुला db उस पथ पर कॉपी किया जाता है। इस CVE में इस नियंत्रण का दुरुपयोग किया गया था ताकि एक SQLite डेटाबेस के अंदर लिखा जा सके जो एक प्रक्रिया द्वारा TCC डेटाबेस के साथ खुला होने वाला है, और फिर SQLITE_SQLLOG_DIR
का दुरुपयोग फाइलनाम में एक symlink के साथ किया गया ताकि जब वह डेटाबेस खुला हो, उपयोगकर्ता TCC.db को ओवरराइट किया जाए।
अधिक जानकारी लेख में और बातचीत में।
यदि पर्यावरण चर SQLITE_AUTO_TRACE
सेट किया गया है, तो लाइब्रेरी libsqlite3.dylib
सभी SQL क्वेरीज़ को लॉगिंग करना शुरू कर देगी। कई अनुप्रयोगों ने इस लाइब्रेरी का उपयोग किया, इसलिए उनके सभी SQLite क्वेरीज़ को लॉग करना संभव था।
कई Apple अनुप्रयोगों ने TCC संरक्षित जानकारी तक पहुंचने के लिए इस लाइब्रेरी का उपयोग किया।
यह env variable Metal
framework द्वारा उपयोग किया जाता है जो विभिन्न कार्यक्रमों पर निर्भरता है, विशेष रूप से Music
, जिसमें FDA है।
निम्नलिखित सेट करें: MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"
। यदि path
एक मान्य निर्देशिका है, तो बग सक्रिय होगा और हम fs_usage
का उपयोग करके देख सकते हैं कि कार्यक्रम में क्या हो रहा है:
एक फ़ाइल open()
की जाएगी, जिसका नाम path/.dat.nosyncXXXX.XXXXXX
होगा (X यादृच्छिक है)
एक या अधिक write()
फ़ाइल में सामग्री लिखेंगे (हम इसे नियंत्रित नहीं करते)
path/.dat.nosyncXXXX.XXXXXX
को path/name
में renamed()
किया जाएगा
यह एक अस्थायी फ़ाइल लेखन है, जिसके बाद एक rename(old, new)
जो सुरक्षित नहीं है।
यह सुरक्षित नहीं है क्योंकि इसे पुराने और नए पथों को अलग-अलग हल करना होगा, जो कुछ समय ले सकता है और एक Race Condition के प्रति संवेदनशील हो सकता है। अधिक जानकारी के लिए आप xnu
फ़ंक्शन renameat_internal()
की जांच कर सकते हैं।
तो, मूल रूप से, यदि एक विशेषाधिकार प्राप्त प्रक्रिया एक फ़ोल्डर से नाम बदल रही है जिसे आप नियंत्रित करते हैं, तो आप एक RCE जीत सकते हैं और इसे एक अलग फ़ाइल तक पहुँच बना सकते हैं या, इस CVE में, उस फ़ाइल को खोल सकते हैं जिसे विशेषाधिकार प्राप्त ऐप ने बनाया और एक FD संग्रहीत कर सकते हैं।
यदि नाम बदलने से एक फ़ोल्डर तक पहुँचता है जिसे आप नियंत्रित करते हैं, जबकि आपने स्रोत फ़ाइल को संशोधित किया है या इसके लिए एक FD है, तो आप गंतव्य फ़ाइल (या फ़ोल्डर) को एक symlink की ओर इंगित करने के लिए बदलते हैं, ताकि आप जब चाहें लिख सकें।
यह CVE में हमला था: उदाहरण के लिए, उपयोगकर्ता के TCC.db
को अधिलेखित करने के लिए, हम कर सकते हैं:
/Users/hacker/ourlink
बनाएं जो /Users/hacker/Library/Application Support/com.apple.TCC/
की ओर इंगित करता है
निर्देशिका /Users/hacker/tmp/
बनाएं
सेट करें MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
इस env var के साथ Music
चलाकर बग को सक्रिय करें
/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
का open()
पकड़ें (X यादृच्छिक है)
यहाँ हम इस फ़ाइल को लेखन के लिए भी open()
करते हैं, और फ़ाइल डिस्क्रिप्टर को पकड़ते हैं
/Users/hacker/tmp
को /Users/hacker/ourlink
के साथ एक लूप में परमाणु रूप से स्विच करें
हम ऐसा करते हैं ताकि हमारी सफल होने की संभावनाएँ अधिकतम हो सकें क्योंकि दौड़ की खिड़की काफी संकीर्ण है, लेकिन दौड़ हारने का नुकसान नगण्य है
थोड़ा इंतज़ार करें
परीक्षण करें कि क्या हमें भाग्यशाली मिला
यदि नहीं, तो फिर से शीर्ष से चलाएँ
अधिक जानकारी https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html में है
अब, यदि आप env variable MTL_DUMP_PIPELINES_TO_JSON_FILE
का उपयोग करने की कोशिश करते हैं, तो ऐप्स लॉन्च नहीं होंगे
रूट के रूप में आप इस सेवा को सक्षम कर सकते हैं और ARD एजेंट को पूर्ण डिस्क एक्सेस होगा जिसे फिर एक उपयोगकर्ता द्वारा नए TCC उपयोगकर्ता डेटाबेस की कॉपी करने के लिए दुरुपयोग किया जा सकता है।
TCC उपयोगकर्ता के HOME फ़ोल्डर में एक डेटाबेस का उपयोग करता है ताकि उपयोगकर्ता के लिए विशिष्ट संसाधनों तक पहुँच को नियंत्रित किया जा सके $HOME/Library/Application Support/com.apple.TCC/TCC.db पर। इसलिए, यदि उपयोगकर्ता $HOME env variable को विभिन्न फ़ोल्डर की ओर इंगित करके TCC को पुनरारंभ करने में सफल होता है, तो उपयोगकर्ता /Library/Application Support/com.apple.TCC/TCC.db में एक नया TCC डेटाबेस बना सकता है और TCC को किसी भी ऐप को कोई भी TCC अनुमति देने के लिए धोखा दे सकता है।
ध्यान दें कि Apple उपयोगकर्ता के प्रोफ़ाइल में NFSHomeDirectory
विशेषता में संग्रहीत सेटिंग का उपयोग करता है $HOME
के मान के लिए, इसलिए यदि आप इस मान को संशोधित करने के लिए अनुमतियों के साथ एक एप्लिकेशन से समझौता करते हैं (kTCCServiceSystemPolicySysAdminFiles
), तो आप TCC बायपास के साथ इस विकल्प को हथियारबंद कर सकते हैं।
पहला POC dsexport और dsimport का उपयोग करता है ताकि उपयोगकर्ता के HOME फ़ोल्डर को संशोधित किया जा सके।
लक्षित ऐप के लिए एक csreq ब्लॉब प्राप्त करें।
आवश्यक पहुँच और csreq ब्लॉब के साथ एक नकली TCC.db फ़ाइल लगाएँ।
dsexport के साथ उपयोगकर्ता की Directory Services प्रविष्टि को निर्यात करें।
उपयोगकर्ता के होम डायरेक्टरी को बदलने के लिए Directory Services प्रविष्टि को संशोधित करें।
dsimport के साथ संशोधित Directory Services प्रविष्टि को आयात करें।
उपयोगकर्ता के tccd को रोकें और प्रक्रिया को पुनरारंभ करें।
दूसरे POC ने /usr/libexec/configd
का उपयोग किया जिसमें com.apple.private.tcc.allow
था जिसका मान kTCCServiceSystemPolicySysAdminFiles
था।
यह configd
को -t
विकल्प के साथ चलाना संभव था, एक हमलावर एक कस्टम बंडल लोड करने के लिए निर्दिष्ट कर सकता था। इसलिए, यह शोषण उपयोगकर्ता के होम डायरेक्टरी को बदलने के dsexport
और dsimport
विधि को configd
कोड इंजेक्शन के साथ बदलता है।
अधिक जानकारी के लिए मूल रिपोर्ट की जांच करें।
कोई प्रक्रिया के अंदर कोड इंजेक्ट करने और इसके TCC विशेषाधिकारों का दुरुपयोग करने के लिए विभिन्न तकनीकें हैं:
macOS Process Abuseइसके अलावा, TCC को बायपास करने के लिए सबसे सामान्य प्रक्रिया इंजेक्शन प्लगइन्स (लोड लाइब्रेरी) के माध्यम से पाया गया है। प्लगइन्स अतिरिक्त कोड होते हैं जो आमतौर पर लाइब्रेरी या plist के रूप में होते हैं, जिन्हें मुख्य एप्लिकेशन द्वारा लोड किया जाएगा और इसके संदर्भ में निष्पादित किया जाएगा। इसलिए, यदि मुख्य एप्लिकेशन को TCC प्रतिबंधित फ़ाइलों (अनुमतियों या अधिकारों के माध्यम से) तक पहुँच प्राप्त है, तो कस्टम कोड को भी यह प्राप्त होगा।
एप्लिकेशन /System/Library/CoreServices/Applications/Directory Utility.app
में kTCCServiceSystemPolicySysAdminFiles
का अधिकार था, लोड किए गए प्लगइन्स में .daplug
एक्सटेंशन था और सुरक्षित रनटाइम नहीं था।
इस CVE को हथियारबंद करने के लिए, NFSHomeDirectory
को बदला गया (पिछले अधिकार का दुरुपयोग करते हुए) ताकि उपयोगकर्ता के TCC डेटाबेस को कब्जा किया जा सके और TCC को बायपास किया जा सके।
अधिक जानकारी के लिए मूल रिपोर्ट की जांच करें।
बाइनरी /usr/sbin/coreaudiod
में अधिकार com.apple.security.cs.disable-library-validation
और com.apple.private.tcc.manager
थे। पहला कोड इंजेक्शन की अनुमति देता है और दूसरा इसे TCC प्रबंधित करने की अनुमति देता है।
इस बाइनरी ने तीसरे पक्ष के प्लगइन्स को फ़ोल्डर /Library/Audio/Plug-Ins/HAL
से लोड करने की अनुमति दी। इसलिए, यह संभव था कि एक प्लगइन लोड करें और इस PoC के साथ TCC अनुमतियों का दुरुपयोग करें:
For more info check the original report.
सिस्टम एप्लिकेशन जो Core Media I/O के माध्यम से कैमरा स्ट्रीम खोलते हैं (kTCCServiceCamera
के साथ ऐप्स) इन प्लगइन्स को लोड करते हैं जो /Library/CoreMediaIO/Plug-Ins/DAL
में स्थित हैं (SIP प्रतिबंधित नहीं)।
वहाँ एक सामान्य कंस्ट्रक्टर के साथ एक लाइब्रेरी को स्टोर करना कोड इंजेक्ट करने के लिए काम करेगा।
कई Apple एप्लिकेशन इस पर कमजोर थे।
Firefox एप्लिकेशन में com.apple.security.cs.disable-library-validation
और com.apple.security.cs.allow-dyld-environment-variables
अधिकार थे:
अधिक जानकारी के लिए कि इसे आसानी से कैसे शोषण करें मूल रिपोर्ट देखें।
बाइनरी /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
में com.apple.private.tcc.allow
और com.apple.security.get-task-allow
अधिकार थे, जिससे प्रक्रिया के अंदर कोड इंजेक्ट करना और TCC विशेषाधिकारों का उपयोग करना संभव था।
Telegram में com.apple.security.cs.allow-dyld-environment-variables
और com.apple.security.cs.disable-library-validation
अधिकार थे, इसलिए इसे इसके अनुमतियों तक पहुंच प्राप्त करने के लिए दुरुपयोग करना संभव था जैसे कि कैमरे के साथ रिकॉर्डिंग करना। आप लिखाई में पेलोड पा सकते हैं।
ध्यान दें कि env वेरिएबल का उपयोग करके एक लाइब्रेरी लोड करने के लिए एक कस्टम plist बनाई गई थी ताकि इस लाइब्रेरी को इंजेक्ट किया जा सके और launchctl
का उपयोग इसे लॉन्च करने के लिए किया गया था:
यह संभव है कि open
को सैंडबॉक्स में रहते हुए भी बुलाया जा सके
यह तकनीकी लोगों द्वारा उपयोग किए जाने वाले कंप्यूटरों में टर्मिनल को Full Disk Access (FDA) देना काफी सामान्य है। और इसके साथ .terminal
स्क्रिप्ट्स को बुलाना संभव है।
.terminal
स्क्रिप्ट्स plist फ़ाइलें हैं जैसे कि यह एक जिसमें CommandString
कुंजी में निष्पादित करने के लिए कमांड होता है:
एक एप्लिकेशन एक टर्मिनल स्क्रिप्ट को /tmp जैसे स्थान पर लिख सकता है और इसे इस तरह से लॉन्च कर सकता है:
कोई भी उपयोगकर्ता (यहां तक कि बिना विशेषाधिकार वाले) एक टाइम मशीन स्नैपशॉट बना और माउंट कर सकता है और उस स्नैपशॉट के सभी फ़ाइलों तक पहुंच सकता है।
आवश्यक केवल विशेषाधिकार यह है कि उपयोग किए जाने वाले एप्लिकेशन (जैसे Terminal
) को पूर्ण डिस्क एक्सेस (FDA) एक्सेस (kTCCServiceSystemPolicyAllfiles
) होना चाहिए, जिसे एक व्यवस्थापक द्वारा प्रदान किया जाना चाहिए।
एक अधिक विस्तृत व्याख्या मूल रिपोर्ट में पाई जा सकती है।
यहां तक कि अगर TCC DB फ़ाइल सुरक्षित है, तो एक नया TCC.db फ़ाइल निर्देशिका पर माउंट करना संभव था:
Check the full exploit in the original writeup.
The tool /usr/sbin/asr
allowed to copy the whole disk and mount it in another place bypassing TCC protections.
There is a third TCC database in /var/db/locationd/clients.plist
to indicate clients allowed to access location services.
The folder /var/db/locationd/
wasn't protected from DMG mounting so it was possible to mount our own plist.
In several occasions files will store sensitive information like emails, phone numbers, messages... in non protected locations (which count as a vulnerability in Apple).
This doesn't work anymore, but it did in the past:
Another way using CoreGraphics events:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)