Não abra uma issue pública para vulnerabilidades de segurança.
Reporte de forma privada por um destes canais:
- GitHub (preferido): aba Security → Report a vulnerability (Private Vulnerability Reporting). Cria um canal privado com os mantenedores.
- E-mail:
[email protected].
Inclua, se possível:
- descrição do problema e do impacto;
- passos para reproduzir (PoC), versão/commit afetado;
- configuração relevante (sem segredos reais: nunca envie certificados,
.envou XMLs com dados reais).
- Confirmação do recebimento em até 3 dias úteis.
- Avaliação e, quando aplicável, uma correção coordenada antes da divulgação pública. Pedimos que aguarde a correção antes de divulgar (coordinated disclosure).
- Crédito ao relator na nota da correção, se desejado.
O projeto está em desenvolvimento ativo; correções de segurança são aplicadas na
versão mais recente (main / último release). Não há suporte retroativo a versões
antigas.
Relevante: autenticação da API, tratamento do certificado e da senha que chegam no payload, injeção nos formatos que montamos (INI e XML), a fronteira com a biblioteca nativa, e a superfície HTTP pública. Fora de escopo: vulnerabilidades em dependências de terceiros já rastreadas (use o fluxo do upstream) e configurações inseguras do próprio operador.
Não há banco, painel, sessão nem multi-tenancy: esse serviço não guarda nada, e a classe de vulnerabilidade que vem com isso não existe aqui.
Este wrapper não persiste nada, e isso muda onde o risco mora. O que ele manipula de mais sensível é o certificado A1 de terceiros, que chega no corpo da requisição que transmite.
Consequências que valem um olhar extra em qualquer contribuição:
-
Log é a única forma realista de um segredo escapar do processo. Por isso todo tipo que carrega credencial redige a si mesmo em
String()eLogValue(), e o middleware de log nunca registra corpo nem cabeçalho de autorização. Um%vdistraído desfaz isso.Os dois métodos são necessários por motivos diferentes:
String()cobre ofmt;LogValue()cobre oslog, que é o que o serviço usa. O manipulador JSON doslognão consultaStringer: ele serializa a struct campo a campo, então só comString()o segredo sai inteiro no log. Um teste varre o repositório e recusa tipo novo com credencial semLogValue(). -
O log da ACBrLib em nível 3+ grava XML e certificado em disco. O boot recusa essa combinação com
MODO=producao. Não afrouxe esse gate. -
O PFX vai da API ao worker por socket unix e não sai do host. Se um dia o transporte virar TCP, ele precisa ficar preso à rede interna.
-
Um token dá acesso a tudo. Não há escopo. Quem expõe a API na internet precisa de TLS na borda e de restringir quem alcança a porta. O limite por endereço (
API_RATE_PER_MIN) vale antes da autenticação justamente para que adivinhar o token não saia ao ritmo da rede, mas ele é piso, não substituto do limite no proxy de borda.