Compartilhar via


Codificação para segurança renovável

Importante

Esta é a documentação do Azure Sphere (herdado). O Azure Sphere (herdado) será desativado em 27 de setembro de 2027 e os usuários devem migrar para o Azure Sphere (integrado) até esse momento. Use o seletor de versão localizado acima do sumário para exibir a documentação do Azure Sphere (Integrado).

O suporte para segurança renovável é uma das sete propriedades de dispositivos altamente protegidos. No Azure Sphere, isso significa que todo o software no dispositivo, incluindo seus próprios aplicativos, pode ser atualizado conforme necessário para resolver vulnerabilidades recém-descobertas. A segurança é a razão pela qual o Azure Sphere existe, e nunca é demais enfatizar que manter seu dispositivo seguro o tempo todo é fundamental. Não é possível escrever código totalmente seguro, mas com boas práticas de codificação, extrema diligência em responder a vulnerabilidades recém-descobertas e um compromisso com a segurança renovável, você pode garantir que o código do aplicativo de alto nível seja o mais seguro possível. O modelo de isolamento de aplicativo do Azure Sphere fornece vários recursos para garantir isso:

  • Todos os aplicativos devem ser assinados adequadamente antes de serem instalados ou executados.
  • Somente os recursos de hardware e endereços da Internet especificados no arquivo de manifesto do aplicativo do aplicativo podem ser acessados pelo aplicativo.
  • As APIs fornecidas pelo SDK do Azure Sphere incluem um subconjunto muito reduzido da biblioteca C padrão, omitindo possíveis falhas de segurança, como contas de usuário e acesso ao shell.
  • O sistema operacional do Azure Sphere e os aplicativos do cliente podem ser atualizados com segurança usando o Serviço de Segurança do Azure Sphere à medida que as preocupações de segurança são identificadas e resolvidas.

No entanto, a assinatura de código e a minimização da superfície de ataque levam você apenas até certo ponto. Seguir um conjunto de práticas recomendadas para o desenvolvimento seguro de software pode ajudar a garantir que os aplicativos que você assina sejam os mais seguros e protegidos possível. Este artigo descreve algumas das ferramentas que a equipe do Azure Sphere usa em suas próprias práticas de desenvolvimento.

Agende implantações regulares

O sistema operacional do Azure Sphere e o SDK do Azure Sphere são atualizados pelo menos trimestralmente. Você deve buscar um cronograma semelhante para implantações de seus próprios aplicativos.

Certifique-se de que sua cadeia de ferramentas permaneça atualizada

O sistema operacional e o SDK do Azure Sphere formam uma grande parte da cadeia de ferramentas do Azure Sphere, mas você pode ter outros componentes que gerencia separadamente. Certifique-se de verificar regularmente se há atualizações para esses componentes.

CVEs (vulnerabilidades e exposições comuns) são relatórios públicos usados para descrever uma vulnerabilidade de segurança em um sistema, inclusive no Azure Sphere. As atualizações do sistema operacional do Azure Sphere abordam regularmente os CVEs e ajudam a manter seus dispositivos seguros. Se possível, inclua verificações de CVEs em seus pipelines de build. Marque sites como a página inicial da CISA que rastreiam atualizações de segurança. Recompile e reimplante seus aplicativos à medida que atualiza sua cadeia de ferramentas.

Propagar e aderir aos padrões de codificação

O código que adere a um padrão conhecido é mais fácil de manter, mais fácil de revisar e mais fácil de testar. Existem padrões de codificação disponíveis publicamente para C. O MISRA está bem estabelecido e o CERT também possui um padrão de codificação para C. Além desses padrões básicos, recomendamos o uso do Ciclo de Vida de Desenvolvimento de Segurança sempre que possível.

Verifique se você está compilando com sinalizadores de segurança essenciais

Todos os aplicativos do Azure Sphere são criados com compiladores de linguagem C do GCC (Gnu Compiler Collection). O compilador C, gcc, fornece centenas de sinalizadores de compilador e vinculador. No Azure Sphere, os seguintes sinalizadores são usados por padrão:

  • -fstack-protector-strong: gera código para proteger contra ataques de quebra de pilha.
  • pie: gera executáveis independentes de posição.
  • fPIC: gera código independente de posição.

O -fstack-protector-all sinalizador fornece mais proteção do que -fstack-protector-strong, mas aumenta o uso da pilha de memória. Devido à memória limitada no hardware atual do Azure Sphere, -fstack-protector-all não é usado por padrão.

O Azure Sphere também usa vários sinalizadores de aviso, eles podem ser usados para identificar problemas com seu código durante a compilação que podem ser corrigidos antes da implantação:

-Wall -Wswitch -Wempty-body -Wconversion -Wreturn-type -Wparentheses -Wno-format -Wuninitialized -Wunreachable-code -Wunused-function -Wunused-value -Wunused-variable -Wstrict-prototypes -Wno-pointer-sign -Werror=implicit-function-declaration

Para maior segurança, -Wl,-z,now ou -Wl,-z,relro poderia ser adicionado, mas, novamente, eles não são usados por padrão porque causam uso extra de memória.

Revise todo o código

As revisões de código são uma ferramenta simples, mas eficaz, para garantir um código de alta qualidade. Recomendamos que nenhum código seja verificado sem uma revisão de código de um revisor qualificado. As revisões de código individuais, nas quais um desenvolvedor percorre o novo código com outro desenvolvedor, geralmente ajudam o desenvolvedor original a esclarecer o pensamento que entrou na produção do código. Isso pode revelar pontos fracos de design ou pontos de ramificação perdidos, mesmo sem nenhuma contribuição do desenvolvedor de revisão.

Use testes automatizados

Estruturas de teste automatizadas, como gtest, permitem que você execute conjuntos de funções de teste sempre que um projeto é criado. Uma prática recomendada é garantir que todo o código verificado seja acompanhado por pelo menos uma função de teste; mais geralmente é melhor. Tipos importantes de testes incluem o seguinte:

  • O teste de unidade básico executa cada parte do código para verificar se está funcionando conforme projetado. Casos de teste devem ser projetados para testar o código nas bordas; casos extremos e casos extremos geralmente são uma fonte frutífera de bugs.
  • O teste difuso exercita o código fornecendo entrada inesperada de vários tipos para garantir que a função responda adequadamente.
  • O teste de penetração é útil para identificar vulnerabilidades que permitem que invasores penetrem no aplicativo.

Usar analisadores de código estático

Os analisadores de código estático podem ajudar a encontrar vários problemas comuns de código. A maioria se concentra em tipos específicos de erros. As seguintes ferramentas gratuitas e de software livre estão entre as usadas pela equipe de desenvolvimento do Azure Sphere e alguns usuários do Azure Sphere:

A execução de algumas dessas ferramentas pode exigir a recompilação do aplicativo (ou partes dele) para um sistema operacional de destino diferente.

Remover código desnecessário

O SDK do Azure Sphere fornece uma versão simplificada das bibliotecas de desenvolvimento C padrão; Sempre que possível, você deve procurar oportunidades para remover seu próprio código ao essencial. Quanto menos linhas de código, menor a superfície de ataque estará disponível para possíveis ameaças. Avisos sobre código inacessível ou não utilizado podem ser usados para identificar código desnecessário.