Ir para o conteúdo

Aegis BlockerDocumentaçãoReferência

Segurança

Como relatar uma vulnerabilidade, o modelo de ameaças, seus limites e o reforço da versão 2.

Copiado de SECURITY.md no repositório do AegisVer no GitHub (abre em uma nova aba)

Relatar uma vulnerabilidade#

Relate problemas de segurança em privado, pelo relato privado de vulnerabilidades (abre em uma nova aba) do GitHub, e não por uma issue pública. Você pode esperar uma confirmação em poucos dias.

Modelo de ameaças#

O Aegis guarda dados que parecem sensíveis (a lista do que uma pessoa bloqueia) e oferece uma trava feita para resistir à autossabotagem por impulso. Os objetivos do projeto, em ordem:

  1. Nada sai do dispositivo. Sem servidores, telemetria nem código remoto. As páginas da extensão usam default-src 'self'; connect-src 'none' (veja manifest.ts), então nem um bug na interface consegue exfiltrar dados pela rede.
  2. Uma página da web maliciosa ou outra extensão não pode conseguir ler nem alterar o estado do Aegis. Não há content scripts nem entradas externally_connectable; o único ouvinte de mensagens é runtime.onMessage (só a própria extensão) e cada mensagem tem o remetente conferido, é validada por esquema e autorizada. O único recurso acessível pela web é a tela de bloqueio, que renderiza o texto do usuário com textContent, só linka URLs http(s) e se recusa a renderizar quando embutida por um site (proteção contra clickjacking).
  3. Um malware com acesso aos arquivos locais consegue ler o perfil do navegador como o armazenamento de qualquer extensão; o Aegis não afirma se defender disso. Mas evita piorar as coisas: nada é sincronizado com o armazenamento na nuvem e as senhas são guardadas apenas como hashes PBKDF2 com sal.
  4. O dono agindo por impulso deve achar o Modo Absoluto difícil de desfazer: a trava é imposta no service worker (não só na interface), os códigos de recuperação são recusados enquanto ela vale, e as edições feitas no armazenamento pelas costas do worker durante uma trava são desfeitas.

Fora do escopo / limites conhecidos#

  • O dono (ou qualquer pessoa com o navegador dele) pode desativar ou desinstalar a extensão em chrome://extensions, ou editar o armazenamento da extensão com as ferramentas de desenvolvedor enquanto não houver trava ativa. Nenhuma extensão consegue impedir isso.
  • Durante uma trava, um usuário determinado com acesso do DevTools às páginas da extensão ainda poderia derrotar a proteção contra adulteração (ela guarda sua cópia de referência em um armazenamento só de memória, no qual o DevTools também pode escrever). É uma troca deliberada: a proteção defende contra contornos casuais e por impulso.
  • A tela de bloqueio é acessível pela web para que o declarativeNetRequest possa redirecionar para ela; um site que conheça o id da extensão consegue, portanto, sondar se o Aegis está instalado.
  • Regras de palavra e de regex podem ser sondadas. Elas valem para qualquer endereço ou título, então uma página pode pôr um palpite no próprio título ou URL e observar se é bloqueada, descobrindo essa palavra. As checagens de aba são limitadas a uma por segundo por aba, o que atrasa isso mas não impede. Regras de site e de página só reagem ao próprio endereço e não podem ser sondadas assim: use-as para qualquer coisa sensível (o editor de regras avisa).
  • A trava é contada com o relógio do computador. Quem puder adiantar o relógio pode encerrá-la.
  • Um endereço escrito com letras escapadas (/%73horts) não é visto pelo filtro do próprio navegador; o service worker o pega na aba, um instante depois de a página começar a carregar.

Reforço na versão 2#

  • Hashes de senha: PBKDF2-SHA256, 600 000 iterações, sal aleatório de 16 bytes, comparação em tempo constante, espera crescente entre tentativas (30 s, dobrando até 15 min após 5 falhas). Os hashes SHA-256 de rodada única da v1 são atualizados no primeiro login bem-sucedido e o código de recuperação é trocado.
  • Os dados em chrome.storage.sync (v1) são migrados para storage.local e apagados do sync, mas só depois de lidos: se o sync estiver indisponível, a migração espera em vez de perder a senha.
  • As regras são casadas no service worker por um avaliador que não faz backtracking (tempo limitado pelo tamanho do padrão × tamanho do texto), então nenhuma regra, digitada ou importada, consegue travá-lo. As expressões regulares também têm tamanho limitado, são rejeitadas se repetirem um grupo ((a|b)+), empilharem mais de quatro quantificadores ou usarem look-around ou referências anteriores, precisam ser compatíveis com RE2 e não podem casar com todas as URLs.
  • As requisições ao service worker são tratadas uma de cada vez, então tentativas de senha em paralelo não conseguem ultrapassar o bloqueio.
  • Importações: com tamanho limitado, validadas por esquema, normalizadas de novo; no máximo 900 regras.
  • A pausa (“pausa consciente”) só desbloqueia o endereço exato que a regra correspondente bloqueou.
  • As dependências são instaladas com pnpm, minimumReleaseAge e strictDepBuilds; os scripts de ciclo de vida não rodam a menos que estejam explicitamente na lista de permitidos.