Stickybit.← TelemetriaEnglishFerramenta · resumir · 2026
TRUSS · contagem que aguenta quem quer enganar

A contagem que não verga.

Para contar milhões de usuários, pedidos ou chamadas com pouca memória, os sistemas usam resumos compactos, como os do Redis e do Apache DataSketches. Funcionam bem com tráfego honesto. Mas quem conhece o jeito como eles embaralham os dados consegue esconder ou inflar a conta. O TRUSS dá o mesmo resumo com uma chave secreta, e a conta fica fiel.

Espécime · o mesmo contador, com tráfego honesto e com ataque
30.000distintos de verdade
1contador de embaralhamento público
29.705TRUSS, chave secreta
—cota de 1.000 pedidos

Os três cenários são medições nossas: Redis 8.8 instalado e Apache DataSketches 6.1.1, contra a biblioteca TRUSS. A barra usa escala logarítmica. O cálculo do tamanho usa a fórmula clássica do HyperLogLog (erro típico de 1,04 dividido pela raiz do número de caixas), que vale só para tráfego honesto.

No dia a dia

Contar a torcida sem anotar cada nome.

Imagine a portaria de um estádio que precisa saber quantas pessoas diferentes entraram na temporada. Anotar cada nome exige um caderno enorme. O truque dos resumos compactos é outro: cada pessoa passa por um embaralhador que transforma o nome num número e a manda para uma de 16.384 caixinhas. Olhando só as caixinhas, dá para estimar o total com erro de menos de 1%, gastando 12 KB de memória.

É assim que o Redis conta visitantes únicos, que bancos de dados contam clientes distintos e que plataformas de IA contam quantos pedidos caros cada cliente fez, para cobrar e para impor limites.

A promessa de "menos de 1% de erro" tem uma letra miúda: vale para quem não está tentando enganar.

Tráfego honesto os nomes se espalham pelas caixinhas estimativa: 30.195 Ataque nomes escolhidos para cair todos na mesma caixinha estimativa: 1
Com o embaralhador público, o atacante testa nomes no próprio computador e guarda só os que caem na caixinha 0. O contador vê uma caixinha ocupada e conclui que entrou uma pessoa.
A pegadinha

Um cadeado com a senha no manual.

O Redis usa sempre o mesmo embaralhador, com uma semente fixa e pública (0xadc83b19). O DataSketches, a mesma coisa (9001). Qualquer um pode reproduzir o embaralhador no próprio computador e garimpar nomes que caem onde ele quer.

Com isso, dá para errar para os dois lados. Escondendo: milhares de pedidos caros aparecem como um só, e o limite de uso nunca dispara. Inflando: poucos visitantes aparecem como milhões, e o painel de audiência mente.

O conserto é barato: uma chave secreta por contador, sorteada na criação. Sem a chave, o atacante não sabe onde cada nome vai cair, e o garimpo não tem alvo. O resumo continua do mesmo tamanho. A teoria já dizia que blindar esses resumos custa pouco (Ben-Eliezer e colegas, 2022), mas não havia biblioteca pronta para instalar. O TRUSS é essa biblioteca.

0xadc83b19 semente pública Redis, DataSketches •••••••• chave secreta TRUSS
Mesmo desenho de contador, mesma memória. A diferença é quem conhece a combinação.
O que medimos

Nos contadores instalados de verdade.

Não fizemos o ataque num modelo de papel. Rodamos contra o Redis 8.8 instalado e contra o Apache DataSketches 6.1.1, o contador de distintos usado por Druid, Hive, Spark e Pinot.

No Redis, 30.000 usuários distintos, escolhidos pelo atacante, foram contados como 1. Que o Redis tenha respondido exatamente 1 prova que a nossa cópia do embaralhador dele bate byte a byte. No DataSketches, 50.000 distintos viraram 13,1 milhões: 262 vezes a mais. Mesma causa, direções opostas.

Com a chave secreta do TRUSS, os mesmos ataques deram 29.705 no primeiro caso e uma contagem dentro de 1% no segundo.

Levamos o caso para o custo de IA: uma plataforma com limite de 1.000 pedidos caros por cliente, a US$ 0,10 cada. Com o contador do Redis, o cliente abusivo fez 30.000 pedidos e o limite não disparou: US$ 2.999,90 passaram sem cobrança. Com o TRUSS, o limite disparou.

embaralhamento públicoTRUSS, chave secreta
Redis, ataque que esconde30.000 reais
1 · 30.000× a menos
TRUSS, mesmo ataque30.000 reais
29.705
DataSketches, ataque que infla50.000 reais
13,1 mi · 262×
TRUSS, mesmo ataque50.000 reais
fiel, dentro de 1%
Escala logarítmica: a linha tracejada no meio é a contagem certa; à esquerda, contou de menos; à direita, contou de mais. A escala vai de 100 mil vezes a menos (borda esquerda) a 100 mil vezes a mais (borda direita).
ContadorCenárioDistintos de verdadeContadoEfeito
Redis 8.8 (HyperLogLog)tráfego honesto30.00030.195fiel
Redis 8.8 (HyperLogLog)ataque que esconde30.000130.000× a menos; limite de uso não dispara
TRUSS, chave secretamesmo ataque30.00029.705fiel; limite dispara
DataSketches 6.1.1 (Theta)ataque que infla50.00013,1 milhões262× a mais
TRUSS, chave secretamesmo ataque50.000±1%fiel

Também medimos o ataque mais sutil, em que o atacante faz perguntas, olha a resposta e ajusta o próximo passo. Contra o estimador de "soma dos quadrados" (a medida clássica de concentração), ele inflou um contador comum para 2,1 vezes o valor certo. Com a troca de cópias descrita no artigo de 2022, que só revela uma cópia nova quando a estimativa muda de patamar, o resultado ficou em 1,0: nenhum dos 20.000 itens do atacante conseguiu mexer na conta.

Onde usar

Quando alguém ganha dinheiro com o erro.

  1. Cobrança e limite de uso de IA

    Pedido caro é incentivo para esconder a contagem. Um limite que não dispara vira prejuízo direto, como os US$ 2.999,90 do teste.

  2. Audiência e anúncios

    Visitantes únicos e impressões podem ser inflados para vender mais caro. O painel precisa aguentar quem tem interesse em inflá-lo.

  3. Segurança e abuso

    Alarme de varredura, de contas novas ou de cartões diferentes costuma depender de "quantos distintos". Escondê-los desliga o alarme.

  4. Onde não precisa

    Se ninguém tem incentivo para manipular a conta, o contador comum basta. E se a resposta precisa ser exata, e não aproximada, conte exato.

Três palavras desta página
Resumo compacto

Um contador que estima o total guardando pouquíssimo: 12 KB para milhões de itens, com erro típico abaixo de 1% no tráfego honesto.

Embaralhador com chave

A função que decide em que caixinha cada item cai. Com a chave pública, o atacante escolhe; com a chave secreta, não.

Atacante que se adapta

Quem faz uma pergunta, olha a resposta e usa isso para escolher o próximo passo. A garantia comum não cobre esse caso; o TRUSS foi desenhado para ele.

Limites

Onde isso pode estar errado.

Nem toda defesa é completa

Rodar várias cópias e tirar a mediana reduziu o ataque adaptativo em 2 a 3 vezes, sem zerar. A defesa completa contra quem se adapta, a troca de cópias, está feita para a soma dos quadrados. A contagem de distintos está protegida do garimpo pela chave secreta. Outras estatísticas estão em andamento.

A chave precisa ser guardada

Para juntar contadores de máquinas diferentes, todos usam a mesma chave secreta. Se ela vazar, volta o problema do cadeado com a senha no manual.

O primeiro ataque falhou

Tentar inventar um item frequente no Count-Min não funcionou: 1 erro em 100 mil perguntas. Ele só erra para cima de um jeito limitado. O ataque que funcionou mira outro tipo de contador, e registramos os dois.

Um laboratório, não a sua carga

Os números vêm de testes com 30 mil a 100 mil itens. Em produção, o tamanho do resumo e o volume mudam o erro típico; o que não muda é a diferença entre chave pública e secreta.

Ver também

← Telemetria certificada · stickybit.com.br

Fontes