GO Code Review #1: Credenciais codificadas são sensíveis à segurança

Visão geral
Os revisores avaliaram a qualidade, capacidade de manutenção e conformidade do código com as melhores práticas. Eu estava especialmente preocupado em localizar possíveis brechas de segurança e locais que precisavam de reparos. Em relação às credenciais codificadas, este relatório destaca um problema de segurança crucial.
Exemplo de Código Sensível
func connect() {
user := "root"
password:= "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
O trecho de código fornecido parece ser uma função chamada connect() que é responsável por estabelecer uma conexão, possivelmente com um serviço ou sistema. Aqui está uma análise detalhada do código:
func connect() {
user := "root"
password := "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
- Senha confidencial: por ser diretamente visível no código-fonte, o valor da senha codificada "supersecret" é considerado confidencial. Devido a considerações de segurança, não é recomendável codificar credenciais como senhas no código-fonte. Qualquer pessoa com acesso à base de código pode examinar prontamente a senha.
- Geração de URL: As variáveis de usuário e senha são combinadas com entradas adicionais para criar uma string de URL. Parece estar construindo um URL para uma solicitação de login, com parâmetros de consulta para os valores de usuário e senha.
- Risco de segurança : existe um sério risco de segurança quando dados confidenciais, como senhas, são mantidos no código-fonte em texto simples. Os dados confidenciais podem ser prontamente obtidos e abusados se a base de código for visualizada por pessoas não autorizadas ou se o repositório for invadido.
2. Gerenciamento de credenciais: é difícil alterar ou alternar senhas conforme necessário quando elas são armazenadas diretamente no código. Falhas de segurança potenciais podem resultar de credenciais codificadas que podem persistir na base de código mesmo após uma alteração de senha.
Recomendação: Use uma ferramenta de gerenciamento de segredo ou uma solução segura de gerenciamento de credenciais para armazenar e gerenciar credenciais confidenciais com segurança. Essas soluções incluem recursos como rotação automática de segredos, além de armazenamento seguro, gerenciamento de acesso e outros recursos.
3. Validação de entrada: todas as entradas do usuário devem ser validadas e sanitizadas, especialmente ao criar URLs ou executar consultas de banco de dados. A falta de validação e sanitização de entrada no código fornecido deixa o sistema aberto a falhas de segurança, como injeção de SQL e ataques de manipulação de URL.
Recomendação: para impedir esses ataques, use estratégias apropriadas de validação e sanitização de entrada. Use consultas parametrizadas ou instruções preparadas, por exemplo, e certifique-se de que todos os valores fornecidos pelo usuário nas URLs sejam codificados corretamente.
4. Armazenamento seguro de senhas: é crucial lembrar que manter senhas em texto simples não é seguro se esta função for um componente de um esquema de autenticação maior. Antes de serem armazenadas, as senhas devem, idealmente, ser criptografadas com segurança e salgadas para impedir o acesso não autorizado em caso de violação de dados.
Recomendação: Use métodos poderosos de hash de senha para armazenar e validar senhas com segurança, como bcrypt ou Argon2.
Solução compatível:
func connect() {
user := getEncryptedUser()
password:= getEncryptedPass() // Compliant
url := "login=" + user + "&passwd=" + password
}
- Armazene as credenciais em um arquivo de configuração que não seja enviado ao repositório de código.
- Armazene as credenciais em um banco de dados.
- Use o serviço do seu provedor de nuvem para gerenciar segredos.
- Se uma senha foi divulgada por meio do código-fonte: altere-a.
O armazenamento de informações confidenciais, como senhas, diretamente no código-fonte expõe o sistema a acesso não autorizado e possíveis explorações.