## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-FELIX-PB-KFD
> Aviso rápido: não tenho a intenção de adicionar offsets para outros dispositivos e versões do iOS.
# kfd
kfd, abreviação de kernel file descriptor, é um projeto para ler e escrever memória do kernel em dispositivos Apple. Ele aproveita diversas vulnerabilidades que podem ser exploradas para obter PTEs pendentes, que serão referidas como uma primitiva PUAF, abreviação de "physical use-after-free". Em seguida, ele realoca certos objetos do kernel dentro dessas páginas fÃsicas e os manipula diretamente a partir do espaço de usuário por meio das PTEs pendentes, a fim de alcançar uma primitiva KRKW, abreviação de "kernel read/write". O código do exploit está totalmente contido em uma biblioteca, libkfd, mas o projeto também contém wrappers executáveis simples para iOS e macOS. A API pública do libkfd é bastante pequena e intuitiva:
root@kitploit:~
enum puaf_method {
puaf_physpuppet,
puaf_smith,
puaf_landa,
};
enum kread_method {
kread_kqueue_workloop_ctl,
kread_sem_open,
};
enum kwrite_method {
kwrite_dup,
kwrite_sem_open,
};
u64 kopen(u64 puaf_pages, u64 puaf_method, u64 kread_method, u64 kwrite_method);
void kread(u64 kfd, u64 kaddr, void* uaddr, u64 size);
void kwrite(u64 kfd, void* uaddr, u64 kaddr, u64 size);
void kclose(u64 kfd);
`kopen()` conceitualmente abre um "descritor de arquivo do kernel". Ela recebe os seguintes 4 argumentos:
* `puaf_pages`: O número alvo de páginas fÃsicas com PTEs pendentes.
* `puaf_method`: O método usado para obter a primitiva PUAF, com as seguintes opções:
* `puaf_physpuppet`:
* Este método explora CVE-2023-23536.
* Corrigido no iOS 16.4 e macOS 13.3.
* AcessÃvel a partir do App Sandbox, mas não do sandbox WebContent.
* Recompensa de $52,500 do Apple Security Bounty.
* `puaf_smith`:
* Este método explora CVE-2023-32434.
* Corrigido no iOS 16.5.1 e macOS 13.4.1.
* AcessÃvel a partir do sandbox WebContent e pode ter sido ativamente explorado.
* `puaf_landa`:
* Este método explora CVE-2023-41974.
* Corrigido no iOS 17.0 e macOS 14.0.
* AcessÃvel a partir do App Sandbox, mas não do sandbox WebContent.
* Recompensa de $70,000 do Apple Security Bounty.
* `kread_method`: O método usado para obter a primitiva `kread()` inicial.
* `kwrite_method`: O método usado para obter a primitiva `kwrite()` inicial.
Se o exploit for bem-sucedido, `kopen()` retorna um descritor de arquivo opaco de 64 bits. Na prática, isso é apenas um ponteiro de espaço de usuário para uma estrutura necessária ao libkfd. No entanto, como essa estrutura não deve ser acessada fora da biblioteca, ela é retornada como um inteiro opaco. Se o exploit não for bem-sucedido, a biblioteca imprimirá uma mensagem de erro, dormirá por 30 segundos e sairá com um código de status 1. Ela dorme por 30 segundos porque o kernel pode entrar em pânico na saÃda para certos métodos PUAF que exigem uma limpeza pós-KRKW (por exemplo, `puaf_smith`).
`kread()` e `kwrite()` são os equivalentes no espaço de usuário de `copyout()` e `copyin()`, respectivamente. Observe que as opções para `kread_method` e `kwrite_method` são descritas em um artigo técnico separado. Além disso, as primitivas iniciais concedidas por esses métodos podem ser usadas para construir uma primitiva KRKW melhor. Por fim, `kclose()` simplesmente fecha o descritor de arquivo do kernel. Todas elas recebem como primeiro argumento o inteiro opaco retornado por `kopen()`.
* * *
## Como compilar e executar o kfd em um iPhone?
No Xcode, abra a pasta raiz do projeto e conecte seu dispositivo iOS.
* Para compilar o projeto, selecione Product > Build (⌘B).
* Para executar o projeto, selecione Product > Run (⌘R) e depois clique no botão "kopen" no app.
* * *
## Como compilar e executar o kfd em um Mac?
Em um terminal, navegue até a pasta raiz do projeto.
Opcionalmente, para aumentar os limites global e por processo de descritores de arquivo, o que melhorará a taxa de sucesso especialmente em execuções consecutivas, execute o comando `make s` e digite a senha do sudo.
* Para compilar o projeto, execute o comando `make b`.
* Para executar o projeto, execute o comando `make r`.
* Para compilar e executar o projeto de uma só vez, execute o comando `make br`.
* * *
## Onde encontrar write-ups detalhados dos exploits?
Este README apresentou uma visão geral de alto nÃvel do projeto kfd. Depois que uma primitiva PUAF é alcançada, o restante do exploit é genérico. Portanto, extraà a parte comum dos exploits para um artigo técnico dedicado:
* Explorando PUAFs
Além disso, dividi a parte especÃfica da vulnerabilidade dos exploits usados para alcançar a primitiva PUAF em artigos técnicos distintos, listados abaixo em ordem cronológica de descoberta:
* PhysPuppet
* Smith
* Landa
No entanto, observe que esses write-ups foram escritos para um público que já está familiarizado com o sistema de memória virtual do XNU.