
Exploit de prova de conceito para CVE-2020-27949, demonstrando leitura/escrita arbitrária de memória em processos macOS através de DTrace fasttrap ioctl sem permissões elevadas.
O dispositivo /dev/fasttrap para criar nós de trap em processos de espaço de usuário para os provedores pid e objc tem as permissões 666. Em contraste com /dev/dtrace, que também é 666, o fasttrap não possui uma verificação de permissão. Isso permite que qualquer processo emita um ioctl FASTTRAPIOC_MAKEPROBE ou FASTTRAPIOC_GETINSTR.
Um atacante pode criar probes em qualquer outro processo para qualquer localização de memória usando FASTTRAPIOC_MAKEPROBE. Na ativação desses probes, os valores na localização de memória especificada são substituídos por uma instrução de trap (0xCC em x86) e o valor original é colocado em uma memória sombra. Recuperar o valor original é possível com o ioctl FASTTRAPIOC_GETINSTR. Isso permite que o atacante leia memória arbitrária de outro processo colocando múltiplos traps.
Esta vulnerabilidade é rastreada como CVE-2020-27949, corrigida no macOS Big Sur 11.1, Security Update 2020-001 Catalina, Security Update 2020-007 Mojave.
0xCC em x86) em qualquer localização de memória de outros processos executados sob DTrace sem permissões elevadas. É possível até mesmo escrever memória em processos executados como root. Como parte de outras instruções ou endereços de salto, o fluxo de controle da vítima pode ser alterado, permitindo escalada de privilégios.Como usuário, espero que habilitar o DTrace permita apenas que processos com permissões de root possam rastrear, instrumentar ou modificar outros processos. O DTrace é uma ferramenta valiosa para tarefas administrativas, oferecendo ferramentas como dtruss, iotop, etc.
Nossa vítima (target) é um executável rodando como root. O atacante (memaccess) é um executável rodando com permissões de usuário comum. O script de rastreamento libc_monitor.d registra o número de chamadas para funções no objeto compartilhado libsystem_c.dylib (este é apenas um exemplo simples de um script administrativo que o proprietário da máquina pode executar).
libc_monitor.d).FASTTRAPIOC_GETINSTR para ler os valores de memória dos probes criados.O passo 4 substitui a memória no processo vítima pelo valor da instrução de trap. Dependendo da aplicação, um atacante pode usar isso para escrever um valor previamente conhecido em uma localização crítica de memória. Por exemplo, o atacante poderia controlar a semente de um RNG ou substituir chaves criptográficas em um processo.
Nota: O atacante nunca requer permissões elevadas ou de root.
Nota 2: Scripts DTrace escritos pelo próprio não são necessários. Por exemplo, dapptrace também usa o provedor pid para rastrear qualquer função.
Implementar verificações de privilégio em /dev/fasttrap como em /dev/dtrace ou remover a permissão de escrita mundial.
Nota: Não verificamos a correção lançada.
target e siga as instruções na tela