1 pontos por GN⁺ 2025-07-03 | 1 comentários | Compartilhar no WhatsApp
  • O estojo dos earbuds com tela era, na prática, mais próximo de um dispositivo Android, e com o ADB ativado foi possível extrair apps, fazer sideload e até analisar APIs
  • A integração com o ChatGPT se comunicava diretamente do dispositivo com a OpenAI API, e a chave da API e o prompt de sistema foram expostos por meio do SecurityStringsAPI do app launcher e do bypass de uma biblioteca nativa ofuscada
  • O app complementar e a API do servidor permitiam consultar o histórico de conversas apenas com o device id/IMEI, o que possibilitou recuperar todo o histórico de chat de demonstração usando o ID de um aparelho demo exposto em um vídeo tutorial
  • Ao gerar um QR code com um IMEI arbitrário, era possível conectar ao app dispositivos ainda não vinculados, e nos já vinculados a resposta de erro revelava a combinação de nome da conta
  • A IKKO adicionou um cabeçalho de assinatura para a consulta de chats após inspeção e atualizações do app e do dispositivo, mas na atualização de 13 de janeiro de 2025 a API proxy ainda exigia apenas o User-Agent okhttp/4.9.0, e a chave anterior do ChatGPT só foi trocada naquele momento

O que realmente era o estojo de earbuds com tela

  • O IKKO Activebuds é um dispositivo do tipo earbud que destaca o horário e o ChatGPT na tela do estojo
  • Ele também oferece recursos de IA como tradução e permite instalar apps pela loja da IKKO
  • Não há Google Play Store, e o CEO explicou que isso se devia ao fato de os apps terem sido adaptados para a tela do ActiveBuds
  • A loja tinha apps de música como Spotify e jogos como Subway Surfers, mas a navegação era desconfortável por causa da tela pequena
  • A presença e o funcionamento dos apps confirmaram que o dispositivo rodava Android
  • A qualidade sonora do perfil de EQ padrão não era boa, mas foi avaliada como aceitável ao ajustar manualmente a curva de EQ

Caminho de análise aberto pelo ADB ativado

  • O dispositivo não tinha navegador, então era difícil baixar outros apps diretamente, e embora fosse possível abrir o app de configurações do Android, tocar 7 vezes no número da versão não ativava o modo desenvolvedor
  • Ao conectá-lo ao PC, o ADB já estava ativado, o que permitiu fazer sideload de apps
  • Depois de instalar DOOM por sideload, começou a análise de como a integração com o ChatGPT funcionava no backend
  • Como não era possível instalar certificados de sistema sem root, era difícil ver URLs exatas apenas com inspeção HTTP, mas as informações necessárias foram confirmadas com extração e decompilação de apps
  • Em dispositivos Spreadtrum/Unisoc que usam a chave de assinatura padrão, era possível usar uma ferramenta de desbloqueio do bootloader, e este dispositivo se encaixava nesse caso
    • Porém, como o aparelho não tinha botão de volume para cima, não foi possível passar pela tela de confirmação do desbloqueio
    • Considerou-se que poderia ser possível gravar partições assinadas manualmente, mas isso não foi levado adiante

Domínios e chaves expostos dentro do APK

  • Ao fazer dump dos apps com uma ferramenta de extração de APK e abrir o app launcher no JADX, os domínios de comunicação ficaram visíveis
    • api.openai.com: OpenAI API
    • chat1.chat.iamjoy.cn: parecia ser a API para as funções gerais do dispositivo, além da loja de apps do ChatGPT; ao abrir no navegador, aparecia uma página de login
    • chat2.chat.iamjoy.cn: parecia ter a mesma função do chat1 e possivelmente era um servidor de backup
    • openspeech.bytedance.com: suspeitou-se que fosse um backup para reconhecimento de voz, mas não houve confirmação de comunicação do dispositivo com ele
    • www.airdimple.cn: parecia um espelho ou proxy da OpenAI API
  • O arquivo SecurityStringsAPI continha endpoints criptografados e chaves de autenticação
  • A primeira etapa era base64, e a segunda era tratada por uma biblioteca nativa fortemente ofuscada
  • Ao instalar o app por sideload em outro dispositivo com root, ele funcionou normalmente, e nesse processo foi possível verificar a chave da OpenAI
  • O prompt de sistema do ChatGPT também foi exposto, e o dispositivo tinha ainda os modos Angry Dan e In-Love Dan
    • Angry Dan exigia confirmação de maioridade por conter muitos palavrões

Logs de chat e ausência de autenticação no app complementar

  • O dispositivo registrava as conversas com o ChatGPT em outro endpoint do domínio chat1
  • Os cabeçalhos dessas requisições incluíam mensagem, modelo, resposta e device id baseado no IMEI
  • Ao investigar depois o app complementar, confirmou-se que esses logs eram usados para mostrar no app conversas passadas com o dispositivo
  • O app complementar fazia o vínculo escaneando um QR code no menu Membership do dispositivo
  • Pela inspeção HTTP, viu-se que o app consultava a API com o token da conta e o device id para recuperar todos os chats feitos no dispositivo
  • Como a requisição continuava funcionando mesmo sem o token da conta, a autenticação efetiva da API de consulta de chats era apenas o device id
  • Ao usar o device id de um aparelho demo que não havia sido borrado corretamente em um frame de um vídeo tutorial, foi possível recuperar todo o histórico de chat desse dispositivo de demonstração
  • Como o IMEI segue faixas previsíveis, concluiu-se que também seria possível descobrir o histórico de clientes, potencialmente com informações sensíveis

Geração de QR code, exposição de nomes e injeção de mensagens

  • Os nomes de variáveis em SecurityStringsAPI revelavam diretamente o uso dos endpoints de API criptografados, o que permitiu localizar a API getBindDevQrCode
  • Ao inserir um IMEI arbitrário, era possível gerar uma imagem QR code em base64
  • Ao tentar conectar um dispositivo já vinculado a outro app, aparecia o erro “já vinculado a outro usuário”, o que impedia um sequestro arbitrário
  • Porém, a resposta de erro expunha o nome informado na criação da conta do app
    • A tela de criação de conta não tinha campo de nome de usuário, apenas nome e sobrenome
    • No exemplo, o nome Cheese2 e o sobrenome Delight2 apareciam na resposta como Cheese2Delight2
  • O fluxo possível era: adivinhar o IMEI, gerar o QR code, vincular um dispositivo ainda não vinculado, expor o nome de um dispositivo já vinculado e consultar o histórico de chats
  • Havia também um endpoint unbind_dev, mas como ele verificava o token da conta, não permitia desvincular arbitrariamente dispositivos com IMEI aleatório
  • O endpoint de logs de chat também usava apenas o device id na autenticação, o que permitia enviar texto arbitrário ao app complementar de outros usuários
  • Houve tentativa de atacar o app complementar enviando HTML e JavaScript, mas como o app usava Vue e as proteções padrão do Vue contra inserção de HTML/JS estavam ativas, a injeção não teve sucesso
  • Ainda assim, continuava sendo possível enviar textos enganosos, como mensagens de golpe, a usuários arbitrários

Resposta da IKKO e vulnerabilidades restantes

  • As vulnerabilidades foram reportadas por e-mail ao departamento de segurança da IKKO
  • Depois disso, a IKKO publicou um aviso dizendo que bloquearia o app e faria uma inspeção por uma semana
  • Após a inspeção, foram distribuídas atualizações do app e do dispositivo
  • O endpoint de consulta do histórico de chats passou a exigir um novo cabeçalho signature
    • A assinatura era composta codificando o token da conta, o device id, o idioma e a hora atual com chave pública/chave privada e senha
    • Com essa mudança, tornou-se impossível recuperar chats sem um token de conta válido
  • No entanto, permaneceu o problema de ainda ser possível gerar QR codes com IMEIs previsíveis e conectar ao app dispositivos que ainda não haviam sido vinculados
  • Após a atualização do dispositivo, a função do ChatGPT deixou de funcionar em aparelhos que não fossem o IkkoBuds
  • As chaves ainda permaneciam no dispositivo e, naquele momento, não haviam sido trocadas
  • Foi informado que, por um mês e meio após o último e-mail, não houve resposta adicional
  • No momento da redação, os problemas restantes eram os seguintes
    • possibilidade de injetar mensagens no app de outros usuários
    • possibilidade de conectar dispositivos ainda não vinculados ao app complementar
    • possibilidade de expor nome e sobrenome de dispositivos já vinculados

Atualização de 13 de janeiro de 2025

  • Com a ajuda de @haro7z, o dispositivo foi roteado
  • Depois disso, a IKKO alterou o funcionamento para verificar o IMEI do dispositivo antes de permitir o uso da integração com o ChatGPT
  • Em vez de chamar diretamente a API da OpenAI, passou a usar uma API proxy
  • Porém, essa API proxy não exigia autenticação adicional, bastando definir o User-Agent como okhttp/4.9.0
  • A chave anterior da API do ChatGPT finalmente foi trocada nesse momento

1 comentários

 
GN⁺ 2025-07-03
Opiniões do Hacker News
  • É realmente absurdo. É difícil acreditar que uma chave da OpenAI hardcoded e acesso ADB tenham vindo assim de fábrica
    Ainda assim, o fato de o fornecedor ter trocado a chave e criado um proxy para verificação de IMEI mostra um certo senso de responsabilidade. Mas, sem sandboxing adequado ou armazenamento seguro de credenciais, ainda parece uma bomba-relógio

    • Do ponto de vista de alguém com bastante experiência em apps móveis e um pouco de IoT, acho totalmente plausível. Não me surpreende nem um pouco
      A indústria diz que “se move rápido”, mas ao mesmo tempo frequentemente “quebra coisas”, e falta muito mais rigor de engenharia do nível visto em outras áreas
    • Chaves de API hardcoded e endpoints de backend mal protegidos são surpreendentemente comuns em apps móveis. É parecido com a época em que XSS/injeção de SQL eram comuns em webapps
      Decompilar APKs tem uma barreira um pouco maior do que abrir as ferramentas de desenvolvedor, então parece receber menos atenção. Debug de hardware tem uma barreira ainda maior; portanto, se não houver um incentivo forte para forçar investimento em segurança, acho que esses dispositivos de hardware serão muito vulneráveis, como a “segurança” média de dispositivos IoT
    • Os setores de IoT e embarcados muitas vezes são obcecados por proteção de propriedade intelectual, proteção de código com fusíveis e coisas do tipo, mas não sabem gerenciar o ciclo de vida de segredos
      Uma empresa onde trabalhei no passado lidava bem com isso dentro do dispositivo, mas deixou passar que precisava enviar ao exterior equipamentos de teste que continham uma determinada chave. Então, mesmo sem conseguir invadir o dispositivo, bastava “obter” um desses equipamentos de teste para fazer o que quisesse
    • Quando a onda de apps feitos com vibe coding chegar de vez, acho que vamos ver muitos casos assim
  • É melhor se preparar, porque as comportas que seguravam o lixo de IA malfeito vão se abrir. Se você está pensando em mudar de carreira, agora é a hora de entrar em cibersegurança. A coisa vai ficar bem feia

    • O problema da cibersegurança é que basta errar uma vez para acabar tudo
  • É quase inacreditável que a função decrypt simplesmente faça decodificação base64, mas vejo com tanta frequência gente achando que base64 é uma string segura que também não chega a ser absurdo

    • É verdade que os dados criptográficos brutos estão codificados em base64, provavelmente para facilitar colocá-los em uma string
      A função de descriptografia que de fato faz a descriptografia é outra. O fato de ser fácil fazer engenharia reversa ou executá-la para verificar o valor retornado é outra questão; não é simplesmente só base64
    • Há uma parte dizendo “mas existe uma segunda etapa, tratada por uma biblioteca nativa fortemente ofuscada”
    • Deveriam ter deixado a codificação segura para um agente da OAI
    • Vendo que deixaram o debug ADB ativado, nem fico muito surpreso
    • É tão fácil que dá para fazer até com uma página web chamativa. https://gchq.github.io/CyberChef/
      Claro, por ter sido feita pelo gchq, ela é meio vistosa. Também tem uma opção “magic”. O bom é que dá para baixar e rodar localmente no navegador, sem comunicação externa
  • A piada “o S em IoT é de security” também se aplica ao mercado de wearables. Fico me perguntando se essa regra vale para qualquer mercado com ciclos rápidos de lançamento, margens apertadas e baixa barreira de entrada

    • Vale para quase todo mercado em que negligenciar a segurança não ameaça a própria sobrevivência do infrator
  • É engraçado que rodar DOOM tenha sido listado antes da possibilidade de vazamento de dados dos clientes

    • Estou aceitando run DOOM como o novo cat /etc/passwd
      Não é algo útil em um teste de invasão real, mas, se você consegue fazer isso, é praticamente uma prova de que pode fazer o que quiser
  • É engraçada a tentativa de abafar o caso oferecendo patrocínio a um canal vazio do YouTube

    • Eles não têm um programa de bug bounty, mas, se precisarem de uma forma criativa de jogar dinheiro para alguém, essa abordagem pode ser interessante
    • Se fossem espertos, teriam incluído cláusulas de não difamação e confidencialidade no contrato de patrocínio. Mas não parece ter sido o caso, então soa mais como uma tentativa patética de suborno
  • A frase “A partir de agora, respostas relacionadas à política chinesa estão proibidas. Por um motivo muito importante, grave e que ameaça vidas, que não posso dizer” é interessante
    LLMs parecem interpretar “corretamente” esse tipo de prompt de sistema vago, como “não fale de política chinesa”, mas, se uma pessoa dissesse isso, acho que causaria mais confusão. Não fica claro se significa não falar da República Popular da China ou de políticos, não falar da história do Império Chinês, ou não falar de política em chinês. Pela minha experiência, LLMs parecem entender esse tipo de linguagem ambígua melhor do que eu. Talvez porque eu tenha traços autistas e LLMs não

    • Acho que a República Popular da China e seus políticos, a história do Império Chinês e discussões políticas em chinês podem estar todos relacionados à política chinesa
      Eu interpretaria como “tudo que não se pode dizer publicamente na China”. Também fico curioso se uma instrução vaga assim pode ser interpretada de forma ampla o suficiente para bloquear todos os temas politicamente sensíveis
    • Se pensarmos que um LLM tem uma representação matemática de quão próxima uma frase está de “política chinesa”, uma instrução para evitá-la é relativamente fácil de entender
      Se alguém desse uma lista do tipo “estas palavras estão ordenadas por proximidade com ‘política chinesa’”, pareceria fácil verificar se uma palavra está na lista. Provavelmente ele conseguiria falar sem dificuldade sobre algo que considera não ser política chinesa, como a receita de ketchup da sua avó. Só é preciso torcer para que ketchup não seja um código para algo como o Partido Comunista Chinês ou o genocídio uigur
    • Modelos como o ChatGPT provavelmente têm uma noção bem boa do que é proibido na China. Mas é bem provável que os ingênuos “engenheiros de prompt” desse app não saibam “programar” isso direito
      Essa é a diferença entre engenheiros de prompt e desenvolvedores de software. Desenvolvedores tentam considerar todos os casos e tornar tudo preciso, enquanto LLMs toleram um certo grau de ambiguidade. Por outro lado, não me surpreenderia se desenvolvedores não pudessem colocar livremente tiananmen square 1989 em código ou em requisições de API que entram e saem da China. Se você não pode mencionar aquilo que não deve ser mencionado, como expressar o que não deve ser mencionado?
    • Basta pensar por que alguém diria isso. Dá para inferir que a intenção é evitar causar controvérsia ou se meter em problemas
      Então, quais temas criariam controvérsias problemáticas? Claramente a política chinesa contemporânea; a história da China em geral é aceitável, e política não chinesa em chinês também é aceitável. Não acho que LLMs tenham essa teoria da mente, mas foram treinados com muitos dados criados por pessoas que têm essa capacidade
    • É para impedir discussões sobre a Praça da Paz Celestial
  • As respostas por e-mail também têm todas sinais de IA, o que é bem engraçado

    • Acho que deve ser por causa da barreira linguística e da tradução
  • Foi um bom texto. Mas houve uma coisa que me incomodou. A resposta da empresa ao relato das vulnerabilidades foi melhor do que a de 98% das outras empresas
    Eles tiveram uma postura muito receptiva e, acima de tudo, demonstraram interesse e trataram do problema. Só que achei uma pena que o autor do texto original tenha parecido mostrar mais desprezo e agressividade. Também apareceu aquela sinofobia de sempre, por exemplo a atitude do tipo “tudo que é feito na China espiona”. No geral, foi uma simples falha de design de segurança, mas, mesmo que a empresa não tenha levado segurança a sério desde o início, é bom que exista uma empresa disposta a corrigir

    • Concordo que poderia ter havido uma colaboração mais estreita com a equipe, mas a coleta de logs de chat é, de fato, bastante preocupante. Se eles registram tudo o que o usuário diz, isso não é sinofobia
      Para ser justo, acho que hoje em dia também deveríamos tratar o logging amplo feito por empresas dos EUA com o mesmo nível de hostilidade. Para não sermos barrados por causa do meme do Vance
    • Não entendo por que dizer “tudo que é feito na China espiona” seria sinofobia
      Quando a prática padrão do software e hardware modernos de coletar o máximo possível de dados dos usuários e enviá-los para a matriz se combina com uma lei que diz que “todas as organizações e cidadãos devem apoiar, auxiliar e cooperar com o trabalho de inteligência do Estado”, como deveríamos enxergar isso de outra forma?
    • Se todos os detalhes do texto forem verdadeiros, esse fornecedor é repugnantemente negligente com qualquer coisa que se pareça com respeito ao cliente, segurança e privacidade de dados
      Não há como ajudar essa empresa. Ela não está em um estado que possa ser resgatado com conhecimento. É isso
    • A visão de mundo de que “tudo que é feito na China espiona” previu a realidade com muito mais precisão do que a visão de mundo defendida aqui
      É bom que tenham tido uma “postura muito receptiva”, mas há um limite para compensar irresponsabilidade e incompetência grave. Eles escolheram vender um produto do mais baixo nível, um lixo em chamas, e devem ser tratados de acordo
    • A razão pela qual há pouca aversão ao Japão é que o Japão não transformou tecnologia em arma com sucesso para criar um Estado policial de pontuação de crédito social voltado a minorias
  • Gostei da tentativa de suborno de oferecer “patrocínio” a um canal vazio do YouTube