O Subresource Integrity (SRI) é uma técnica que pode ajudar a proteger aplicações na web contra ataques originados de fornecedores de conteúdo. Ao utilizar javascript de fontes externas em seu website, por não possuir o controle do servidor ou CDN que está hospedando o conteúdo, estará confiando em dados de terceiros sem qualquer garantia de que o conteúdo será servido conforme o esperado. Se a fonte externa for comprometida, o website poderá ser desfigurado ou usado para espalhar malwares. Embora pareça um ataque hipotético, este problema já ocorreu antes em muitas empresas, abaixo demonstramos um exemplo de caso real e como utilizar este recurso.
Você também pode ouvir esse conteúdo:
Desenvolvimento
Em 2018, os pesquisadores da RiskIQ Inc. descobriram que o “MageCart”(termo guarda-chuva utilizado para definir ao menos 7 grupos de fraudadores) estava executando uma campanha digital de clonagem de cartão de crédito, que resultou em uma violação na empresa Ticketmaster. Os pesquisadores identificaram que um fornecedor de funcionalidades web conhecido como Inbenta, utilizado para processamento de linguagem para responder às perguntas dos usuários, havia sido comprometido, permitindo que invasores roubassem informações de cartão de crédito dos usuários.
Como parte do ataque que resultou na violação da Ticketmaster, a Magecart comprometeu a Inbenta e inseriu JavaScript malicioso no código JavaScript da Inbenta, que é usado pelo site da Ticketmaster. O JavaScript malicioso funcionava como um registrador de chaves, portanto, todos os dados enviados ao site também eram enviados para um servidor gerenciado pelo invasor, permitindo que a Magecart roubasse informações de cartão de crédito.
No entanto, a loja de comércio online Newegg também foi vítima de um ataque semelhante realizado pelo MageCart, a imagem abaixo mostra o código injetado pelos atacantes, que envia as informações do cartão de crédito para um domínio controlado pelos crackers (neweggstats.com):
O domínio registrado através do serviço Namecheap três dias antes do ataque ainda conta com um certificado TLS, permitindo ofuscar os dados que estavam sendo enviados, prática comum entre o grupo.
Desde cerca de 2015, o MageCart foi observado modificando ou injetando códigos JavaScript em páginas web de pagamento de várias organizações para roubar dados de cartão de crédito e PII de clientes. Com base nos detalhes atualmente disponíveis, geralmente, serviços de terceiros comprometidos ou o comprometimento do servidor web do alvo foi o vetor de infiltração inicial.
Solução: Subresource Integrity (SRI)
Nesse sentido, uma solução efetiva para prevenir ataques de comprometimento de arquivos JavaScript é a implementação da funcionalidade de integridade de sub-recursos (SRI). Essa medida de segurança consiste em gerar um hash criptográfico do arquivo JavaScript original, comparado com o hash do arquivo recebido pelo navegador. Caso os hashes não coincidam, a execução do código JavaScript adulterado é bloqueada pelo navegador, garantindo a integridade dos sub-recursos utilizados pelo website.
Como utilizar o Subresource Integrity (SRI):
Como seu conceito, a implementação do SRI é relativamente simples e feita através do atributo “integrity” nos elementos <src> ou <link>, o valor do atributo é composto por um prefixo do algoritmo de hash utilizado, seguido de um traço e o valor hash codificado em base64. O exemplo abaixo mostra o uso do SRI na inclusão do bootstrap via CDN:
<script src=”https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js” integrity=”sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4″ crossorigin=”anonymous”></script>
Dessa forma, o navegador fará o download do arquivo e, antes de executá-lo, calculará o hash em base64 e, em seguida, usará o algoritmo de hash para confirmar se o hash de fato corresponde ao arquivo.
No entanto, é importante observar que o serviço terceirizado que entrega seu arquivo deve oferecer suporte ao CORS para funcionar corretamente com o SRI. O atributo “crossorigin” informa ao navegador para buscar o arquivo de uma forma que permita a leitura posterior, falhando se o CORS não for suportado. Felizmente, muitos CDNs já habilitam o CORS por padrão.
Gerando hashes SRI
Existem algumas maneiras para gerar o hash SRI, a primeira é usando uma linha de comando
Com openssl:
cat ExternalFile.js | openssl dgst -sha384 -binary | openssl base64 -A
Com shasum:
shasum -b -a 384 ExternalFile.js | awk ‘{ print $1 }’ | xxd -r -p | base64
Como alternativa, você pode usar uma ferramenta chamada srihash.org, é a maneira mais fácil, basta colar a URL do arquivo e a aplicação gerará o código automaticamente.
SRI e CSP
Além disso, outra coisa interessante a se notar é que você pode usar o SRI dentro de sua política de segurança de conteúdo (CSP), você pode definir quais tipos de arquivos você deseja aplicar a verificação de integridade na aplicação. Por exemplo, se você deseja que todos os arquivos JavaScript utilizem a checagem de integridade SRI, pode-se utilizar o seguinte cabeçalho:
Content-Security-Policy: require-sri-for script;
Também é possível combinar script e estilo em uma única regra, abrangendo todos os arquivos JS e CSS:
Content-Security-Policy: require-sri-for script style;
Conclusão
Por fim, carregar recursos externos na aplicação pode apresentar um potencial risco, mesmo que confie na fonte, ninguém sabe se ela sofrerá uma violação, usando o atributo de integridade é possível garantir que nenhum código malicioso de um arquivo de terceiros seja executado. Este recurso é mais uma pequena peça na cadeia de segurança para estar um passo à frente das ameaças e deve ser considerado em seu processo de desenvolvimento seguro, além de ser mais um atributo que pode ser utilizado em testes de metodologia SCA (Software Composition Analysis).
Referências
- Inside Magecart
- Magecart: Javascript Injection used to breach Newegg, steal PCI
- Magecart claims another victim in Newegg merchant data theft
- Subresource Integrity
- Ticketmaster Chat Feature Leads to Credit-Card Breach
