Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
launchd-portrep — CVE-2018-4280: Mach-Port-Ersetzungsschwachstelle in launchd auf macOS 10.13.5, die zu lokaler Privilegienausweitung und SIP-Umgehung führt. | Kitploit
Tools/GitHubGitHub/bazad/launchd-portrep
Privilege EscalationExploit-FrameworksExploitationPenetrationstestsRed TeamingBinary-Exploitation
GitHubbazad/launchd-portrep

launchd-portrep

CVE-2018-4280: Mach-Port-Ersetzungsschwachstelle in launchd auf macOS 10.13.5, die zu lokaler Privilegienausweitung und SIP-Umgehung führt.

Repository anzeigen
59610vor 7 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

launchd-portrep

launchd-portrep ist ein Exploit für eine Port-Ersetzungs-Schwachstelle in launchd, dem ersten Userspace-Prozess und Dienstverwaltungs-Daemon unter macOS. Durch das Senden einer manipulierten Mach-Nachricht an den Bootstrap-Port kann launchd dazu gebracht werden, sein Senderecht für jeden Mach-Port freizugeben, zu dem der Angreifer ebenfalls ein Senderecht besitzt. Dies ermöglicht es dem Angreifer, jeden launchd-Dienst, den er nachschlagen kann, gegenüber dem Rest des Systems zu impersonieren.

Die Schwachstelle

Launchd multiplexiert mehrere unterschiedliche Mach-Nachrichten-Handler über seinen Hauptport, darunter einen MIG-Handler für Exception-Nachrichten. Wenn ein Prozess eine mach_exception_raise- oder mach_exception_raise_state_identity-Nachricht an seinen eigenen Bootstrap-Port sendet, empfängt und verarbeitet launchd diese Nachricht als Host-Level-Exception.

Leider ist die Behandlung dieser Nachrichten in launchd fehlerhaft. Wenn der Exception-Typ EXC_CRASH ist, gibt launchd die in der Nachricht gesendeten Thread- und Task-Ports frei und gibt dann KERN_FAILURE aus der Service-Routine zurück, wodurch das MIG-System die Thread- und Task-Ports erneut freigibt. (Die Annahme ist: Wenn eine Service-Routine Erfolg zurückgibt, hat sie das Eigentum an allen Ressourcen in der Mach-Nachricht übernommen; gibt die Service-Routine einen Fehler zurück, hat sie keinerlei Eigentum an den Ressourcen übernommen.)

Hier ist der Code aus launchds Service-Routine für mach_exception_raise-Nachrichten, dekompiliert mit IDA/Hex-Rays und leicht bearbeitet für die Lesbarkeit:

kern_return_t __fastcall
catch_mach_exception_raise(                             // (a) Die Service-Routine wird
        mach_port_t           exception_port,           //     mit Werten direkt aus der
        mach_port_t           thread,                   //     vom Client gesendeten
        mach_port_t           task,                     //     Mach-Nachricht aufgerufen.
        unsigned int          exception,                //     Die Thread- und Task-Ports
        mach_exception_data_t code,                     //     könnten beliebige Senderechte
        unsigned int          codeCnt)                  //     sein.
{
    kern_return_t kr;      // eax@1 MAPDST
    kern_return_t result;  // eax@10
    int pid;               // [rsp+14h] [rbp-43Ch]@1
    char codes_str[1024];  // [rsp+20h] [rbp-430h]@5
    __int64 __stack_guard; // [rsp+420h] [rbp-30h]@1

    __stack_guard = *__stack_chk_guard_ptr;
    pid = -1;
    kr = pid_for_task(task, &pid);
    if ( kr )
    {
        _os_assumes_log(kr);
        _os_avoid_tail_call();
    }
    if ( codeCnt )
    {
        do
        {
            __snprintf_chk(codes_str, 0x400uLL, 0, 0x400uLL, "0x%llx", *code);
            ++code;
            --codeCnt;
        }
        while ( codeCnt );
    }
    launchd_log_2(
        0LL,
        3LL,
        "Host-level exception raised: pid = %d, thread = 0x%x, "
            "exception type = 0x%x, codes = { %s }",
        pid,
        thread,
        exception,
        codes_str);
    kr = deallocate_mach_port(thread);                  // (b) Der "thread"-Port, der in der
    if ( kr )                                           //     Nachricht gesendet wurde, wird
    {                                                   //     freigegeben.
        _os_assumes_log(kr);
        _os_avoid_tail_call();
    }
    kr = deallocate_mach_port(task);                    // (c) Der "task"-Port, der in der
    if ( kr )                                           //     Nachricht gesendet wurde, wird
    {                                                   //     freigegeben.
        _os_assumes_log(kr);
        _os_avoid_tail_call();
    }
    result = 0;
    if ( *__stack_chk_guard_ptr == __stack_guard )
    {
        LOBYTE(result) = exception == 10;               // (d) Wenn der Exception-Typ 10
        result *= 5;                                    //     (EXC_CRASH) ist, wird ein
    }                                                   //     Fehler KERN_FAILURE
    return result;                                      //     zurückgegeben. MIG wird die
}                                                       //     Ports erneut freigeben.

Diese doppelte Freigabe der Portnamen ist problematisch, da ein Prozess beliebige Ports als Task- und Thread-Ports in der Exception-Nachricht setzen kann. Launchd überprüft nicht, ob die empfangenen Senderechte tatsächlich einem Thread und einem Task entsprechen; die Ports könnten beispielsweise Senderechte auf Ports sein, die sich bereits im IPC-Raum von launchd befinden. Dann würde die doppelte Freigabe tatsächlich dazu führen, dass launchd einen Benutzerverweis auf einen seiner eigenen Ports fallen lässt.

Dieser Fehler kann ausgenutzt werden, um launchds Senderecht auf jeden Mach-Port freizugeben, zu dem der angreifende Prozess ebenfalls ein Senderecht besitzt. Insbesondere, wenn der angreifende Prozess einen Systemdienst über launchd nachschlagen kann, kann er launchds Senderecht auf diesen Dienst freigeben und dann den Dienst gegenüber dem Rest des Systems impersonieren. Danach gibt es viele verschiedene Wege, um Systemprivilegien zu erlangen.

Exploit-Strategie zum Erhalt von task_for_pid-allow

Dieser Fehler ist eine weniger allgemeine Version von CVE-2016-7637, einem Problem mit der Handhabung von Mach-Port-Benutzerverweisen in XNU, das von Ian Beer entdeckt wurde und es Prozessen ermöglichte, Mach-Ports in anderen Prozessen freizugeben. Ian Beer nutzte diese Schwachstelle unter macOS aus, indem er launchds Senderecht auf den Endpunkt von com.apple.CoreServices.coreservicesd ersetzte und coreservicesd gegenüber dem Rest des Systems impersonierte. Coreservicesd ist ein attraktives Ziel, da es einer der wenigen Dienste ist, an die Clients ihren Task-Port in einer Mach-Nachricht senden. Indem er launchds Senderecht auf coreservicesd durch seinen eigenen Port ersetzte und dann privilegierte Clients auslöste, coreservicesd nachzuschlagen und mit ihm zu kommunizieren, konnte er den Task-Port für einen privilegierten Prozess erhalten und dann Code in diesem Prozess ausführen.

Tool herunterladen