Vazamento de senhas (e muito mais!) no macOS
Introdução
Este texto explica a vulnerabilidade CVE-2024-54471 incluída nas atualizações de segurança da Apple. Essa vulnerabilidade foi corrigida no macOS Sequoia 15.1, macOS Sonoma 14.7.1 e macOS Ventura 13.7.1. Se você usa um dispositivo com macOS, é recomendável atualizá-lo para a versão mais recente.
O que é o kernel?
No sistema operacional, o código que se comunica com o hardware e fornece um modelo de multitarefa para os aplicativos é chamado de kernel. O kernel do macOS é o XNU, um kernel híbrido que inclui variantes do kernel BSD e do kernel Mach.
A história do Mach
O kernel Mach está profundamente entrelaçado com as guerras Unix das décadas de 1980 e 1990. O Mach começou como um projeto de pesquisa em sistemas operacionais na Carnegie Mellon University, foi usado no sistema operacional NeXTSTEP e acabou se tornando a base do macOS.
Por que Mach?
O Mach foi desenvolvido para reduzir a complexidade do design e do uso de sistemas Unix. Ele é composto por quatro abstrações básicas, que ainda hoje são usadas no macOS moderno.
Arquitetura do Mach
Quatro abstrações
- Task: o ambiente em que as threads podem ser executadas e a unidade básica de alocação de recursos.
- Thread: a unidade básica de uso da CPU, operando com um contador de programa independente dentro de uma task.
- Port: um canal de comunicação para mensagens, protegido pelo kernel.
- Message: um conjunto de objetos de dados usado na comunicação entre threads.
Tasks, ports e direitos de port
Os ports existem apenas no espaço do kernel e são expostos ao espaço do usuário como direitos de port. Várias tasks podem ter direitos de envio para um port, mas apenas uma task pode ter o direito de recebimento.
Estrutura das mensagens
Cada mensagem Mach é composta por um cabeçalho, descritores opcionais, um payload arbitrário e um trailer adicionado pelo kernel.
Como obter direitos de envio
No macOS, existe um bootstrap server, que mantém o direito de recebimento de ports para os quais todas as tasks têm direito de envio. Os clientes podem solicitar ao bootstrap server o direito de envio para um serviço Mach com um nome específico.
Mach Interface Generator (MIG)
Introdução
O MIG é uma ferramenta que gera interfaces funcionais para envio e recebimento de mensagens Mach. Ele fornece uma interface no estilo RPC baseada em mensagens, aumentando a segurança de memória.
Detalhes técnicos
O MIG funciona como um wrapper para mensagens Mach. Cada função é chamada de routine, e um conjunto de routines é chamado de subsystem. Os subsystems são indexados no campo de ID da mensagem.
Vulnerabilidades em servidores MIG
Segurança de servidores MIG
Se um servidor MIG não validar o remetente da mensagem, qualquer task com direito de envio pode chamar as routines do servidor.
Encontrando servidores MIG
É possível usar a ferramenta CLI ipsw para procurar binários que usam o símbolo NDR_record. Isso é útil para encontrar servidores e clientes MIG.
Vulnerabilidade no NetAuthAgent
Introdução ao NetAuthAgent
O NetAuthAgent é um daemon que lida com credenciais de servidores de arquivos no macOS. Antes dessa vulnerabilidade ser corrigida, ele fornecia credenciais quando as de um servidor eram solicitadas.
Como o NetAuthAgent funciona
O NetAuthAgent usa o Keychain do macOS para armazenar credenciais. O Keychain é um gerenciador centralizado de segredos, e cada item tem sua própria lista de controle de acesso.
Servidor MIG do NetAuthAgent
O NetAuthAgent expõe um servidor MIG registrado no bootstrap server com o nome com.apple.netauth.user.gui. Esse servidor oferece routines que permitem ler, criar e sobrescrever credenciais.
Impacto da vulnerabilidade
Exposição de tokens de API do iCloud
Essa vulnerabilidade expõe tokens de API do iCloud, permitindo que invasores vazem informações do usuário ou rastreiem a localização de outros dispositivos.
O que a Apple deveria ter feito
Este texto inclui uma discussão sobre quais medidas a Apple deveria ter tomado para corrigir essa vulnerabilidade.
1 comentários
Comentários do Hacker News
Texto bem escrito. Isso me lembrou o incidente de zero-day que a Apple aparentemente tentou meio que esconder. Era aquele em que era possível contornar o login de root ao “tentar senha vazia duas vezes”. Foi por volta de 2017 ou 2018
"ACLs don’t": <a href="https://waterken.sourceforge.net/aclsdont/current.pdf" rel="nofollow">https://waterken.sourceforge.net/aclsdont/current.pdf</a>
Expor um mecanismo pelo qual um processo pode encaminhar consultas ao Keychain para outro processo pode enfraquecer a segurança de todo o sistema
Houve uma pequena correção no artigo
Levou 8 horas, mas este post agora não está mais no top 5 da primeira página (agora é #27, ainda está na primeira página, mas embaixo). Obrigado por todos os comentários
Estou curioso se o autor fornece um código PoC de verdade. Quero testar as mitigações. Vi um código de exemplo, mas ele parece incompleto
Artigo muito interessante. Eu não sabia que havia tanta história por trás da criação do kernel Mach e do Darwin
No momento, o Mach parece uma fonte confiável de bugs no macOS. Sei que a Apple está se esforçando para travar tudo isso, mas fico me perguntando se existe um caminho para se afastar completamente do Mach
[morto]