
ब्लॉग पोस्ट जो macOS App Sandbox, codesign के माध्यम से entitlements, और launchd, LaunchAgents तथा quarantine attributes का उपयोग करके sandbox escape तकनीकों का अन्वेषण करती है।
macOS पर मेरे संक्रमण (transition) ब्लॉगपोस्ट श्रृंखला को जारी रखते हुए, मैं macOS ऐप सैंडबॉक्स के बारे में थोड़ी चर्चा करना चाहता हूँ।
पहले macOS App structure ब्लॉगपोस्ट पढ़ने की अत्यधिक अनुशंसा की जाती है - मैं यह मान लूँगा कि पाठक Apps और प्रोसेस (कार्यों) के बीच का अंतर जानते हैं, launchd के बारे में थोड़ा जानते हैं और ऐप लॉन्चिंग से इसका संबंध जानते हैं।
पहली बार जब मैंने macOS सैंडबॉक्स के बारे में सीखा, तो मैंने भोलेपन से एक दुर्भावनापूर्ण Word Macro बनाने की कोशिश की।
यह (अभी भी) Windows पारिस्थितिकी तंत्र में एक बहुत ही सामान्य प्रवेश वेक्टर है, इसलिए मैं देखना चाहता था कि क्या मैं केवल प्रोसेस लॉन्च कर सकता हूँ और आम तौर पर तबाही मचा सकता हूँ।
खैर, macOS पर चीज़ें इतनी आसान नहीं हैं - उदाहरण के लिए, मैं प्रोसेस चला पा रहा था, लेकिन ऐसा लगता है कि वे ज़्यादा कुछ नहीं कर सकते थे।
फ़ाइलें ड्रॉप करने पर मुझे हमेशा रहस्यमय Operation not permitted त्रुटि मिलती थी - क्या हो रहा है?
मैंने macOS और Word के बारे में थोड़ा पढ़ना शुरू किया और Adam Chester (MDSec में कार्यरत) द्वारा लिखित यह उत्कृष्ट ब्लॉगपोस्ट मिला। मैं उस ब्लॉगपोस्ट को पढ़ने की अत्यधिक अनुशंसा करता हूँ, लेकिन मैं यहाँ निष्कर्षों का सारांश दूँगा:
macOS में एक कार्यशील उपयोगिता हुआ करती थी जिसे sandbox-exec कहा जाता था, जो सैंडबॉक्स में कमांड निष्पादित करती थी। हालाँकि यह अब अप्रचलित (deprecated) हो चुकी है, फिर भी यह बहुत कुछ उजागर कर सकती थी। इसके मैनुअल पेज में आप देखते हैं कि यह एक profile लेती है, इसलिए हम यह निष्कर्ष निकाल सकते हैं कि सैंडबॉक्स नियम प्रोफ़ाइलों में बनाए रखे जाते हैं। वे प्रोफ़ाइलें विभिन्न रूपों में आ सकती हैं - फ़ाइलें, पूर्व-परिभाषित नाम या यहाँ तक कि शाब्दिक स्ट्रिंग्स के रूप में।
मैनुअल पेज यह भी बताते हैं कि डेवलपर्स को App Sandbox सुविधा का उपयोग करना चाहिए। इसके बारे में और अधिक पढ़ने पर मैंने समझा कि सैंडबॉक्स नियम बाइनरी के भीतर समाहित होते हैं, हमारे मामले में, /Application/Microsoft Word.app/Contents/MacOS/Microsoft Word के अंतर्गत रहते हैं (यदि यह आपको अजीब लगता है, तो मेरा macOS App Structure blogpost देखें)।
जबकि आप उन्हें हाथ से आसानी से निकाल सकते हैं, एक टूल का उपयोग करना सबसे अच्छा है: codesign:
```jbo@McJbo ~ % codesign -dv --entitlements - /Applications/Microsoft\ Word.app/Contents/MacOS/Microsoft\ Word
Executable=/Applications/Microsoft Word.app/Contents/MacOS/Microsoft Word
Identifier=com.microsoft.Word
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=351454 flags=0x10000(runtime) hashes=10972+7 location=embedded
Signature size=8980
Timestamp=Apr 10, 2023 at 8:09:50 AM
Info.plist entries=52
TeamIdentifier=UBF8T346G9
Runtime Version=13.1.0
Sealed Resources version=2 rules=13 files=28766
Internal requirements count=1 size=180
[Dict]
[Key] com.apple.application-identifier
[Value]
[String] UBF8T346G9.com.microsoft.Word
[Key] com.apple.developer.aps-environment
[Value]
[String] production
[Key] com.apple.developer.team-identifier
[Value]
[String] UBF8T346G9
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
...
[Key] com.apple.security.temporary-exception.files.absolute-path.read-only
[Value]
[Array]
[String] /Library/Preferences/com.microsoft.office.licensingV2.plist
[String] /Library/Application Support/Microsoft/
...
[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (allow file-read* file-write* (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~\$[^/]+$")) )
[String] (deny file-write* (subpath (string-append (param "_HOME") "/Library/Application Scripts")) (subpath (string-append (param "_HOME") "/Library/LaunchAgents")) )
[Key] com.apple.security.temporary-exception.shared-preference.read-only
[Value]
[Array]
[String] com.ThomsonResearchSoft.EndNote
...
यह बहुत कुछ समेटे हुए है, तो आइए कुछ उच्च-स्तरीय नोट्स लें:
-dv फ़्लैग का उपयोग किया, जो display और verbose के लिए है। फिर, --entitlements ऐप या बाइनरी से जुड़े एन्टाइटलमेंट्स प्रस्तुत करता है (हाँ, codesign दोनों पर काम कर सकता है)। हम एन्टाइटलमेंट्स में किसी अन्य ब्लॉगपोस्ट में गहराई से उतरेंगे, लेकिन अभी के लिए मान लें कि वे ऐप की क्षमताओं को दर्शाते हैं, और उनमें से एक बताता है कि ऐप सैंडबॉक्स्ड है (com.apple.security.app-sandbox का Boolean मान True है)।plists के बारे में मेरा प्रलाप याद है (फिर से, मेरे [macOS App Structure blogpost] में), वे संदेह कर सकते हैं कि key-value शब्दकोश किसी प्रॉपर्टी लिस्ट का प्रतिनिधित्व है, और वे सही होंगे।com.apple.security.temporary-exception.files.absolute-path.read-only उन निरपेक्ष पथों की एक सरणी (array) का उल्लेख करता है जिन्हें पढ़ने की अनुमति ऐप को है।com.apple.security.temporary-exception.sbpl के अंतर्गत रहती है, वह भी यहाँ है - यह उन कुख्यात ~$whatever.docx अस्थायी फ़ाइलों को बनाने के लिए है जिन्हें Word बहुत पसंद करता है।MDSec के 2018 के ब्लॉगपोस्ट में, जिसका मैंने पहले उल्लेख किया था, com.apple.security.temporary-exception.sbpl के अंतर्गत deny file-write* वाला भाग मौजूद नहीं था, जिससे मैक्रोज़ मनमानी सामग्री वाली फ़ाइलें जैसे /Library/LaunchAgents/~$evil.plist बना सकते थे। यह सैंडबॉक्स से बाहर क्यों निकल जाता है?
LaunchAgents और LaunchDaemons macOS में एक प्रसिद्ध (वैध) स्थायित्व (persistence) तंत्र हैं। मैंने इनका उल्लेख पहले किया है, लेकिन आप इन्हें Services के रूप में सोच सकते हैं (यदि आप Windows की दुनिया से आते हैं) - LaunchDaemons OS बूट होने पर प्रारंभ होते हैं (और इसलिए उपयोगकर्ता सत्र के बाहर रहते हैं), जबकि LaunchAgents उपयोगकर्ता के लॉग इन करने पर प्रारंभ होते हैं।
दिलचस्प बात यह है कि दोनों सरल plist फ़ाइलों में वर्णित हैं। यहाँ मेरे OneDrive अपडेटर के लिए एक उदाहरण है:
jbo@McJbo ~ % plutil -p /Library/LaunchAgents/com.microsoft.OneDriveStandaloneUpdater.plist
{
"Label" => "com.microsoft.OneDriveStandaloneUpdater"
"Program" => "/Applications/OneDrive.app/Contents/StandaloneUpdater.app/Contents/MacOS/OneDriveStandaloneUpdater"
"ProgramArguments" => [
]
"RunAtLoad" => 1
"StartInterval" => 86400
}
वे LaunchAgents और LaunchDaemons launchd द्वारा लॉन्च किए जाते हैं (वह प्रोसेस याद है?) और इसलिए यह सैंडबॉक्स से बाहर निकल जाता है, क्योंकि launchd को यह नहीं पता था कि plist किसी सैंडबॉक्स्ड प्रोसेस से ड्रॉप किया गया था या नहीं (और अगर उसे पता भी होता - तो उसे कैसे पता चलता कि कौन से सैंडबॉक्स नियम लागू करने हैं?)।