XPC, wat staan vir XNU (die kernel wat deur macOS gebruik word) interproseskommunikasie, is 'n raamwerk vir kommunikasie tussen prosesse op macOS en iOS. XPC bied 'n meganisme vir die maak van veilige, asynchrone metode-oproepe tussen verskillende prosesse op die stelsel. Dit is 'n deel van Apple se veiligheidsparadigma wat die skepping van voorreg-geskeide toepassings moontlik maak waar elke komponent met slegs die toestemmings wat dit nodig het om sy werk te doen, loop, en sodoende die potensiële skade van 'n gekompromitteerde proses beperk.
XPC maak gebruik van 'n vorm van interproseskommunikasie (IPC), wat 'n stel metodes is vir verskillende programme wat op dieselfde stelsel loop om data heen en weer te stuur.
Die primêre voordele van XPC sluit in:
Veiligheid: Deur werk in verskillende prosesse te skei, kan elke proses slegs die toestemmings kry wat dit nodig het. Dit beteken dat selfs as 'n proses gekompromitteer word, dit beperkte vermoë het om skade aan te rig.
Stabiliteit: XPC help om ongelukke te isoleer tot die komponent waar dit plaasvind. As 'n proses afbreek, kan dit herbegin word sonder om die res van die stelsel te affekteer.
Prestasie: XPC maak maklike gelyktydigheid moontlik, aangesien verskillende take gelyktydig in verskillende prosesse uitgevoer kan word.
Die enigste nadeel is dat die skeiding van 'n toepassing in verskeie prosesse wat kommunikeer via XPC minder doeltreffend is. Maar in hedendaagse stelsels is dit amper onmerkbaar en die voordele is beter.
Toepassing-spesifieke XPC-diens
Die XPC-komponente van 'n toepassing is binne die toepassing self. Byvoorbeeld, in Safari kan jy hulle vind in /Applications/Safari.app/Contents/XPCServices. Hulle het die uitbreiding .xpc (soos com.apple.Safari.SandboxBroker.xpc) en is ook bundels met die hoofbinêre binne-in dit: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker en 'n Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Soos jy dalk dink, sal 'n XPC-komponent verskillende toestemmings en voorregte hê as die ander XPC-komponente of die hooftoepassingsbinêre. BEHALWE as 'n XPC-diens gekonfigureer is met JoinExistingSession wat op "True" gestel is in sy Info.plist-lêer. In hierdie geval sal die XPC-diens in dieselfde veiligheidssessie loop as die toepassing wat dit geroep het.
XPC-diens word begin deur launchd wanneer dit nodig is en afgeskakel sodra alle take voltooi is om stelselhulpbronne vry te maak. Toepassing-spesifieke XPC-komponente kan slegs deur die toepassing gebruik word, wat die risiko wat verband hou met potensiële kwesbaarhede verminder.
Stelselwye XPC-diens
Stelselwye XPC-diens is toeganklik vir alle gebruikers. Hierdie dienste, hetsy launchd of Mach-tipe, moet in plist-lêers gedefinieer word wat in gespesifiseerde gidsies soos /System/Library/LaunchDaemons, /Library/LaunchDaemons, /System/Library/LaunchAgents, of /Library/LaunchAgents geleë is.
Hierdie plist-lêers sal 'n sleutel hê met die naam MachServices met die naam van die diens, en 'n sleutel met die naam Program met die pad na die binêre lêer:
Diegene in LaunchDameons word deur root uitgevoer. As 'n onbevoorregte proses met een van hierdie kan kommunikeer, kan dit in staat wees om voorregte te verhoog.
XPC Gebeurtenisboodskappe
Toepassings kan inteken op verskillende gebeurtenisboodskappe, wat hulle in staat stel om op aanvraag geïnisieer te word wanneer sulke gebeure plaasvind. Die opstelling vir hierdie dienste word gedoen in launchd plist-lêers, wat in dieselfde gids as die voriges geleë is en 'n ekstra LaunchEvent sleutel bevat.
XPC Verbindende Prosessetoets
Wanneer 'n proses probeer om 'n metode te roep via 'n XPC-verbindig, moet die XPC-diens nagaan of daardie proses toegelaat word om te verbind. Hier is die algemene maniere om dit te toets en die algemene valstrikke:
Apple laat ook programme toe om sommige regte te konfigureer en hoe om dit te verkry, sodat as die aanroepende proses dit het, dit toegelaat sal word om 'n metode van die XPC-diens te roep:
Om die XPC-boodskappe te snuffel, kan jy xpcspy gebruik wat Frida gebruik.
# Installpip3installxpcspypip3installxpcspy--no-deps# To not make xpcspy install Frida 15 and downgrade your Frida installation# Start sniffingxpcspy-U-r-W<bundle-id>## Using filters (i: for input, o: for output)xpcspy-U<prog-name>-t'i:com.apple.*'-t'o:com.apple.*'-r
# Compile the server & clientgccxpc_server.c-oxpc_servergccxpc_client.c-oxpc_client# Save server on it's locationcpxpc_server/tmp# Load daemonsudocpxyz.hacktricks.service.plist/Library/LaunchDaemonssudolaunchctlload/Library/LaunchDaemons/xyz.hacktricks.service.plist# Call client./xpc_client# Cleansudolaunchctlunload/Library/LaunchDaemons/xyz.hacktricks.service.plistsudorm/Library/LaunchDaemons/xyz.hacktricks.service.plist/tmp/xpc_server
```bash # Compile the server & client gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
## Kliënt binne 'n Dylb-kode
In hierdie scenario sal ons 'n kliënt binne 'n Dylb-kode implementeer. Die Dylb-kode is 'n dinamiese biblioteek wat gebruik word om funksies te deel tussen verskillende toepassings. Ons sal die kliënt binne die Dylb-kode gebruik om te kommunikeer met 'n bedienersagteware wat deur die Dylb-kode verskaf word.
Hier is die stappe om 'n kliënt binne 'n Dylb-kode te implementeer:
1. Skep 'n nuwe Dylb-kodeprojek en voeg die nodige afhanklikhede by.
2. Skep 'n kliëntklas binne die Dylb-kodeprojek. Hierdie klas sal gebruik word om die bedienersagteware te kommunikeer.
3. Implementeer die nodige funksies binne die kliëntklas om die kommunikasie met die bedienersagteware te fasiliteer. Dit kan insluit die stuur van versoeke, ontvangs van antwoorde, en verwerking van data.
4. Skep 'n hoofprogram binne die Dylb-kodeprojek om die kliëntklas te instansieer en die kommunikasie met die bedienersagteware te demonstreer.
5. Bou die Dylb-kodeprojek en voeg dit by die toepassings wat die funksionaliteit van die bedienersagteware wil gebruik.
Met die kliënt binne die Dylb-kode kan toepassings nou die funksies van die bedienersagteware gebruik sonder om dit self te implementeer. Dit maak dit makliker om funksionaliteit te deel en hergebruik tussen verskillende toepassings.
```objectivec
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
// gcc injection example:
// DYLD_INSERT_LIBRARIES=oc_xpc_client.dylib /path/to/vuln/bin
#import <Foundation/Foundation.h>
@protocol MyXPCProtocol
- (void)sayHello:(NSString *)some_string withReply:(void (^)(NSString *))reply;
@end
__attribute__((constructor))
static void customConstructor(int argc, const char **argv)
{
NSString* _serviceName = @"xyz.hacktricks.svcoc";
NSXPCConnection* _agentConnection = [[NSXPCConnection alloc] initWithMachServiceName:_serviceName options:4096];
[_agentConnection setRemoteObjectInterface:[NSXPCInterface interfaceWithProtocol:@protocol(MyXPCProtocol)]];
[_agentConnection resume];
[[_agentConnection remoteObjectProxyWithErrorHandler:^(NSError* error) {
(void)error;
NSLog(@"Connection Failure");
}] sayHello:@"Hello, Server!" withReply:^(NSString *response) {
NSLog(@"Received response: %@", response);
} ];
NSLog(@"Done!");
return;
}