Explicação da estrutura interna do iMessage
(jjtech.dev)- O iMessage usa o APNs não apenas como um canal simples de notificações, mas como base de transmissão bidirecional, e por meio do IDS agrupa registro/consulta de chaves públicas com a preparação para entrega de mensagens
- Depois de se conectar ao APNs, o dispositivo recebe um push token e define o escopo das mensagens que irá receber filtrando o tópico do iMessage,
com.apple.madrid - O registro no IDS exige token de autenticação do Apple ID, certificado de longa duração, upload de chaves públicas de criptografia e assinatura, além do envio de validation data, o que dificulta o uso em dispositivos não Apple
- A criptografia de mensagens se divide entre o formato antigo
paire o novopair-ec, e opair-ecoferece forward secrecy com base em pre-key, de forma semelhante ao Signal - O remetente pode enviar payloads criptografados separadamente para cada destinatário ou agrupá-los, mas para que dispositivos mais novos consigam descriptografar, a chave AES precisa incluir uma tag HMAC
O APNs como base de transporte do iMessage
- Uma das camadas fundamentais do iMessage é o Apple Push Notification Service (APNs)
- É a mesma camada de serviço usada por apps da App Store para receber notificações e atualizações em tempo real mesmo quando estão fechados
- No iMessage, o APNs funciona não só para receber notificações, mas como um serviço bidirecional também usado para a transmissão de mensagens
- Quando o dispositivo se conecta ao APNs, ele recebe um push token
- Esse token é usado para rotear notificações para um dispositivo específico
- Tecnicamente, ele é diferente do token recebido pela API
application:didRegisterForRemoteNotificationsWithDeviceToken: - O token dessa API tem escopo por app e é solicitado com o bundle ID da aplicação, mas o objetivo é semelhante
- Ao enviar uma push notification para um dispositivo, também é preciso especificar o topic da mensagem
- O topic normalmente se parece com um Bundle ID
- O topic do iMessage é
com.apple.madrid
- Quando o dispositivo se conecta ao APNs, ele envia uma filter message ao servidor informando quais mensagens deseja receber
- O servidor APNs também é chamado de APNs Courier
- A filter message pode incluir uma lista de topics por estado
- O estado do topic pode ser
enabled,opertunistic,pausedoudisabled
Consultas do IDS operando sobre o APNs
- O APNs não é usado apenas para a entrega efetiva de mensagens do iMessage
- Por meio de uma camada pseudo-HTTP sobre o APNs, o IDS pode enviar consultas e receber respostas
- Para se conectar ao APNs, é necessário um certificado de cliente emitido pelo Albert activation server
IDS e o fluxo de autenticação do Apple ID
- O IDS atua como servidor de chaves do iMessage e também é usado por outros serviços, como o FaceTime
- IDS aparentemente significa IDentity Services, embora conste que não haja confirmação oficial
- Como o iMessage usa criptografia de ponta a ponta, é preciso trocar com segurança as chaves públicas de cada participante
- A primeira etapa do registro no IDS é obter um token de autenticação
- É necessário fornecer nome de usuário e senha do Apple ID à API
- O 2FA foi incorporado ao IDS API posteriormente
- No método legado, o código 2FA é anexado diretamente à senha
- No método GrandSlam, o “Anisette data” prova que é o mesmo dispositivo, evitando nova digitação do código 2FA
- Depois disso, é possível obter um Password Equivalent Token (PET) para usar como se fosse senha e código 2FA
- Depois de receber o token de autenticação, ele deve ser trocado imediatamente por um certificado de maior duração
- Esse certificado permite o registro no IDS, mas sozinho não é suficiente para fazer consultas de chaves
Registro no IDS e validation data
- A etapa mais importante da configuração do IDS é o registration
- No registration, as chaves públicas de criptografia e de assinatura são enviadas ao servidor de chaves
- Vários client data sobre os recursos suportados pelo dispositivo também são enviados
- A requisição de IDS registration exige um blob binário chamado “validation data”
- Esse é o mecanismo de validação da Apple para impedir que dispositivos não Apple usem o iMessage
- A geração do validation data usa informações como serial number, modelo e UUID do disco do dispositivo
- Nem todo validation data pode ser tratado da mesma forma
- De forma parecida com Hackintosh, a idade da conta e a “score” influenciam se um serial incorreto pode ser usado e se ocorrerá erro de “customer code” ou não
- O binário que gera o validation data é fortemente ofuscado
- O
pypushcontorna isso emulando o binário ofuscado com um carregador mach-o customizado e a Unicorn Engine - O
pypushfornece ao binário emulado propriedades do dispositivo, como o serial number, em um arquivodata.plist
- O
Consulta de chaves e session token
- Depois do registro no IDS, recebe-se um identity keypair
- Esse keypair pode ser usado para consultar chaves públicas
- Ao informar a conta que se deseja consultar, recebe-se uma lista de “identities”
- Cada identity corresponde a um dispositivo registrado naquela conta
- Ela inclui informações importantes como public key, push token e session token
- O session token é necessário para enviar mensagens ao dispositivo
- Ele serve como prova de que uma consulta foi feita recentemente
- O session token expira
- Só pode ser usado pela conta que realizou a consulta, então não pode ser compartilhado
Mensagens recebidas e formatos de criptografia
- Para receber mensagens, basta filtrar a conexão APNs por
com.apple.madride enviar um active state packet - O formato de criptografia das mensagens recebidas varia conforme as capabilities informadas no registro do IDS e a versão do iOS do dispositivo remetente
- O formato antigo, anterior ao iOS 13, é
pair - O formato novo é
pair-ec
- O formato antigo, anterior ao iOS 13, é
- O formato
pairé mais documentado e mais fácil de implementar - Diferentemente do
pair-ec, opairnão oferece forward secrecy com “pre-keys” - As mensagens podem ser descriptografadas com base em vários artigos e na implementação do
pypush - A verificação de assinatura da mensagem é opcional, mas importante para criar um cliente seguro
Formas de envio e cuidados na implementação
- O envio de mensagens é praticamente o processo inverso da recepção
- É possível enviar a mensagem individualmente para cada destinatário
- Também é possível agrupá-la em um grande bundle com vários destinatários e os payloads criptografados de cada um
- Nesse caso, o APNs faz a separação
- As mensagens são entregues a todos os participantes da conversa
- Inclusive aos outros dispositivos da própria conta
- Um detalhe frequentemente ignorado no envio é que a chave AES não é totalmente aleatória
- A chave AES vem com um HMAC anexado como tag
- Se for usada uma chave AES totalmente aleatória, a descriptografia da mensagem falha em dispositivos mais novos
Implementações relacionadas e materiais de referência
pypush: projeto open source que reimplementa o iMessage- IMFreedom Knowledge Base: iMessage: base de conhecimento sobre iMessage
- M. Frister:
pushproxy: implementação relacionada - Nicolás:
apns-dissector: ferramenta de análise do APNs - QuarkSlab: iMessage Privacy: material sobre privacidade no iMessage
- Garman et al. Chosen Ciphertext Attacks on Apple iMessage: artigo sobre ataques de texto cifrado escolhido contra o Apple iMessage
- NowSecure: Reverse Engineering iMessage: material sobre engenharia reversa do iMessage
- Elcomsoft: iMessage Security and Attachments: material sobre segurança do iMessage e anexos
- Eric Rabil’s
open-imcore: projeto relacionado - The Apple Wiki: Apple Push Notification Service: documentação relacionada ao APNs
- Mihir Bellare and Igors Stepanovs: Security under Message-Derived Keys: Signcryption in iMessage: artigo sobre signcryption no iMessage
- Apple Platform Security: How iMessage sends and receives messages securely: explicação da Apple sobre a segurança do iMessage
- Nicolás: Apple IDS payload keys: material sobre chaves de payload do Apple IDS
1 comentários
Comentários do Hacker News
Parece que a Apple vai começar a travar o iMessage com attestation (DeviceCheck)
Só que há o problema de que dispositivos antigos precisariam de uma atualização de software
Ao criar “validation data”, são usadas informações como número de série do dispositivo, modelo e UUID do disco; no caso de Hackintosh, dependendo da idade da conta e da “pontuação”, isso determina se é possível usar um número de série inválido ou se aparece um erro de “customer code”
O erro de “customer code” é, na prática, um prompt de falha de attestation da Apple; uma vez que ele aparece, é preciso entrar em contato com o Apple Support para desbloquear o Apple ID
Clientes normais passam por isso facilmente, aprovando o login em um dispositivo legítimo, mas usuários de Hackintosh enganam esse processo com técnicas de bypass
https://old.reddit.com/r/hackintosh/comments/gij9rt/getting_...
Mais do que algo que faça parte da segurança do sistema operacional inteiro, soa como um recurso que deveria entrar pelo menos no Lockdown Mode da Apple
Talvez ela veja este como um bom momento para mudar de direção rumo a mais abertura
É ótimo terem entendido o contrato, mas também fico curioso sobre a stack de infraestrutura do iMessage
Apesar da escala enorme, ele funciona tão bem, enquanto outros serviços web da Apple, como fóruns ou o portal de desenvolvedores, são cheios de bugs e parecem inacabados, o que torna isso ainda mais curioso
As notificações push de todos os apps de mensagens de terceiros também passam por ele, assim como apps que não são de mensagens mas têm notificações
Isso inclui notificações silenciosas internas. Quando você adiciona uma reunião ao Calendário no Mac, um push vai para o iPhone dizendo que os dados do iCloud mudaram e que ele deve atualizar; quando você altera um arquivo do iCloud Drive, um push é enviado para sincronizar outros dispositivos
Quando você recebe uma ligação, o Mac também toca via Continuity, e isso também é uma notificação push criptografada, como no iMessage
Fico imaginando quantas mensagens por segundo passam por esse serviço
Este é um material perfeito para o Hack Club. Seria bom participar: https://hackclub.com/
Um trabalho realmente incrível
Seria legal escrever também, de forma breve, como você entrou nessa área
No Reddit há muitos alunos do ensino médio e universitários que são bons em tecnologia, estão aprendendo programação e pensam em como conseguir um emprego técnico; essa perspectiva provavelmente seria bem útil
Graças a terminar cedo, tempos livres e fazer minhas coisas escondido quando não deveria, consegui criar e lançar um app em cerca de 6 meses, e minha produtividade era muito alta
Estou realmente curioso se o assunto pode mesmo ser
opertunisticou se é um erro de digitação do autorEsses erros de digitação que se fossilizam ao longo das gerações, como
referer, são interessantesMas não sei se isso é um erro da Apple; de todo modo, é definitivamente estranho. Aqui é preciso usar
WindowSerial, e não algo com um s a mais comoWindowsSerialhttps://github.com/JJTech0130/pypush/blob/8b33c0ee5d540d8ac7...
Há mais conteúdo relacionado: https://news.ycombinator.com/item?id=38531759
O projeto open source pypush, que serviu de base para as notícias de hoje sobre engenharia reversa do iMessage, é distribuído sob a Server Side Public License do MongoDB, e o proprietário é a Beeper
Segundo o que a JJTech disse no Discord, ela vendeu os direitos para a Beeper
A biblioteca é excelente, mas por ser uma licença copyleft muito forte, isso deve afetar onde ela pode ser usada
Dizem que os “validation data” necessários para criar uma solicitação de registro no IDS são o mecanismo pelo qual a Apple verifica que dispositivos não Apple não possam usar o iMessage; fico me perguntando se isso seria uma violação quando a DSA ou a DMA da UE entrarem em vigor
Seja qual for a forma como a Apple venha a cumprir a DSA e a DMA, não será por esse caminho
iMessage multiplataforma first-party é basicamente um sonho vazio de entusiastas de tecnologia e, pessoalmente, acho isso perfeitamente aceitável
O anúncio do Beeper Mini [1] diz claramente que o usuário pode registrar um número de telefone e trocar iMessages mesmo sem Apple ID
Também explica que o dispositivo e a Apple se comunicam diretamente
Mas este texto diz que o IDS é usado como servidor de chaves do iMessage, que a primeira etapa do registro no IDS exige obter um token de autenticação com nome de usuário e senha do Apple ID, e que, após o registro, a consulta de chaves públicas é feita usando o identity keypair recebido
Então fica a dúvida: como o app Beeper Mini registra no IDS um número de telefone arbitrário de Android com uma chave pública e ainda consulta a chave pública do destinatário sem Apple ID?
A resposta parece ser o SMS Gateway, algo quase não explicado nem no texto original nem em [1], e isso parece ser o ingrediente secreto
[1] https://blog.beeper.com/i/139416474/security-and-privacy
Trabalho realmente impressionante
Mas me incomoda a parte em que o texto diz que o formato pair antigo é mais bem documentado e mais fácil de implementar, mas não oferece forward secrecy usando “pre-keys” semelhantes às do Signal, como o novo formato pair-ec
Não sei se há evidência de que o iMessage mais recente, isto é, o que usa ECIES, realmente use pre-key
Do meu ponto de vista, parece mais que simplesmente encaixaram ECIES no lugar de RSA na parte de criptografia, talvez também na assinatura; isso por si só não cria forward secrecy
Se não houver evidência, pode ser uma interpretação incorreta da relação entre RSA, curvas elípticas e forward secrecy
O artigo da Wikipedia sobre iMessage também parece propagar o mesmo erro, e a referência citada não afirma isso de fato