Este documento descreve as práticas de segurança, procedimentos de divulgação responsável e orientações para mitigar riscos ao utilizar o BridgeBank.
Se descobrir uma vulnerabilidade de segurança, não abra uma issue pública no GitHub. Em vez disso, reporte-a de forma confidencial através de um dos seguintes canais:
- Aceda a GitHub Security Advisory
- Clique em "Report a vulnerability"
- Descreva a vulnerabilidade com detalhes técnicos
A segurança é uma prioridade — as vulnerabilidades reportadas serão tratadas com urgência.
- Recepção: Confirmamos a recepção do relatório dentro de 48 horas
- Avaliação: A equipa avalia a vulnerabilidade e o seu impacto
- Correcção: Desenvolvemos uma correcção em segredo numa branch privada
- Teste: A correcção é validada e testada completamente
- Release: Uma nova versão é publicada com a correcção
- Divulgação: Um CVE (Common Vulnerabilities and Exposures) é atribuído, se aplicável
- Comunicação: O relatório original recebe crédito (a menos que prefira anonimato)
Prazo esperado: 30 dias entre a reportação e a divulgação pública.
Ao utilizar o BridgeBank, é responsabilidade sua:
- Manter dependências atualizadas — Configure alertas de segurança do GitHub (Dependabot)
- Validar dados de entrada — O BridgeBank processa dados bancários; sempre valide ficheiros e entrada do utilizador
- Proteger credenciais — Nunca inclua tokens de API, senhas ou chaves de acesso no controlo de versão
- Usar HTTPS em produção — Se utilizar a API REST, sempre use conexões encriptadas
- Auditar acessos — Quem tem acesso aos dados processados pelo BridgeBank?
Se executar a API REST em produção:
- Autenticação e Autorização — Configure controles de acesso (ex: OAuth 2.0, JWT)
- Limite de Taxa — Implemente rate limiting para prevenir abuso
- HTTPS/TLS — Use certificados SSL/TLS válidos
- Validação de Upload — A API aceita uploads de ficheiros — valide tipo, tamanho e conteúdo
- Monitoramento — Monitore logs e métricas para atividade suspeita
Se contribuir para o projecto:
- Não envie segredos — Revise seus commits antes de push; evite expor chaves, tokens ou dados sensíveis
- Testes de segurança — Teste casos extremos e entrada malformada
- Dependências — Use versões conhecidas de bibliotecas; revise
csprojpara dependências desatualizadas - Code review — Aceite feedback crítico sobre segurança
A Simansoft é responsável por:
- Auditar dependências regularmente — Verificar vulnerabilidades conhecidas
- Aplicar patches — Corrigir vulnerabilidades reportadas rapidamente
- Comunicar riscos — Publicar avisos de segurança quando necessário
- Revisar código — Validar mudanças antes do merge
- Testes de segurança — Executar testes de segurança estática (SAST) na CI/CD
Não há vulnerabilidades conhecidas no momento da última atualização. Consulte as GitHub Security Advisories para informações atualizadas.
- Armazenamento — Criptografe ficheiros de extracto em repouso (ex: AES-256)
- Transmissão — Use HTTPS/TLS ao enviar extractos para a API
- Logs — Não registre IBANs, números de contas ou valores sensíveis em logs
- Temporário — Delete ficheiros de extracto após processamento
- Validação — Valide o formato (ex: IBAN) antes de processar
- Mascaramento — Nos logs/UI, mostre apenas os últimos 4 dígitos
- Encriptação — Criptografe dados sensíveis em repouso e em trânsito
- Acesso mínimo — Apenas utilizadores autenticados acedem a dados de transacção
- Auditoria — Registre quem acedeu a que dados e quando
- Retenção — Defina políticas de retenção de dados (ex: apagar após 7 anos)
A API REST não impõe autenticação por padrão. Para produção, configure:
// Exemplo: Adicionar autenticação JWT na API
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://seu-provedor-identidade.com";
options.Audience = "bridgebank-api";
});
app.UseAuthentication();
app.UseAuthorization();O BridgeBank processa ficheiros Excel e JSON. Implemente validações:
// Validar tamanho do ficheiro
const long maxFileSize = 10 * 1024 * 1024; // 10 MB
if (file.Length > maxFileSize)
throw new InvalidOperationException("Ficheiro demasiado grande");
// Validar tipo MIME
var allowedTypes = new[] { "application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" };
if (!allowedTypes.Contains(file.ContentType))
throw new InvalidOperationException("Tipo de ficheiro não permitido");
// Validar conteúdo (guarde o upload num ficheiro temporário antes de processar)
var extensaoOriginal = Path.GetExtension(file.FileName);
var extensoesPermitidas = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
".xlsx", ".xls", ".json"
};
if (string.IsNullOrWhiteSpace(extensaoOriginal) || !extensoesPermitidas.Contains(extensaoOriginal))
throw new InvalidOperationException("Extensão de ficheiro não permitida");
var caminhoTemporario = Path.GetTempFileName();
try
{
await using (var stream = new FileStream(caminhoTemporario, FileMode.Create))
{
await file.CopyToAsync(stream);
}
var extrato = leitor.LerExtrato(caminhoTemporario);
if (extrato?.Transacoes == null || !extrato.Transacoes.Any())
throw new InvalidOperationException("Extracto vazio ou inválido");
}
finally
{
if (File.Exists(caminhoTemporario))
File.Delete(caminhoTemporario);
}O BridgeBank utiliza as seguintes dependências principais:
| Dependência | Versão | Propósito | Risco |
|---|---|---|---|
NPOI |
≥ 2.6.0 | Leitura de ficheiros Excel | |
ML.NET |
≥ 4.0.0 | Classificação com ML | |
SharpCompress |
(if used) | Compressão | System.IO.Compression |
Recomendação: Configure Dependabot no GitHub para alertas automáticos.
Para testar a segurança localmente:
# Análise estática de código (usando Roslyn Analyzers)
dotnet build /p:EnforceCodeStyleInBuild=true
# Verificar dependências vulneráveis
dotnet list package --vulnerable
# Executar testes com inputs malformados
dotnet test tests/BridgeBank.Core.Tests --filter "Security"Se utilizar a API REST, configure HTTPS obrigatório:
// Program.cs
if (!app.Environment.IsDevelopment())
{
app.UseHsts(); // HTTP Strict-Transport-Security
}
app.UseHttpsRedirection();
// Certificado SSL (produção)
// Use um certificado válido, ex: Let's EncryptNo Docker:
# docker-compose.yml
services:
api:
environment:
- ASPNETCORE_HTTPS_PORT=443
- ASPNETCORE_URLS=https://+:443;http://+:80
ports:
- "443:443"
volumes:
- ./certs:/https:ro # Montar certificadosPara dados bancários em repouso:
using System.Security.Cryptography;
using System.Text;
public class CriptografiaDados
{
/// <summary>
/// Encripta dados com AES-GCM e devolve nonce (12 bytes) + tag (16 bytes) + texto cifrado.
/// </summary>
/// <param name="dados">Texto em claro a encriptar.</param>
/// <param name="chave">Chave AES de 16, 24 ou 32 bytes.</param>
/// <param name="dadosAssociados">AAD opcional; deve ser exactamente o mesmo na desencriptação.</param>
/// <returns>Buffer concatenado no formato nonce + tag + texto cifrado.</returns>
public static byte[] EncriptarAutenticado(string dados, byte[] chave, byte[]? dadosAssociados = null)
{
if (chave is null || (chave.Length != 16 && chave.Length != 24 && chave.Length != 32))
throw new ArgumentException("A chave deve ter 16, 24 ou 32 bytes.", nameof(chave));
var nonce = RandomNumberGenerator.GetBytes(12); // 96 bits para GCM
var textoPlano = Encoding.UTF8.GetBytes(dados);
var textoCifrado = new byte[textoPlano.Length];
var tag = new byte[16];
using var aes = new AesGcm(chave, tagSizeInBytes: 16);
aes.Encrypt(nonce, textoPlano, textoCifrado, tag, dadosAssociados);
var resultado = new byte[nonce.Length + tag.Length + textoCifrado.Length];
Buffer.BlockCopy(nonce, 0, resultado, 0, nonce.Length);
Buffer.BlockCopy(tag, 0, resultado, nonce.Length, tag.Length);
Buffer.BlockCopy(textoCifrado, 0, resultado, nonce.Length + tag.Length, textoCifrado.Length);
return resultado;
}
}Nota: Guarde e rote chaves criptográficas num cofre seguro (ex: Azure Key Vault, AWS KMS ou DPAPI), em vez de embutir chaves no código ou ficheiros de configuração. O nonce deve ser único por chave; em cenários de alto volume, prefira um esquema monotónico (contador) por chave para prevenir reutilização. Se usar AAD, preserve e forneça exactamente o mesmo valor durante a desencriptação. AesGcm requer .NET 6.0 ou superior.
✅ Seguro:
- Erros de validação (estrutura, não valores)
- Falhas de autenticação (IP, timestamp)
- Operações bem-sucedidas (quem, quando, que recurso)
❌ Nunca Registre:
- IBANs, números de contas, cartões
- Valores de transacções sensíveis
- Senhas, tokens de API, chaves criptográficas
_logger.LogWarning("Falha ao processar extracto para banco {Banco} (tipo de ficheiro: {Tipo})",
banco, tipo);
// NÃO:
_logger.LogWarning("Falha ao processar extracto: {Extracto}", extractoJson);Implemente logs de auditoria para conformidade:
public class LogAuditoria
{
public int Id { get; set; }
public string Utilizador { get; set; }
public string Acao { get; set; } // "Processou extracto", "Gerou pagamento"
public string Recurso { get; set; } // ID do extracto, não dados sensíveis
public DateTime Timestamp { get; set; }
public string EnderecoIP { get; set; }
public string Resultado { get; set; } // "Sucesso", "Falha"
}Se o seu sistema processa dados pessoais (ex: NUIT, nomes), cumpra:
- LEI MOÇAMBICANA DE PROTEÇÃO DE DADOS (se aplicável)
- RGPD (se utilizadores da UE)
- PCI DSS (se processar dados de cartão)
Em Moçambique, bancos estão sujeitos a:
- Normas BdM (Banco de Moçambique)
- Lei de Segurança Informática
- Controlos internos e auditoria
Consulte a legislação local antes de implementar em produção.
Subscreva notificações de segurança:
- GitHub: Watch Releases — selecione "Releases only"
- NuGet: Alertas automáticos para pacotes desatualizados
- GitHub Security Advisory: Subscreva actualizações de advisories de segurança do repositório
Para questões de segurança confidenciais, utilize:
- GitHub Security Advisory: Reportar via GitHub
| Versão | Assunto | Data |
|---|---|---|
| 1.0.0+ | Versão inicial | 2026-04-16 |
(Atualizaremos conforme novas versões forem lançadas)
- OWASP Top 10
- Microsoft .NET Security Best Practices
- PCI DSS Compliance Guide
- Banco de Moçambique - Normas de Segurança
Última atualização: 2026-04-16
Versão: 1.0