hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture
2023-09-19 23:05:35 +00:00
..
macos-ipc-inter-process-communication Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2023-09-19 23:05:35 +00:00
macos-function-hooking.md Translated to Portuguese 2023-06-06 18:56:34 +00:00
macos-kernel-extensions.md Translated ['README.md', 'backdoors/salseo.md', 'forensics/basic-forensi 2023-08-31 16:06:08 +00:00
macos-system-extensions.md Translated ['README.md', 'generic-methodologies-and-resources/pentesting 2023-07-31 17:51:15 +00:00
README.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'macos-ha 2023-09-14 00:03:14 +00:00

Kernel e Extensões do Sistema macOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Kernel XNU

O núcleo do macOS é o XNU, que significa "X is Not Unix". Este kernel é fundamentalmente composto pelo microkernel Mach (a ser discutido posteriormente) e elementos do Berkeley Software Distribution (BSD). O XNU também fornece uma plataforma para drivers de kernel através de um sistema chamado I/O Kit. O kernel XNU faz parte do projeto de código aberto Darwin, o que significa que seu código-fonte é livremente acessível.

Do ponto de vista de um pesquisador de segurança ou de um desenvolvedor Unix, o macOS pode parecer bastante similar a um sistema FreeBSD com uma GUI elegante e uma série de aplicativos personalizados. A maioria dos aplicativos desenvolvidos para o BSD irá compilar e executar no macOS sem precisar de modificações, pois as ferramentas de linha de comando familiares aos usuários do Unix estão todas presentes no macOS. No entanto, devido ao fato de o kernel XNU incorporar o Mach, existem algumas diferenças significativas entre um sistema semelhante ao Unix tradicional e o macOS, e essas diferenças podem causar problemas potenciais ou fornecer vantagens únicas.

Versão de código aberto do XNU: https://opensource.apple.com/source/xnu/

Mach

O Mach é um microkernel projetado para ser compatível com o UNIX. Um de seus princípios de design chave foi minimizar a quantidade de código em execução no espaço do kernel e, em vez disso, permitir que muitas funções típicas do kernel, como sistema de arquivos, rede e E/S, sejam executadas como tarefas de nível de usuário.

No XNU, o Mach é responsável por muitas das operações críticas de baixo nível que um kernel normalmente manipula, como escalonamento de processador, multitarefa e gerenciamento de memória virtual.

BSD

O kernel XNU também incorpora uma quantidade significativa de código derivado do projeto FreeBSD. Esse código é executado como parte do kernel junto com o Mach, no mesmo espaço de endereço. No entanto, o código do FreeBSD dentro do XNU pode diferir substancialmente do código original do FreeBSD, pois foram necessárias modificações para garantir sua compatibilidade com o Mach. O FreeBSD contribui para muitas operações do kernel, incluindo:

  • Gerenciamento de processos
  • Manipulação de sinais
  • Mecanismos básicos de segurança, incluindo gerenciamento de usuário e grupo
  • Infraestrutura de chamada de sistema
  • Pilha TCP/IP e sockets
  • Firewall e filtragem de pacotes

Compreender a interação entre o BSD e o Mach pode ser complexo, devido aos seus diferentes frameworks conceituais. Por exemplo, o BSD usa processos como sua unidade fundamental de execução, enquanto o Mach opera com base em threads. Essa discrepância é conciliada no XNU associando cada processo BSD a uma tarefa Mach que contém exatamente uma thread Mach. Quando a chamada de sistema fork() do BSD é usada, o código do BSD dentro do kernel usa funções do Mach para criar uma tarefa e uma estrutura de thread.

Além disso, o Mach e o BSD mantêm modelos de segurança diferentes: o modelo de segurança do Mach é baseado em direitos de porta, enquanto o modelo de segurança do BSD opera com base na propriedade do processo. Disparidades entre esses dois modelos ocasionalmente resultaram em vulnerabilidades de escalonamento de privilégios locais. Além das chamadas de sistema típicas, também existem armadilhas do Mach que permitem que programas de espaço de usuário interajam com o kernel. Esses diferentes elementos juntos formam a arquitetura multifacetada e híbrida do kernel do macOS.

I/O Kit - Drivers

O I/O Kit é o framework de drivers de dispositivo orientado a objetos de código aberto no kernel XNU e é responsável pela adição e gerenciamento de drivers de dispositivo carregados dinamicamente. Esses drivers permitem que código modular seja adicionado ao kernel dinamicamente para uso com diferentes hardwares, por exemplo. Eles estão localizados em:

  • /System/Library/Extensions
  • Arquivos KEXT incorporados ao sistema operacional OS X.
  • /Library/Extensions
  • Arquivos KEXT instalados por software de terceiros
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address            Size       Wired      Name (Version) UUID <Linked Against>
1  142 0                  0          0          com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2   11 0                  0          0          com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3  170 0                  0          0          com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4    0 0                  0          0          com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5  175 0                  0          0          com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6  154 0                  0          0          com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7   88 0                  0          0          com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8  106 0                  0          0          com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9    2 0xffffff8003317000 0xe000     0xe000     com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10   12 0xffffff8003544000 0x92000    0x92000    com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>

Até o número 9, os drivers listados são carregados no endereço 0. Isso significa que eles não são drivers reais, mas parte do kernel e não podem ser descarregados.

Para encontrar extensões específicas, você pode usar:

kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id

Para carregar e descarregar extensões de kernel, faça o seguinte:

kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily

IPC - Comunicação entre Processos

{% content-ref url="macos-ipc-inter-process-communication/" %} macos-ipc-inter-process-communication {% endcontent-ref %}

Extensões de Kernel do macOS

O macOS é extremamente restritivo ao carregar Extensões de Kernel (.kext) devido aos altos privilégios com os quais o código será executado. Na verdade, por padrão, é praticamente impossível (a menos que seja encontrada uma forma de contornar).

{% content-ref url="macos-kernel-extensions.md" %} macos-kernel-extensions.md {% endcontent-ref %}

Extensões de Sistema do macOS

Em vez de usar Extensões de Kernel, o macOS criou as Extensões de Sistema, que oferecem APIs de nível de usuário para interagir com o kernel. Dessa forma, os desenvolvedores podem evitar o uso de extensões de kernel.

{% content-ref url="macos-system-extensions.md" %} macos-system-extensions.md {% endcontent-ref %}

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥