Configurações avançadas de cookies
Para melhorar a sua experiência na plataforma e prover serviços personalizados, utilizamos cookies.
Notícias
[TLP:CLEAR]
Application Programming Interface (APIs) inseguras e seus riscos para as organizações públicas e privadas
Textos: João Alberto Muniz Gaspar
Produção: Secretaria de Segurança da Informação e Cibernética
1. Introdução
Uma interface de programação de aplicativos, ou simplesmente API ( Application Programming Interface ), tem por objetivo disponibilizar recursos de uma aplicação para serem usados por outra, abstraindo os detalhes da implementação e, muitas vezes, restringindo o acesso a esses recursos com regras específicas.
Um Web Service (Serviço Web ), que se caracteriza como uma API, é uma interface projetada para se comunicar via rede. Tipicamente, o protocolo HTTP é o mais utilizado, mas também pode ocorrer o uso de SOAP, REST e XML-RPC como meio de comunicação. A figura abaixo permite uma visão geral de um API e de um Web Service .
Inicialmente, a maioria das organizações usava as APIs em rede privada segura ou as acessava por meio de canais de comunicação seguros. Todavia, a transformação digital promoveu as APIs para uso remoto, particularmente para atender parceiros, fornecedores ou clientes.
2. Principais tipos de APIs
Existem seis tipos principais de APIs:
3. Formato de troca de dados (XML e JSON)
Os principais formatos de troca de dados usados no desenvolvimento de aplicativos da web são:
4. Protocolos e Arquiteturas de APIs
Atualmente, existem três categorias de protocolos ou arquiteturas de APIs:
O REST não é um protocolo ou padrão, mas sim um conjunto de princípios de arquitetura. É considerada a abordagem mais utilizada para a construção de APIs e possui uma arquitetura Cliente-Servidor. O cliente e o servidor comunicam-se via HTTP (protocolo de transferência de hipertexto), usando identificadores de recursos exclusivos ou Uniform Resource Indentifiers (URIs), operações básicas de persistência “criar, ler, atualizar, excluir” (ou CRUD, no acrônimo em inglês) e convenções JSON. Cliente e servidor devem ser independentes um do outro, ou seja, as alterações realizadas em um não podem afetar no outro. Além disso, o cliente deve armazenar em cache as respostas, o que contribui com uma experiência de usuário mais rápida e eficiente. O REST é direcionado a dados e necessita de baixa largura de banda.
O protocolo SOAP, por sua vez, possui um padrão altamente estruturado, rigidamente controlado e claramente definido, o que o torna bastante diferente da flexibilidade fornecida pela API REST. Devido às suas regras rígidas, a API SOAP é mais utilizada quando uma organização requer uma segurança rígida para troca de dados mais complexa. Assim, os desenvolvedores frequentemente usam SOAP para APIs internas ou de parceiros.
Já o protocolo RPC permite a execução remota de uma função num contexto externo ao seu, ou seja, permite que o cliente execute o código num servidor. O protocolo RPC pode utilizar tanto o XML quanto o JSON, e passa a ser classificado como:
5. Superfície de Ataque
As APIs evoluíram para um mecanismo importante para organizações e serviços, inserindo-se na cadeia de valor das instituições. As APIs tornaram-se um grande negócio – 83% das organizações consideram a integração de APIs uma parte crítica de sua estratégia de negócios, de acordo com o relatório “The State of API Integration 2020” (ver: https://cdn2.hubspot.net/hubfs/440197/2020-04%20-%20SOAI%20Report.pdf ).
De janeiro de 2019 a janeiro de 2020, ocorreu um aumento de mais de 100% no número de APIs disponíveis, passando de 17,4 milhões para 34,9 milhões. Em janeiro de 2021, o total ultrapassou 46 milhões de coleções (pacotes de APIs) (ver: https://knowledgeburrow.com/how-many-apis-are-there-in-2020/ ). De acordo com a pesquisa “ Evolution of API Security – A Practical Guide to Addressing API Threats in 2023 ” da Wallarm, aproximadamente 1,7 bilhões de APIs ativas deverão estar disponíveis em 2030 (ver: https://lab.wallarm.com/evolution-of-api-security-in-2023-a-practical-guide/ ).
As APIs que conectam aplicativos e dados corporativos à internet estão sujeitas às mesmas vulnerabilidades que os aplicativos web comuns e precisam ser abordadas com pelo menos o mesmo rigor. Na verdade, o acesso externo direto a atualizações de transações e de dados em massa que as APIs permitem sujeitam-nas a ameaças adicionais que os aplicativos web raramente encontram.
Segundo artigo publicado no site da Nordic APIs, uma pesquisa de 2020 da SlashData apontou que:
(ver: https://nordicapis.com/apis-have-taken-over-software-development/ )
Como resultado desse cenário, a superfície de ataque relacionada às APIs aumentou significativamente. Os ataques que exploram vulnerabilidades em APIs estão mais frequentes, o que gera a expectativa para acreditar que essas vulnerabilidades estarão entre os vetores mais comuns de violações de segurança em futuro próximo. Uma análise da Forbes, partindo de uma previsão do Gartner e usando várias fontes públicas, verificou que API tornou-se um do vetores mais usados em ataques envolvendo dados de aplicativos corporativos, com um aumento significativo do número de explorações ( exploits ) de APIs (ver: https://www.forbes.com/sites/forbestechcouncil/2022/07/25/how-to-address-growing-api-security-vulnerabilities-in-2022/?sh=512bae165a9e ), em especial as ameaças do tipo injeção (ver também: https://owasp.org/www-project-api-security/ ).
Embora existam padrões como o OpenAPI e o AsyncAPI, o uso de APIs ainda é bastante diversificado e cada API tem sua própria peculiaridade. Isso torna difícil para os provedores de serviços de aplicativos financeiros ou CRMs, por exemplo, fazer conexões confiáveis com outros provedores para atender aos requisitos de integração de seus clientes.
6. Principais Ameaças Cibernéticas
As ameaças que utilizam técnicas de injeção incluem dezenas de variações, desde as conhecidas SQL injection e injeções de comandos do sistema operacional até injeções de modelos do lado do servidor ou Server Side Template Injection (SSTI), como a vulnerabilidade log4shell, que permitiu aos invasores lançar ataques utilizando a falha do Log4J.
O formato de troca de XML para serviços web está sujeito a ataques XML External Entity Injection (XXE), que são possíveis quando uma aplicação resolve entidades externas arbitrárias definidas em um documento XML. Infelizmente, os analisadores XML comuns não são adequados para essa finalidade em sua configuração padrão, pois o principal problema, nesse caso, é que a expansão da entidade externa geralmente é habilitada por padrão. Somente com fortalecimento da proteção, desabilitando completamente tanto a possibilidade de expansão de entidades externas como a validação de arquivos Document Type Declaration (DTD) externos, os analisadores XML tornam-se seguros.
No caso da análise JSON, esta é quase sempre segura quando são utilizadas técnicas mais atuais em vez de JSONP ( JavaScript Object Notation com Padding ). A utilização do JSONP pode levar a ataques do tipo Cross-Site Request Forgery (CSRF), pois, como o elemento HTML < script > não respeita a política de mesma origem ( Same Origin Policy – SOP ) nas implementações do navegador da web , uma página maliciosa pode solicitar e obter dados JSON pertencentes a outro site . Isso permitirá que os dados codificados em JSON sejam avaliados no contexto da página maliciosa, possivelmente divulgando senhas ou outros dados confidenciais se o usuário estiver conectado ao outro site.
7. Diferenças entre a segurança cibernética tradicional e a segurança cibernética de API
As principais características da segurança web tradicional são:
As principais características de segurança de uma API que a distinguem da segurança web tradicional são:
8. Os riscos de segurança de APIs mais comuns
O aumento de ameaças de segurança relacionadas a APIs nos últimos anos levou o Open Web Application Security Project (OWASP) a lançar o projeto API Security Top 10 ( https://owasp.org/www-project-api-security/ ), que ajuda a aumentar a conscientização sobre os problemas mais sérios de segurança de APIs que afetam as organizações. Dentre os riscos apresentados pelo OWASP, os seguintes riscos devem ser abordados durante o desenvolvimento ou sempre que uma API for atualizada:
9. Métodos de Teste da Segurança de APIs
Podem-se utilizar os seguintes métodos para testar manualmente suas APIs em busca de vulnerabilidades de segurança:
Além de testes manuais, proteger API de produção, especialmente aquelas que têm um processo regular de desenvolvimento e de lançamento, requer o uso de ferramentas automatizadas. Existem no mercado diversas ferramentas de código aberto que podem ajudar a projetar cenários de teste relacionados à segurança, executá-los em terminais de APIs e corrigir problemas que forem descobertos. Essas ferramentas também podem descobrir vulnerabilidades de lógica de negócios.
10. Melhores Práticas para Segurança de APIs
As seguintes práticas podem auxiliar no processo melhoria da segurança das APIs de uma organização.
1) Manter o controle das APIs em um registro
Ninguém pode garantir o que não conhece, logo é essencial manter o controle de todas as APIs em um registro. Esse registro de APIs deve armazenar as características como nome, finalidade, carga útil, uso, acesso, data de ativação, data de desativação e proprietário. Isso evitará a existência de APIs de sombra ou silos que foram esquecidos, nunca documentados ou desenvolvidos fora de um projeto principal.
O registro dos detalhes das APIs auxilia:
Uma boa documentação é particularmente importante para desenvolvedores terceirizados que desejam incorporar essas APIs em seus próprios projetos. O registro da API deve incluir links para a documentação, a qual contém todos os requisitos técnicos da API, incluindo funções, classes, tipos de retorno, argumentos e processos de integração.
2) Adotar uma filosofia de confiança zero ( Zero-Trust Model – ZTM)
No modelo de segurança de perímetro, o que está "dentro" é confiável e o que está "fora" não é confiável. As redes não são mais tão simples, pois as ameaças internas tornaram-se predominantes e os usuários legítimos passaram a se conectar de fora do perímetro. Isso é especialmente verdadeiro para API públicas, com usuários de todo o mundo acessando componentes internos de software e dados sensíveis.
Uma filosofia de confiança zero (ZTM) muda o foco da segurança tradicional para os usuários, os ativos e recursos específicos. O ZTM ajuda a garantir que as APIs sempre autentiquem usuários e aplicativos (dentro ou fora do perímetro), que sejam fornecidos os privilégios mínimos de que as APIs realmente precisem para desempenhar suas funções e que permitam o devido monitoramento de comportamento anômalo.
3) Identificar os riscos das APIs
A única maneira de proteger efetivamente uma API é entender quais partes de seu ciclo de vida são inseguras. Isso pode ser complexo, especialmente se uma organização opera um grande número de APIs. É importante considerar todo o ciclo de vida. Toda API deve ser tratada como um artefato de software , que passa por todos os estágios de um produto de software , desde o planejamento até o desenvolvimento, teste, preparação e produção.
Logo, uma das mais importantes práticas de segurança é realizar uma avaliação de risco para todas as APIs da organização (existentes ou em uso). Assim sendo, devem ser estabelecidas medidas para garantir que as APIs atendam às políticas de segurança e não sejam vulneráveis a riscos conhecidos. A lista de vulnerabilidades " Top 10 " do OWASP ( https://owasp.org/www-project-api-security/ ) é um bom recurso para manter o controle sobre ataques existentes e software mal-intencionado.
Uma avaliação de risco também deve identificar todos os sistemas e os dados que podem ser afetados a partir do comprometimento de uma API e, em seguida, delinear um plano de tratamento com os controles necessários para reduzir quaisquer riscos a um nível aceitável.
Também é necessário documentar as datas de revisão e repetir as avaliações, sempre que surgirem novas ameaças ou quando uma API for modificada. Esta documentação deve ser revisada antes de quaisquer alterações de código subsequentes, para garantir que os requisitos de segurança e de manipulação de dados não sejam comprometidos.
4) Controlar o acesso aos recursos da API
Para controlar o acesso aos recursos da API, deve-se identificar todos os usuários e dispositivos relacionados. Isso normalmente requer que os aplicativos do lado do cliente incluam um token na chamada de API, para que o serviço possa validar o cliente.
Uma forma de controlar o acesso a API é a utilização de padrões, como OAuth 2.0, OpenID Connect ou tokens da Web JSON para:
Além disso, sempre deve ser utilizado o princípio do privilégio mínimo (PoPL), de forma a impor mecanismos que apenas as permissões necessárias sejam atribuídas aos usuários.
Todas as APIs devem ser mantidas, sempre que possível, atrás de um firewall , que pode ser um firewall de aplicativo da Web (WAF) ou gateway de API, acessado por meio de um protocolo seguro, como HTTPS, para fornecer proteção de linha de base, como a verificação de ameaças baseadas em assinatura e os ataques baseados em injeção.
5) Implementar limitação de taxa e verificação de geovelocidade nas APIs
Para manter a disponibilidade, os serviços compartilhados precisam se proteger contra o uso excessivo, pois mesmo os sistemas altamente escalonáveis devem ter limites de consumo em algum nível.
Por esse motivo, devem ser aplicadas uma limitação de taxa e verificações de velocidade geográfica nas APIs, como medidas de defesa. Isso auxilia na redução da superfície de ataque, evitando que as APIs sejam sobrecarregadas com requisições, reduzindo, dessa forma, a possibilidade de ataques de negação de serviço (DoS).
As verificações de velocidade geográfica fornecem autenticação baseada em contexto, analisando a taxa de acesso com base na velocidade de tráfego exigida entre as tentativas de login anteriores e as atuais.
Todas essas verificações devem ser aplicadas pelo código de middleware que faz parte do aplicativo da API. O middleware lida com as solicitações antes de encaminhá-las para atendimento.
6) Criptografar todas as requisições e respostas via API
Todos os dados gerenciados por uma API, especialmente informações de identificação pessoal ( Personal Identification Information - PII) ou outros dados confidenciais protegidos por normas e regulamentos de conformidade, devem ser criptografados.
Deve-se implementar criptografia para os dados em repouso, a fim de garantir que invasores que comprometam o servidor de APIs não possam utilizá-los.
Todo tráfego de rede deve ser criptografado usando o Transport Layer Security (TLS), principalmente em solicitações e respostas de API, pois provavelmente conterão credenciais e dados confidenciais. Também deve ser exigido assinaturas para garantir que apenas usuários autorizados possam descriptografar e modificar os dados fornecidos por sua API.
Por fim, habilitar o HTTP Strict Transport Security (HSTS) sempre que possível é melhor do que redirecionar o tráfego HTTP para HTTPS, pois os clientes da API podem não se comportar conforme o esperado.
7) Validar todos os dados obtidos via API
Nunca se deve assumir que os dados obtidos via API foram limpos ou validados corretamente. Toda organização deve implementar suas próprias rotinas de limpeza e de validação de dados no lado do servidor para evitar falhas de injeção padrão e ataques de falsificação de solicitação entre sites. O uso de ferramentas de depuração ajuda a examinar o fluxo de dados da API e a rastrear erros e anomalias.
8) Compartilhar apenas a informação necessária numa API
As respostas de uma API geralmente incluem um registro de dados inteiro, em vez de apenas os campos relevantes, contando com o aplicativo cliente para filtrar o que um usuário tem acesso. Isso não é uma boa prática de programação, pois apesar de diminuir os tempos de resposta também fornece aos invasores informações adicionais sobre a API e os recursos que ela acessa.
Ao desenvolver uma API, deve-se garantir que as respostas contenham apenas as informações mínimas necessárias para atender uma solicitação.
9) Decidir sobre o uso de SOAP ou REST
Como visto anteriormente, as opções dominantes para acessar serviços web são o SOAP, que é um protocolo de comunicação, e a REST API (ou RESTful API), que é um conjunto de princípios arquitetônicos para transmissão de dados.
SOAP e REST usam formatos e semânticas diferentes, bem como exigem estratégias diferentes para garantir uma segurança robusta.
A segurança SOAP é aplicada no nível da mensagem, usando assinaturas digitais e partes criptografadas dentro da própria mensagem XML. A REST depende muito das regras de controle de acesso associadas ao identificador de recurso universal da API, como tags HTTP e o caminho da URL.
É recomendável utilizar o SOAP se as principais preocupações forem padronização e segurança. Embora ambas as opções suportem Secure Sockets Layer/Transport Layer Security (SSL/TLS), o SOAP também suporta Web Services Security , verificação de identidade por meio de intermediários, em vez de apenas verificação ponto a ponto fornecida por SSL/TLS, e tratamento de erros integrado. No entanto, o SOAP expõe os componentes da lógica do aplicativo como serviços, em vez de dados, o que pode torna-lo complexo de implementar e pode exigir que vários aplicativos sejam refeitos.
A REST, por sua vez, é compatível com vários tipos de saída de dados – incluindo JSON, valores separados por vírgula (CSV) e HTTP –, enquanto o SOAP só pode lidar com XML e HTTP. Além disso, a REST apenas acessa dados, portanto é uma maneira mais simples de acessar serviços da web . Por esses motivos, as organizações geralmente preferem REST para projetos de desenvolvimento web . No entanto, a segurança deve ser incorporada para trocas de dados, para implantação da API no ambiente e para interação com os clientes.
10) Armazenar as chaves de API
As chaves de API identificam e verificam o acesso do aplicativo ou do serviço que chama uma API. Elas também podem bloquear ou limitar as chamadas feitas para uma API e identificar padrões de uso.
As chaves de API são menos seguras do que os tokens de autenticação e requerem um gerenciamento cuidadoso. Não se deve incorporar essas chaves diretamente em seu código ou em arquivos na árvore de origem do aplicativo, onde podem ser expostas acidentalmente.
Como melhores práticas, as chaves de API podem ser armazenadas em variáveis de ambiente ou em arquivos fora da árvore de origem do aplicativo, ou, ainda, ser utilizado um serviço de gerenciamento de chaves, como o cofre de chaves, que proteja e gerencie todas as chaves de API de um aplicativo.
Mesmo com essas medidas em vigor, devem ser excluídas todas chaves desnecessárias, a fim de minimizar a superfície de exposição a ataques, além de realizar a troca periódica das chaves, especialmente se houver a suspeita de que ocorreu uma violação.
11. Considerações finais
À medida que as organizações continuam a dividir aplicativos monolíticos em microsserviços e avançam no caminho nativo da nuvem, o uso de APIs continuará a crescer e suas vulnerabilidades serão mais exploradas.
A aplicação de melhores práticas de segurança auxilia na segurança no uso de APIs, além de ajudar a fortalecer a infraestrutura de aplicativos.
Além disso, é imperativo que os responsáveis por aplicações web no âmbito da administração pública federal tomem conhecimento dos seguintes guias de autoria da Secretaria de Governo Digital - SGD:
Vale ressaltar que o Departamento de Segurança da Informação e Cibernética (DSIC) também recomenda aos usuários das diversas organizações, além das recomendações apresentadas nesta OSIC, que:
Outras Orientações de Segurança da Informação e Cibernética (OSICs) estão disponíveis em https://www.gov.br/gsi/pt-br/composicao/SSIC/dsic/osic e propostas de temas, sugestões ou outras contribuições para serem abordadas em futuras OSICs podem ser encaminhadas ao e-mail educa.si@presidencia.gov.br .
[TLP:CLEAR]