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:
- Nada sai do dispositivo. Sem servidores, telemetria nem código remoto. As páginas da extensão usam
default-src 'self'; connect-src 'none'(vejamanifest.ts), então nem um bug na interface consegue exfiltrar dados pela rede. - 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 comtextContent, só linka URLshttp(s)e se recusa a renderizar quando embutida por um site (proteção contra clickjacking). - 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.
- 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 parastorage.locale 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,
minimumReleaseAgeestrictDepBuilds; os scripts de ciclo de vida não rodam a menos que estejam explicitamente na lista de permitidos.