macOS XPC Connecting Process Check

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Sprawdzanie procesu łączącego się z XPC

Gdy nawiązywane jest połączenie z usługą XPC, serwer sprawdzi, czy połączenie jest dozwolone. Oto zwykle wykonywane sprawdzenia:

  1. Sprawdzenie, czy łączący się proces jest podpisany certyfikatem Apple (wydanym tylko przez Apple).

  • Jeśli to nie zostanie zweryfikowane, atakujący może stworzyć fałszywy certyfikat, aby dopasować się do innych sprawdzeń.

  1. Sprawdzenie, czy łączący się proces jest podpisany certyfikatem organizacji (weryfikacja identyfikatora zespołu).

  • Jeśli to nie zostanie zweryfikowane, dowolny certyfikat dewelopera od Apple może być używany do podpisania i połączenia z usługą.

  1. Sprawdzenie, czy łączący się proces zawiera właściwy identyfikator pakietu.

  • Jeśli to nie zostanie zweryfikowane, dowolne narzędzie podpisane przez tę samą organizację może być używane do interakcji z usługą XPC.

  1. (4 lub 5) Sprawdzenie, czy łączący się proces ma właściwy numer wersji oprogramowania.

  • Jeśli to nie zostanie zweryfikowane, stare, podatne klienty, podatne na wstrzykiwanie procesów, mogą być używane do połączenia z usługą XPC, nawet jeśli inne sprawdzenia są włączone.

  1. (4 lub 5) Sprawdzenie, czy łączący się proces ma zabezpieczony czas wykonania bez niebezpiecznych uprawnień (takich jak te, które pozwalają na ładowanie dowolnych bibliotek lub korzystanie z zmiennych środowiskowych DYLD)

  2. Jeśli to nie zostanie zweryfikowane, klient może być podatny na wstrzykiwanie kodu.

  3. Sprawdzenie, czy łączący się proces ma uprawnienie, które pozwala mu na połączenie się z usługą. Dotyczy to binarnych plików Apple.

  4. Weryfikacja musi być oparta na tokenie audytu klienta łączącego się zamiast na jego identyfikatorze procesu (PID), ponieważ to pierwsze zapobiega atakowi ponownego wykorzystania PID.

  • Deweloperzy rzadko korzystają z wywołania API tokena audytu, ponieważ jest ono prywatne, więc Apple może je zmienić w dowolnym momencie. Ponadto, korzystanie z prywatnego interfejsu API nie jest dozwolone w aplikacjach Mac App Store.

  • Jeśli używana jest metoda processIdentifier, może być podatna

  • Zamiast xpc_connection_get_audit_token należy używać xpc_dictionary_get_audit_token, ponieważ ta ostatnia może również być podatna w określonych sytuacjach.

Ataki komunikacyjne

Aby uzyskać więcej informacji na temat ataku ponownego wykorzystania PID, sprawdź:

pagemacOS PID Reuse

Aby uzyskać więcej informacji na temat ataku xpc_connection_get_audit_token, sprawdź:

pagemacOS xpc_connection_get_audit_token Attack

Zapobieganie atakom na obniżenie wersji Trustcache

Trustcache to metoda obronna wprowadzona w maszynach Apple Silicon, która przechowuje bazę danych CDHSAH binarnych plików Apple, dzięki czemu można uruchamiać tylko dozwolone, niezmodyfikowane wersje. Zapobiega to wykonywaniu obniżonych wersji.

Przykłady kodu

Serwer będzie implementował tę weryfikację w funkcji o nazwie shouldAcceptNewConnection.

- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
//Check connection
return YES;
}

Obiekt NSXPCConnection ma prywatną właściwość auditToken (ta, która powinna być używana, ale może się zmienić) oraz publiczną właściwość processIdentifier (ta, która nie powinna być używana).

Proces łączący można zweryfikować przy użyciu czegoś takiego jak:

[...]
SecRequirementRef requirementRef = NULL;
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
/* Check:
- Signed by a cert signed by Apple
- Check the bundle ID
- Check the TEAMID of the signing cert
- Check the version used
*/

// Check the requirements with the PID (vulnerable)
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);

// Check the requirements wuing the auditToken (secure)
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))

Jeśli programista nie chce sprawdzać wersji klienta, może przynajmniej sprawdzić, czy klient nie jest podatny na wstrzykiwanie procesu:

[...]
CFDictionaryRef csInfo = NULL;
SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo);
uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue];
const uint32_t cs_hard = 0x100;        // don't load invalid page.
const uint32_t cs_kill = 0x200;        // Kill process if page is invalid
const uint32_t cs_restrict = 0x800;    // Prevent debugging
const uint32_t cs_require_lv = 0x2000; // Library Validation
const uint32_t cs_runtime = 0x10000;   // hardened runtime
if ((csFlags & (cs_hard | cs_require_lv)) {
return Yes; // Accept connection
}
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated