Como verificar que o Comoji nunca envia o que você digita para lugar nenhum
O Comoji adiciona autocompletar de :emoji: estilo Slack, de graça, a todos os apps do seu Mac.
O Comoji pede Acessibilidade e Monitoramento de Entrada, as duas permissões mais invasivas do macOS. Dizemos que tudo é processado localmente e que nada do que você digita é enviado. Alguém no Reddit resumiu bem a objeção óbvia: a pessoa em geral acreditava em nós, mas ainda parecia estranho conceder essas permissões só com base na nossa palavra.
É uma objeção justa, e a resposta não deveria ser “confie mais em nós”. Este post é o passo a passo: todos os comandos abaixo são somente leitura, levam uns cinco minutos e permitem confirmar na sua própria máquina o que o Comoji faz e não faz na rede. A versão de referência de tudo isso, incluindo a lista completa de hosts, está na página de segurança.
O que você está verificando de fato
Um keylogger precisa fazer alguma coisa com o que captura. Ele envia para algum lugar ou grava em algum lugar. Essa é uma afirmação pequena e concreta de testar, e o macOS traz as ferramentas para isso: você pode listar todos os sockets de rede que um processo tem abertos, contar cada byte que ele enviou, ler os hostnames embutidos no binário que foi distribuído e bloquear totalmente o acesso dele à rede para ver o que quebra.
Nada aqui é específico do Comoji. Use exatamente os mesmos passos em qualquer app de Mac que peça essas permissões, incluindo o nosso. Essa é a ideia.
Antes de começar
Deixe o Comoji rodando e abra o Terminal (Applications → Utilities → Terminal). Todos os comandos abaixo são inspeções somente leitura: nada é instalado, alterado ou apagado. Se você instalou uma versão de desenvolvimento, o processo se chama ComojiDev e você deve usar esse nome em todo lugar onde aparece Comoji.
Primeiro, confirme que ele está rodando e descubra o ID do processo:
pgrep -x ComojiVocê deve receber um número. Se não aparecer nada, o Comoji não está rodando (é um app de barra de menus, então procure na barra de menus, não no Dock).
Passo 1: observe as conexões de rede enquanto você digita
O lsof lista arquivos abertos, e em um sistema Unix um socket de rede é um arquivo. Restrito ao ID do processo do Comoji, ele mostra todas as conexões que o app tem abertas neste momento:
lsof -nP -i -a -p "$(pgrep -x Comoji)"O resultado esperado é nenhuma saída. Uma resposta vazia significa que o processo não tem nenhuma conexão de rede. Agora vá digitar: abra o Mensagens, dispare alguns autocompletares :fire, :tada e :liz, escreva um ou dois parágrafos e rode o comando de novo. Continua vazio.
Em tese, uma única foto instantânea poderia deixar passar uma conexão que abre e fecha entre as verificações, então observe continuamente. Cole isto em uma janela extra do Terminal e deixe rodando enquanto usa o Mac normalmente:
while :; do
printf '%s ' "$(date +%T)"
lsof -nP -i -a -p "$(pgrep -x Comoji)" | tail -n +2 | awk '{print $9}' | paste -sd' ' -
echo
sleep 2
doneVocê recebe um horário a cada dois segundos sem nada depois dele, não importa quanto você digite. Aperte Control-C para parar.
Depois, com esse loop ainda rodando, faça algo que *deveria* usar a rede: digite /gif no Mensagens e busque alguma coisa. Agora você vai ver api.giphy.com e um host de CDN do giphy.com aparecerem ao lado dos horários. Esse contraste é a parte útil do teste. Ele prova que o loop teria mostrado uma conexão se houvesse uma, então as linhas vazias enquanto você digitava significam exatamente o que parecem significar.
Passo 2: conte os bytes
O nettop acompanha o tráfego acumulado por processo, então pega qualquer coisa breve demais para uma verificação por amostragem:
nettop -P -p "$(pgrep -x Comoji)"Deixe aberto, digite por alguns minutos e fique longe dos seletores /gif e /sticker. As colunas bytes_in e bytes_out continuam em zero. Aperte q para sair.
Passo 3: leia os hostnames do app que você baixou
Um processo só consegue se conectar a lugares que conhece, e os hostnames precisam estar guardados no binário. O strings extrai texto legível de um arquivo compilado, então você pode listá-los sem nenhum código-fonte:
strings -a /Applications/Comoji.app/Contents/MacOS/Comoji \
| grep -Eo 'https?://[A-Za-z0-9._-]+' | sort -u
/usr/libexec/PlistBuddy -c 'Print :SUFeedURL' \
/Applications/Comoji.app/Contents/Info.plistO que aparece é a CDN de artes de stickers do Google (fonts.gstatic.com), o feed de atualizações no Firebase Storage (storage.googleapis.com) e um punhado de endereços do comoji.io e de outros projetos que só são entregues ao seu navegador quando você clica em um link no app.
Duas ressalvas honestas, para que isto corresponda ao que você realmente vê, e não a uma versão arrumadinha. O api.giphy.com é montado a partir do hostname no código, e não guardado como URL completa, então não vai aparecer nessa primeira lista; procure-o diretamente com strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com', um padrão que só casa com hostnames e por isso não imprime a chave de API que também vem no pacote. E o framework de atualização Sparkle, incluído no app, traz as próprias URLs de documentação (sparkle-project.org, andymatuschak.org) dentro de Contents/Frameworks, que são strings de uma biblioteca de terceiros, não hosts que o Comoji contata.
Passo 4: bloqueie e veja o que quebra
Este é o teste mais forte, porque não depende de confiar em nenhuma saída. Instale um firewall de saída: o LuLu é grátis e de código aberto, e o Little Snitch é a opção comercial veterana. Configure-o para alertar sobre toda conexão de saída e então negue tudo vindo do Comoji, permanentemente.
O autocompletar de emoji continua funcionando exatamente como antes, indefinidamente, porque nunca precisou da rede. As únicas coisas que param são a verificação de atualizações e o download de artes de stickers ou GIFs que ainda não estão em cache. Se a promessa de ser local fosse falsa, é aqui que ela desmoronaria, e de forma bem visível.
Passo 5: confirme que o app é mesmo nosso
Tudo acima testa a cópia que está no seu disco. Vale confirmar que essa cópia é a que a Apple notarizou e que ninguém a modificou desde então:
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.appO codesign mostra o Developer ID com que o app foi assinado, o spctl deve responder accepted com source=Notarized Developer ID, e a lista de entitlements mostra o que o app tem permissão para fazer.
O que fazemos do nosso lado
Uma verificação que você mesmo pode fazer vale mais que uma promessa, mas a promessa também precisa ser garantida em algum lugar. Duas coisas rodam em toda build do app:
- A lista completa de hosts que o Comoji pode contatar é uma declaração no código-fonte, publicada como a superfície de rede e exibida no app em Preferências → Privacidade. Um teste automatizado faz a build falhar se o app conseguir alcançar um host que essa lista não declara.
- Um segundo teste examina o código que de fato lida com as teclas (o event tap, o buffer de tokens, o matcher e o inseridor) e faz a build falhar se qualquer API de rede ou URL remota aparecer nele. A parte do Comoji que vê o que você digita não contém nenhum código de rede, e não tem como ganhar algum às escondidas.
Essa mesma página também registra o que decidimos *não* fazer e por quê, incluindo abrir o código do caminho de entrada e contratar uma auditoria paga de terceiros, para que você possa avaliar o raciocínio em vez de adivinhá-lo.
Se você rodar qualquer um desses testes e encontrar algo que contradiga o que publicamos, escreva para support@comoji.io. Preferimos corrigir a página ou o app a deixar a promessa silenciosamente errada.
Sobre o que o app de fato faz com essas permissões, a página de recursos mostra todos os apps e sites em que o Comoji funciona e as listas para desativar por app e por site, que o mantêm quieto onde você preferir que ele nem rode.
Perguntas frequentes
Como saber se um app de Mac está enviando o que eu digito para algum lugar?
Rode lsof -nP -i -a -p "$(pgrep -x AppName)" no Terminal para listar as conexões de rede que o app tem abertas no momento, e nettop -P -p "$(pgrep -x AppName)" para ver o total de bytes enviados e recebidos. Para um teste decisivo, instale um firewall de saída como o LuLu ou o Little Snitch, bloqueie o app totalmente e veja se os recursos dele continuam funcionando.
O Comoji envia o que eu digito?
Não. O Comoji não tem conta, telemetria, analytics nem relatório de falhas. As teclas ficam em um buffer de memória de curta duração apenas para detectar um atalho iniciado por dois-pontos, e nunca são gravadas em disco nem transmitidas. O app contata exatamente quatro hosts: o feed de atualizações, a CDN de artes de stickers do Google e a API e a CDN do GIPHY quando você usa o seletor /gif.
Por que o Comoji precisa de Acessibilidade e Monitoramento de Entrada?
O Monitoramento de Entrada permite que ele perceba quando você digita um atalho como :fire. A Acessibilidade permite que ele encontre o campo de texto em foco e a posição do cursor, para que o popup apareça no lugar certo, e digite o emoji de volta nesse campo. Nenhuma das duas é usada para ler o conteúdo dos seus campos de texto, e campos de senha seguros são totalmente ignorados.
O Comoji é de código aberto?
Por enquanto, não. A página de segurança no comoji.io registra essa decisão junto com o raciocínio, publica a superfície de rede completa e traz comandos passo a passo para verificar a promessa de processamento local no binário notarizado que você baixou.
Baixe o Comoji grátis para Mac
Autocompletar de :emoji: no estilo do Slack e do Discord, em todo o seu Mac. Grátis.