A codificação segura de qualquer aplicativo ou serviço é sempre importante, e vital em sistemas que processam dados pessoais
Quando a CAST fez a sua pesquisa sobre o estado da segurança de software, encontrou 1,3 milhão de vulnerabilidades nos códigos analisados.
O gerenciamento de identidade é indiscutivelmente o serviço de maior risco. O roubo de identidade persegue todos nós. A Javelin Research informou sobre o roubo de identidade por vários anos e sua pesquisa mostra que ele continua a atormentar a indústria. Em seu relatório 2018 Identity Fraud, a empresa de consultoria descreveu as estatísticas de 2017 como estando em um nível recorde.
No gerenciamento de identidade, muitas vezes falamos sobre “weaponizing identity”. Isso significa fortalecer o sistema em pontos de acesso e onde os usuários interagem com o serviço. No entanto, o processo de weaponize precisa ser colocado em camadas e uma dessas camadas é o próprio código.
Codificação segura para gerenciamento de identidade
As plataformas de identidade digital podem ser muito complexas, pois geralmente precisam contar com fontes de dados externas e integrá-las a APIs de terceiros. As versões do gerenciamento de identidade e acesso (IAM) no segmento de consumo podem ser ainda mais complexas. Eles podem exigir funcionalidades estendidas para carregar, armazenar e compartilhar documentos e imagens. Muitos serviços de identidade também incorporam ou são totalmente baseados em aplicativos para dispositivos móveis. Não é suficiente confiar na segurança inerente dos protocolos que se comunicam entre os componentes de um ecossistema de identidade. O código subjacente deve ser o mais seguro possível, sem restringir a funcionalidade desse ecossistema.
Aqui estão algumas das melhores práticas de codificação seguras para usar ao desenvolver uma plataforma de identidade.
1. Use bons recursos: Comece com o recurso de codificação segura 101, Open Web Application Security Project (OWASP). Seu ” Guia de Referência Rápida” para codificação segura é um ótimo lugar para começar e usar como uma ferramenta de verificação dupla durante o desenvolvimento.
2. Use técnicas de programação defensiva. Isso ajuda a evitar erros exploráveis. Um exemplo é em comparações de equivalência: coloque a constante primeiro. Isso irá disparar um erro na compilação ou tempo de execução se você acidentalmente escrever equals no lugar de equality operator. Por exemplo:
3. Higienize os dados: A identidade digital, especialmente os sistemas para consumidores, geralmente chamam fontes de dados externas. Todos os dados de fontes externas ou fornecidos por um usuário não devem ser confiáveis. Para clientes da Web, isso inclui dados obtidos da string de consulta ou parâmetros de hash, cookies, armazenamento local, etc. Para aplicativos do lado do servidor, isso inclui dados fornecidos via POST, GET, cookies etc. Os aplicativos nativos geralmente leem arquivos de configuração, que podem ser adulterados deliberadamente.
Em todos os casos, a primeira linha de defesa é a higienização: verifique se apenas os caracteres permitidos foram incluídos. Isso inclui garantir que os comprimentos máximos dos campos de dados sejam verificados para evitar ataques de estouro de buffer.
Outra área importante para a verificação de segurança em uma plataforma de identidade digital é o upload de imagens. As imagens estão se tornando mais importantes nos serviços IAM e CIAM, pois os armazenamentos de dados armazenam e compartilham fotos de documentos de identificação. O upload de arquivos pelo usuário, como imagens, pode ser particularmente perigoso. Eles devem ser rigorosamente verificados para garantir que sejam realmente imagens e não tenham conteúdo executável oculto.
4. Triagem: o armazenamento de documentos e outros arquivos é uma parte importante de um ecossistema de identidade digital. Todos os dados a serem colocados no armazenamento devem ser rastreados para identificação de algum possível executável. Isso se aplica independentemente da tecnologia de banco de dados subjacente. Por exemplo, embora os bancos de dados non-SQL não sejam vulneráveis a ataques por injeção de SQL, eles possuem suas próprias vulnerabilidades.
5. Filtro: Da mesma forma, nunca aceite strings de comando externas diretamente. Sempre passe por um filtro para verificar se um comando é válido e aplicável no contexto.
6. Evitar a execução de código não verificado: Evite o uso de funções do tipo eval (), pois elas permitem a execução de código não verificado. Isso inclui o uso de funções que possuem eval () ocultas, como o SetTimer () do JavaScript.
7. Resiliência é o rei: Desenvolver serviços de identidade digital focados no consumidor muitas vezes significa que você precisa cobrir uma ampla demografia. Você precisa permitir valores amplos. Tente codificar seu aplicativo com resiliência em mente para que, por exemplo, ele não caia ou permita a injeção de código se os valores de dados externos estiverem fora dos intervalos ou valores esperados. Uma boa unidade ou teste funcional geralmente detecta esses problemas.
8. Tome cuidado ao usar código aberto: Permitir o uso da versão mais recente do código-fonte aberto em compilações resultou na inclusão de malware nos produtos. Ao usar pacotes de software livre, evite o uso de versões não verificadas definindo o número da versão específica no gerenciador de pacotes. Os processos de compilação devem incluir uma verificação de hash de todos os arquivos externos.
9. Respostas de erro: As respostas de erro são uma parte vital de um serviço de identidade digital, pois informam o usuário sobre os problemas e melhoram a usabilidade. No entanto, eles podem ser usados por entidades maliciosas para descobrir o comportamento de um sistema. Assegure-se de que essas informações não vazem para um invasor. As respostas de erro cliente-servidor devem incluir apenas um mínimo de informações para informar o usuário e não ajudar um invasor.
10. Use logs de auditoria: Se ocorrer um ataque, você vai querer saber o que aconteceu e como. No entanto, seja sensato com o registro – o preenchimento de logs com dados de auditoria sem sentido pode ser contraproducente.
11. Assinaturas digitais: Sempre que possível, use assinaturas digitais para verificar a integridade dos dados. Os HMACs são baratos para computar e valiosos para esse propósito. Da mesma forma, se os dados forem sensíveis, incluindo dados pessoais, isso deve ser criptografado durante o transporte e o armazenamento. Sempre use TLS para qualquer coisa transmitida em redes públicas ou privadas.
12. Fichas para comunicações seguras: Para comunicações entre processos, considere o uso de tokens no lugar da autenticação de senha.
13. Aplicativos para dispositivos móveis: os apps para dispositivos móveis estão sendo usados cada vez mais como um canal para provas e transações de identidade digital. Suponha que o dispositivo possa ser desbloqueado. Examine cuidadosamente os dados que você está manipulando e avalie os riscos envolvidos. Considere incorporar o código de detecção de jailbreak sempre que possível.
14. Verifique se há vulnerabilidades: isso deve ser feito sempre que uma nova atualização ou liberação é feita. Existem várias empresas especializadas que podem fornecer esse serviço. Empresas como a CheckMarx ou a CAST oferecem um serviço independente de análise de código fonte. Tais soluções são uma parte importante de qualquer prática de codificação segura, embora não devam ser consideradas como um substituto para o exame manual de código, e sim uma camada adicional de verificações.
15. O mais importante de tudo: mantenha-se atualizado com as vulnerabilidades emergentes. Falhas sérias estão sempre aparecendo como Detalhes CVE atestam. É importante estar ciente das novas ameaças e agir para garantir que elas não estejam presentes em seu código.
A codificação segura de qualquer aplicativo ou serviço é importante, mas é vital em sistemas que processam dados pessoais. Se você projetar ou desenvolver sistemas de identidade digital, a segurança e a usabilidade sempre serão um ato de equilíbrio difícil. No entanto, com boas práticas de codificação seguras, você pode gerenciar a ameaça de um ataque cibernético e, ao mesmo tempo, garantir a funcionalidade complexa de um sistema de identidade voltado para o consumidor.
FONTE: Portal CIO – Susan Morrow, CSO/EUA