secure coding guidelines
Este tutorial explica a codificação segura, como evitar vulnerabilidades relacionadas à segurança e fornece diretrizes de codificação e lista de verificação para práticas de codificação seguras:
Para ter a segurança embutida no software e implementar as Diretrizes e Melhores Práticas de Codificação Segura, toda a organização, junto com a equipe identificada para trabalhar no Desenvolvimento de Aplicativo pretendido, precisa considerar certos aspectos.
Aqui, discutiremos os aspectos que ajudam a desenvolver um software seguro.
É tão simples quanto se um desenvolvedor não souber o que significa ‘Segurança para o software’ e como um hacker pode hackear seu software, assumir o controle dele e tentar explorá-lo, então é simplesmente impossível codificar um software seguro. Portanto, o desenvolvedor deve primeiro entender o significado de Codificação Segura.
O que você aprenderá:
- O que é codificação segura?
- Diretrizes de codificação segura
- Lista de verificação para práticas de código seguro
- Conclusão
O que é codificação segura?
Codificação segura é projetar e desenvolver software por evitando as fraquezas que levam a vulnerabilidades relacionadas à segurança ao aderir aos padrões de segurança especificados e às melhores práticas do setor.
A primeira pergunta que surge na mente de todos é ‘Quanta segurança é necessária para nosso software’ ou Quando podemos dizer que nosso software está protegido? e Quais são esses padrões de segurança ?
Fraudes e ameaças à segurança estão aumentando dia a dia e estamos vendo novas variedades e maneiras de hackear, mesmo nos softwares chamados de mais seguros.
Recentemente, ouvimos o programa Aaadhar da UIDAI sendo adulterado para dados pessoais. Portanto, é realmente difícil saber quanta segurança é necessária para o software e quais são os padrões de segurança, a menos que entendamos as ameaças envolvidas no software e as priorizemos com base nos riscos para o negócio.
Pode ser difícil fornecer 100% de proteção de segurança ao software, mas se a equipe do programa analisar o Riscos e garantias que estão envolvidos em seu software, ou seja, ameaças potenciais e se a equipe pode cuidar de mitigar esses riscos, então seria bom do ponto de vista de segurança do aplicativo.
Assim, a primeira tarefa da equipa é identificar e analisar os riscos e valores mobiliários que estão envolvidos na sua aplicação e compreender as possíveis opções de mitigação e adotar a melhor opção em conformidade.
Portanto, uma vez identificadas, as dez principais vulnerabilidades classificam quase todos os ataques que um programa pode enfrentar. Isso ajudará a compreender as ameaças e priorizar os esforços de segurança e desenvolvimento mais para a prevenção do que para a mitigação.
Por exemplo. Embora estejamos planejando desenvolver um aplicativo relacionado à saúde, que lida e armazena os dados de saúde do indivíduo e suas informações pessoais, o maior risco de segurança para o aplicativo é roubar os dados pessoais de saúde.
Mitigação de Risco
Para mitigar o risco,
- A implementação de segurança para acesso aos dados por um usuário não autorizado precisa ser tratada com autenticação e autorização adequadas (implementações de política de senha forte, autenticação de 2 fatores).
- É necessário ter cuidado para garantir que não haja vazamento de dados durante a transmissão de dados de uma fonte para outra, implementando canais seguros (HTTPS) de transmissão de dados e implementando criptografia de dados durante o trânsito.
- Adulterar ou roubar dados em repouso também é outra possibilidade. Portanto, o armazenamento de dados pessoais de saúde (usando criptografia) é muito essencial.
Antes de passar para o ‘Padrão de Codificação Segura’, é sempre melhor para toda a equipe do programa ter um ‘Sessão de Conscientização de Segurança’ e discutir e debater sobre,
- O requisito de segurança para seu produto específico.
- Possíveis benefícios que um hacker teria ao hackear seu sistema.
- Possíveis formas e meios de comprometer a segurança de sua aplicação.
- Práticas de segurança comuns seguidas em uma indústria e domínio semelhantes.
- Compreensão dos problemas de segurança típicos de seus respectivos programas.
Também ajuda a equipe a lidar melhor, se eles puderem entender o Fontes das vulnerabilidades que seu software pode enfrentar e as razões pelas quais o software é construído com Fraco / Inadequado Segurança .
Razões para implementação de segurança inadequada
Em geral, a seguir estão alguns motivos para a implementação de segurança inadequada no aplicativo.
- A prioridade é dada para a liberação funcional do que para os aspectos de segurança.
- Ignorância ou não conhecimento sobre segurança de software e hackers.
- Não há clareza suficiente no Programa ou no próprio Design de Software.
- A complexidade do Programa.
- Dados insuficientes, informações sobre o sistema ao vivo onde será implantado.
- Nenhuma consideração de segurança nas fases SDLC.
- Conhecimento e compreensão insuficientes das especificidades da linguagem usada no software.
- Conhecimento insuficiente para a equipe e desenvolvedores sobre as Diretrizes de Codificação de Segurança.
Sabemos que nem todos os desenvolvedores e testadores estão cientes da segurança de um aplicativo e podem não ter um conhecimento profundo das vulnerabilidades e explorações de segurança, especialmente do aplicativo em que trabalhariam. Geralmente, eles estarão familiarizados com, ‘Como codificar funcionalmente’ mas nem todos sabem ‘como codificar com segurança’.
Portanto, o aspecto muito importante para a organização adotar Práticas de Codificação Segura em seu software é primeiro ‘Treinar Pessoas’ . Portanto, treinar sua equipe sobre aspectos de codificação segura, melhores práticas de codificação de segurança e o uso correto da ferramenta é muito importante.
O princípio de design mais importante de segurança de software é ‘Implementar Segurança por Design e Padrão’ .
Diretrizes de codificação segura
Para alcançar a segurança, é muito essencial ter um ‘Padrão de Codificação Segura’ identificado para um programa no início do desenvolvimento do aplicativo, e isso ajuda a equipe a cuidar dos Padrões de Segurança para o software e ajuda a protegê-lo contra ataques.
É essencial garantir que toda a equipe esteja Obrigada para aderir a este padrão , independentemente da linguagem de codificação e das ferramentas que estão usando no programa.
Abaixo estão alguns exemplos que precisam ser implementados por padrão no design de código seguro:
- O acesso deve ser restrito apenas a usuários autenticados e a autenticação deve ser implementada em todas as camadas.
- Os canais de comunicação precisam ser criptografados para proteger os tokens de autenticação.
- Todas as chaves, senhas e certificados precisam ser armazenados e protegidos adequadamente.
- A criptografia de arquivo, criptografia de banco de dados e criptografia de elemento de dados precisam ser implementadas.
Seleção de idioma para codificação segura
A seleção do idioma para codificação pode não depender de codificação segura. Não há nada específico como linguagem protegida ou não protegida para a codificação de um software protegido.
É apenas como usamos uma linguagem de programação para construir o software e quanto conhecimento profundo o desenvolvedor tem sobre a linguagem de codificação na implementação de aspectos de segurança.
No entanto, é esclarecido que, embora Os Padrões de Codificação Segura são independentes da seleção do idioma, as Melhores Práticas do Código Seguro são dependentes do idioma, da plataforma e da implementação .
Assim, para se ter um Código Seguro, é imprescindível que o Desenvolvedor tenha um conhecimento profundo da linguagem que está sendo utilizada no programa, para que as melhores práticas de segurança possam ser implementadas com facilidade.
Exemplo:
- A probabilidade de vulnerabilidade de buffer overflow difere de idioma para idioma, mas C, C ++ e Assembly são considerados os mais suscetíveis devido aos seus recursos de gerenciamento de memória desatualizados. Várias funções C lib padrão, como strcpy () e memcpy (), são vulneráveis a ataques de estouro de buffer. O uso incorreto dessas funções, ao copiar um buffer de origem que é muito grande para caber no buffer de destino, resulta em estouro de buffer.
- O problema comum em aplicativos da web baseados em Java são os possíveis vazamentos de recursos que podem ocorrer devido a recursos do sistema aberto, como um arquivo, soquete e conexões de banco de dados.
O próximo aspecto da segurança é sobre o ferramentas a serem usadas no Programa de Aplicação para otimizar a segurança, usando ferramentas como Ambientes de Desenvolvimento Integrado será mais benéfico, pois fornecem muitos Alertas aos usuários e chamar a atenção para esses alertas para tentar melhorar a qualidade do software.
- A integração de bibliotecas / plug-ins comerciais ou de código aberto, como Eclipse, Spring Tool Suite, RAD com IDE ajuda os desenvolvedores a escrever código seguro, detectando e identificando código potencialmente vulnerável e fornece alertas sobre descobertas relacionadas à execução de arquivos maliciosos, vazamento de informações e tratamento de erros impróprio.
Também é essencial usar o Analisadores estáticos e dinâmicos para melhorar os aspectos de segurança do software. Geralmente, os analisadores estáticos são otimizados para tipos específicos de erro, então eles acabam encontrando um grande número de falsos positivos enquanto identificam erros específicos. Às vezes, há possibilidades de que eles também percam os erros reais.
Portanto, é recomendável usar vários analisadores estáticos para obter uma melhor cobertura de diferentes tipos de erros e evitar muitos falsos positivos. Às vezes, também é recomendável realizar teste manual para eliminar falsos positivos .
Regras e recomendações de codificação segura
Será bom para o Programa definir um conjunto de ‘Regras e recomendações de codificação segura’ ao qual o código-fonte pode ser avaliado quanto à conformidade para que os testadores possam realizar o ‘Teste de Conformidade de Conformidade’ para cada um desses padrões de codificação seguros.
Portanto, o código de segurança pode ser certificado como conforme ou não conforme usando essas regras em relação ao benchmark definido.
Algumas das regras mencionadas abaixo podem ser usadas para verificar violações de segurança:
- Os arquivos precisam ser fechados quando não são mais necessários.
- Sempre que uma estrutura ultrapassa um limite, o vazamento de informações deve ser evitado.
- Os objetos devem ser declarados com durações de armazenamento apropriadas.
Portanto, casos de teste para verificar essas regras precisam ser projetados e realizados para verificar a conformidade de conformidade. Também foi identificado que a maioria das vulnerabilidades são causadas por erros de programação comuns típicos.
Portanto, o desenvolvedor precisa entender 'Método Inseguro de Codificação' , enquanto também aprendem as melhores práticas de Codificação Segura. É ideal para reunir os erros de programação mais comuns que contribuem para as vulnerabilidades de segurança de seus aplicativos, para que possam ser tratados durante a codificação.
Esses erros de programação típicos são causados principalmente por buffer overflows, cross-site scripting e falhas de injeção.
Algumas das vulnerabilidades típicas de programação incluem,
- Injeção de SQL (neutralização imprópria de elementos especiais usados em um comando SQL).
- Estouro de inteiro.
- Estouro de buffer (cópia do buffer sem verificar o tamanho da entrada).
- Cadeia de formato não controlada.
- Autenticação e autorização ausentes (autorização incorreta).
- Exposição de dados sensíveis.
- Tratamento de erros impróprio.
Alguns desses erros podem causar travamento do sistema, acesso imprevisto ao sistema e perda do controle do software para os hackers.
Erros de programação comuns a serem evitados
Alguns erros de programação comuns que precisam ser evitados estão listados abaixo:
- Neutralização imprópria de elementos especiais usados em um comando SQL (‘SQL Injection’).
- Cópia do buffer sem verificar o tamanho da entrada (‘Classic Buffer Overflow’).
- Autenticação ausente para função crítica.
- Autorização ausente ou incorreta.
- Uso de credenciais codificadas.
- Criptografia ausente de dados confidenciais.
- Upload irrestrito de arquivo com tipo perigoso.
- Confiança em entradas não confiáveis em uma decisão de segurança.
- Execução com privilégios desnecessários.
- Cross-Site Request Forgery (CSRF).
- Download do código sem verificação de integridade.
- Cálculo incorreto do tamanho do buffer.
- Restrição imprópria de tentativas de autenticação excessivas.
- Redirecionamento de URL para site não confiável ('Abrir Redirecionamento').
- String de formato não controlado.
- Uso de Hash unidirecional sem sal.
Lista de verificação para práticas de código seguro
Por último, mas não menos importante, depois de considerar todos os pontos acima dos aspectos de Desenvolvimento Seguro de Software, os Desenvolvedores precisam seguir o Lista de verificação estabelecida para as práticas de código seguro para garantir que nada seja esquecido. Dada a seguir são alguns, mas não uma lista exaustiva.
Validação de entrada:
- Não confie na entrada, considere a validação de entrada centralizada.
- Não confie na validação do lado do cliente.
- Tenha cuidado com os problemas de canonização.
- Restrinja, rejeite e higienize a entrada. Valide o tipo, comprimento, formato e intervalo.
Autenticação:
- Particionar o site por área anônima, identificada e autenticada.
- Use senhas fortes.
- Suporte a períodos de expiração de senha e desativação de conta.
- Não armazene credenciais (use hashes unilaterais com sal).
- Criptografe os canais de comunicação para proteger os tokens de autenticação.
- Passe cookies de autenticação de formulários apenas em conexões HTTPS.
Autorização:
- Use contas com menos privilégios.
- Considere a granularidade da autorização.
- Imponha a separação de privilégios.
- Restrinja o acesso do usuário aos recursos do nível do sistema.
- Use o protocolo OAuth 2.0 para autenticação e autorização.
- Validação da API de realização.
- Métodos permitidos na lista de permissões.
- Proteja ações privilegiadas e coleções de recursos confidenciais.
- Proteger contra falsificação de recursos entre sites (CSRF).
Gerenciamento de sessão:
- Crie um identificador de sessão no servidor.
- Encerre a sessão com o Logoff.
- Gere uma nova sessão na reautenticação.
- Defina o atributo 'seguro' para cookies transmitidos por TLS.
Criptografia:
- Use criptografia enquanto 'Dados em trânsito, Dados em armazenamento, Dados em movimento, Integridade de Mensagem'.
- Não desenvolva o seu próprio. Use recursos de plataforma experimentados e testados.
- Mantenha os dados não criptografados próximos ao algoritmo.
- Use o algoritmo e o tamanho da chave corretos.
- Evite o gerenciamento de chaves (use DPAPI).
- Ciclo suas chaves periodicamente.
- Armazene as chaves em um local restrito.
Registro e auditoria:
- Identifique o comportamento malicioso.
- Saiba como é um bom tráfego.
- Auditar e registrar a atividade em todas as camadas do aplicativo.
- Acesso seguro aos arquivos de log.
- Faça backup e analise regularmente os arquivos de log.
Codificação de saída:
qual é o melhor atualizador de driver
- Realize a 'validação de entrada (XML, JSON….).
- Use consulta parametrizada.
- Realize a 'validação do esquema'.
- Execute a codificação (XML, JSON ..).
- Envie cabeçalhos de segurança.
Referência: ' Lista de verificação de práticas de codificação segura OWASP (Resumindo, lista de verificação SCP) '
Resumo tabular da lista de verificação de codificação segura
A tabela abaixo resume o ‘Coisas para lembrar sobre o código seguro’ de um aplicativo.
# | O que? |
---|---|
7 | Para garantir que toda a equipe seja obrigada a aderir ao padrão de codificação segura. |
1 | Para entender claramente, 'O que é Código Seguro'? |
dois | Para entender as ‘Fontes das Vulnerabilidades’ comuns. |
3 | Para conduzir a 'Sessão de Conscientização de Segurança' para a equipe. |
4 | Para identificar e analisar 'Riscos e Valores Mobiliários' envolvidos na aplicação e métodos para 'Mitigar'. |
5 | Para ‘Treinar a Equipe’ em Padrões, Melhores Práticas e Diretrizes de Codificação Segura. |
6 | Para definir o 'Padrão de Codificação Segura' |
8 | Para usar a 'linguagem fácil de implementar' e ter um 'conhecimento profundo' dela. |
9 | Para usar ferramentas IDE (Integrated Development Environment) |
10 | Usar ‘analisadores estáticos e dinâmicos’ e ‘vários analisadores estáticos’ para eliminar ‘falsos positivos’ |
onze | Para realizar o 'Teste Manual' sempre que necessário para identificar o erro, perca. |
12 | Para definir um conjunto de 'Regras e recomendações de codificação segura' |
13 | Para realizar 'Testes de Conformidade de Conformidade' para as regras definidas. |
14 | Para entender o 'método inseguro de codificação' e coletar 'Erros comuns de programação'. |
quinze | Seguir estritamente a 'Lista de Verificação SCP' |
Conclusão
Esperamos que este tutorial seja seu melhor guia para garantir a segurança do software.
As diretrizes de codificação para o desenvolvimento de software seguro foram listadas aqui em termos simples, com exemplos para sua fácil compreensão do conceito.
Leitura feliz!!
Leitura recomendada
- Teste de segurança (um guia completo)
- As 30 melhores empresas de segurança cibernética em 2021 (empresas de pequeno a nível empresarial)
- Noções básicas de programação de computador para iniciantes | Tutorial de codificação
- Os 15 melhores editores de código gratuitos para uma experiência de codificação perfeita
- Tutorial de teste de injeção de SQL (exemplo e prevenção de ataque de injeção de SQL)
- Os desenvolvedores não são bons testadores. O que você diz?
- Formato do exame ISTQB Foundation e diretrizes para resolver documentos
- Diretrizes de teste de segurança de aplicativos móveis