Ir para o conteúdo principal

Código aberto · Local-first · Linha de comando

Audite seu próprio histórico de posts como uma IA faria.

Os modelos de linguagem de hoje leem algumas centenas dos seus posts públicos mais banais e deduzem onde você mora, onde trabalha, qual é a sua rotina — e reconectam ao seu nome real uma conta que você mantém sob pseudônimo. Não a partir de um post descuidado, e sim do mosaico de muitos. O ExposureCheck roda essa mesma leitura adversária na sua própria exportação, nos seus próprios termos, e mostra o que generalizar ou editar.
$ exposurecheck audit --twitter ./twitter_export \
    --backend local --expensive-model llama3.1 --i-own-this-data

ExposureCheck v0.1  ·  local backend  ·  nothing left this machine
Parsed 3,214 posts · 19 months · prefilter kept 2,901 (weak signals retained)

RISK CONTRIBUTION        posts   what drives it
───────────────────────────────────────────────────────────────
● LOCATION       High      28    local events, commute clues, "my gym"
● EMPLOYER       High      11    project code-names, office banter
● SCHEDULE       Medium    63    posting-time concentration → UTC-8
○ FAMILY         Low        4    a relative's first name, a school

Top card · LOCATION (High)
  [LOCAL EVENT] near [NEIGHBORHOOD]  — 6 posts
  [COMMUTE] on [TRANSIT LINE]        — mentioned 9 times
  → generalise: drop venue names; delay event posts by a week
  12 posts to review · re-run with -i to open YOUR own originals

No dossier written. No profile saved. "High" is not "you are doxxed" —
it means a model could narrow this down. Fix, then re-scan.

Exemplo real de execução com um modelo local. As categorias aparecem mascaradas (em código), o valor recuperado não é exibido e nenhum perfil é salvo.

O que ela faz, em um minuto
#

O ExposureCheck lê os dados que você exporta de uma plataforma — nunca uma conta ativa, nunca a de outra pessoa — e faz a pergunta que um adversário faria: juntando tudo isso, o que dá para deduzir sobre quem está por trás?

  • Ela interpreta a sua exportação GDPR do Reddit e o seu arquivo do X / Twitter (uma pasta ou um .zip).
  • Roda uma cascata que preserva a cobertura: uma passagem barata ordena cada post por prioridade, uma passagem cara lê os mais importantes, e os sinais fracos ficam — o mosaico se monta a partir de sinais fracos, então descartá-los seria um falso conforto.
  • Extrai a camada de metadados de forma determinística — o campo de localização que você mesmo preencheu, os links de saída, o EXIF/GPS (dados que a câmera grava na foto, como local e horário) das imagens, o modelo do aparelho e a concentração de horários de postagem que entrega o seu fuso. No X, isso vaza mais do que o próprio texto.
  • Devolve cartões de risco por categoria — Localização, Empregador, Família, Agenda, Finanças, Vínculos de conta — ordenados pela contribuição ao risco, cada um com exemplos mascarados e correções concretas, que começam pela generalização.

Ela é local-first, não grava nenhum dossiê e nunca salva no disco um perfil seu.

Nunca ouviu falar em “reidentificação por mosaico”? Comece pela ameaça, não pela ferramenta: leia o artigo que acompanha esta página, Audite seu próprio histórico de posts como uma IA faria, e depois volte.

O que ela deliberadamente não faz
#

  • Nenhum dossiê. Ela nunca imprime “você mora em X, trabalha na Y, seu nome é Z”. Os cartões mostram trechos mascarados; o valor recuperado só aparece quando você clica para abrir o seu próprio post original, ali na hora, sem nunca ser salvo.
  • Não exporta os achados. Não faz scraping (coleta automática); o único insumo é a exportação. Não posta nem apaga nada no seu lugar. Não analisa o histórico de ninguém mais.
  • Ela não deixa você anônimo. Ela reduz o risco. “Low” não é “seguro”, e metadados, horários e estilo de escrita só entram em parte no escopo.

O que sai da sua máquina — e o que não sai
#

Essa é a primeira coisa que uma ferramenta de privacidade deveria dizer, então aqui está, logo de cara. A inferência roda num backend que você escolhe, e é essa escolha — não a ferramenta — que decide o que viaja:

BackendO que éOs seus dados saem da sua máquina?
localum modelo local no Ollama / llama.cpp / LM StudioNão — ficam no seu computador
heuristicum esboço offline em regex, com cobertura quase nulaNão — mas só para desenvolvimento/CI, não é uma auditoria de verdade
cloudqualquer endpoint compatível com OpenAI, com a sua chave⚠️ Sim — os seus posts vão para esse provedor

A ferramenta em si não tem servidor, nem telemetria, nem conta. A autora não guarda nenhum dado seu e nenhuma chave. Quando você escolhe cloud, a sua exportação vai para o provedor de API que você indicou — e valem todas as regras dele: registro de logs, prazo de retenção, política de treinamento e o IP e a cobrança atrelados à sua chave. O ExposureCheck não acrescenta nenhum salto na rota; mas também não consegue remover aquele que você decidiu tomar.

A única ressalva sobre a nuvem que de fato pesa
#

Se a conta que você está auditando for uma com pseudônimo que você mantém apartada da sua identidade real, e a sua conta de IA/nuvem estiver registrada ou paga sob o seu nome real, então mandar esse histórico para a nuvem permite ao provedor ligar identidade real ↔ conta anônima do lado dele (por intimação judicial, vazamento ou alguém de dentro). É exatamente essa desanonimização que a ferramenta existe para evitar.

Logo: para auditar uma conta estritamente anônima → use --backend local (ou uma conta na nuvem aberta e paga de forma anônima). Para auditar a sua conta pública / com nome real → a nuvem não tem problema. A CLI deixa isso claro na tela e pede que você reconheça o risco quando ele se aplica. A ferramenta nunca obriga a usar o modo local — isso reduziria o público a ninguém —, ela apenas torna a escolha explícita.

Como funciona
#

export ─▶ parse ─▶ prefilter (drop only TRUE-empty) ─┬─▶ deterministic: profile + EXIF + timing ─┐
                                                     └─▶ cascade: cheap route ─▶ expensive read ─┤
                                         risk-contribution scoring ─▶ category cards ─▶ no-dossier report

A cascata existe para que processar um histórico de 1 a 3 mil posts continue acessível: a passagem barata decide o que merece a leitura cara, em vez de mandar tudo. A pontuação por contribuição ao risco então ordena as categorias por quanto elas de fato estreitam quem você é — e não pela confiança bruta do modelo, que não é calibrada.

Instalação
#

O núcleo — a interpretação dos arquivos, o EXIF, a cascata e os backends HTTP de nuvem e local — usa apenas a biblioteca padrão do Python. Nenhum pacote de terceiros toca na sua exportação, o que mantém pequeno o código em que você precisa confiar.

# from source (a PyPI release ships with the first public version):
git clone https://github.com/coraaegis/exposurecheck && cd exposurecheck
pip install -e .

# or run without installing:
python -m exposurecheck --help
# Local model — nothing leaves your machine (recommended for anonymous accounts)
exposurecheck audit \
  --reddit ./reddit_export.zip \
  --twitter ./twitter_export \
  --backend local --expensive-model llama3.1 \
  --i-own-this-data

# Cloud — bring your own key; set it in the ENV, never on the command line
export OPENAI_API_KEY=sk-...
exposurecheck audit --twitter ./twitter_export --backend cloud --i-own-this-data

A chave da API é lida intencionalmente de uma variável de ambiente: argumentos de linha de comando vazam para o histórico do shell e para a lista de processos.

Por enquanto, o ExposureCheck é uma ferramenta de linha de comando, voltada a quem se sente à vontade num terminal — que é também onde vivem os primeiros a revisá-la. Um aplicativo de um clique para quem não é técnico (um pacote pronto, com uma interface local que roda no navegador e sem nenhum Python para instalar) é o próximo marco; a CLI fica para quem usa a fundo.

Confie como confiaria em qualquer ferramenta de privacidade — verificando, não acreditando
#

A autora é pseudônima, então não tome um nome como garantia. Tome, no lugar, as coisas que você pode verificar:

  • Leia o código. Ele é de código aberto (MIT) e usa só a biblioteca padrão, então a árvore de dependências que você precisa auditar é, na prática, a própria biblioteca padrão.
  • Verifique a release. Cada release é assinada com PGP por Cora Aegis. Busque a chave por WKD e confira a assinatura:
    gpg --locate-keys cora@cypherpunkguide.com
    gpg --verify exposurecheck-0.1.0.tar.gz.asc
    As somas de verificação SHA-256 acompanham cada release, e as builds são reprodutíveis — recompile a partir da fonte com a tag e confirme que o resultado bate.
  • Sem certificado de assinatura de código atrelado a uma identidade, por design — um certificado desses prenderia o projeto a uma identidade legal, o oposto do objetivo. Um binário do Windows sem assinatura pode disparar o aviso de “editor desconhecido” do SmartScreen; isso é esperado. Prefira um gerenciador de pacotes (pip / Scoop / Homebrew) ou rode a partir da fonte, e verifique a assinatura PGP.
  • O desenho da saída é a salvaguarda. A regra de “nenhum dossiê” é garantida no código: os rótulos mascarados são gerados pelo programa, então nem mesmo o texto do próprio modelo consegue trazer um valor recuperado para dentro do relatório. As proteções contra duplo uso — insumo restrito a quem é dono dos dados, saída só por categoria, mascaramento e uma avaliação de abuso pré-lançamento — estão documentadas em ABUSE-EVAL.md.

Uma tabela transparente de fluxo de dados e um modelo de ameaças publicado mostram o que a ferramenta pretende fazer. O código, a assinatura e a build reprodutível são como você confirma que ela faz isso — e nada além.

Limites que vale conhecer
#

  • “Low” não é “seguro”. A ferramenta reduz o risco; ela não atesta anonimato.
  • A cobertura não é perfeita. Um achado em branco (“nada sinalizado”) não prova que você é inidentificável — sobretudo no backend heuristic, que existe para testes, não para auditoria.
  • Fora do escopo: a impressão digital do estilo de escrita, o cruzamento entre plataformas além do que está nas suas exportações, os metadados de rede e o conteúdo visual das imagens (a v1 lê só o EXIF/metadados — veja o roteiro).
  • A própria ferramenta lê os seus dados mais sensíveis. É justamente por isso que ela é local-first, usa só a biblioteca padrão, é de código aberto e assinada: para que aquilo que você roda a fim de medir a sua exposição seja, ele mesmo, a menor e mais auditável superfície possível.

Perguntas frequentes
#

O ExposureCheck envia os meus posts para algum lugar?
#

Só se você escolher o backend cloud, e mesmo assim apenas para o provedor de API cuja chave você forneceu. Com local ou heuristic, nada sai da sua máquina. A ferramenta não tem servidor nem telemetria próprios.

Ela vai me dizer o meu endereço ou o meu nome real?
#

Não. É o desenho deliberado de “nenhum dossiê”. Ela mostra categorias mascaradas e aponta para os seus próprios posts originais, para que você decida o que mudar. Ela nunca monta nem guarda um perfil seu.

Estou auditando uma conta anônima. O backend de nuvem é seguro?
#

Use --backend local para uma conta estritamente anônima, a menos que a sua própria conta de nuvem seja anônima. Mandar o histórico de uma conta anônima para uma conta de IA com nome real liga as duas do lado do provedor — exatamente o risco que esta ferramenta ajuda você a encontrar.

É realmente seguro rodar no meu histórico inteiro?
#

O código é de código aberto e usa só a biblioteca padrão, então você consegue ler o que ele faz; a release é assinada com PGP e reprodutível, então você consegue confirmar o que instalou; e nada de perfil é gravado no disco. Verifique isso, não tome por fé — é toda a postura da ferramenta.

Por que uma linha de comando e não um aplicativo?
#

O primeiro público é técnico, e uma CLI é a forma mais auditável. Um aplicativo de um clique, empacotado e com uma interface local no navegador, é o próximo marco para quem não é técnico.


Feito por Cora Aegis. Encontrou uma falha de privacidade ou de segurança? A divulgação responsável é bem-vinda — cora@cypherpunkguide.com (PGP via WKD). A fonte oficial e o nome ExposureCheck ficam em github.com/coraaegis/exposurecheck.