Estou trabalhando em um cenário em que alguns arquivos JavaScript devem ser hospedados em um CDN. Desejo ter algum mecanismo para que, quando esses arquivos forem baixados no lado do usuário, eu possa garantir que os arquivos não foram adulterados e, de fato, vêm do CDN especificado.
Eu entendo que a tarefa é muito fácil se eu estiver usando SSL, mas ainda assim, quero garantir que os arquivos certos sejam servidos mesmo em HTTP sem SSL.
Tanto quanto eu pude pesquisar, não há mecanismo existente, como assinatura digital para arquivos JavaScript, que seja compatível com várias plataformas. Talvez não seja necessário?
Existe algum método embutido nos navegadores para verificar o autor dos arquivos JavaScript? Há algo que eu possa fazer para fazer isso de maneira segura?
fonte
Respostas:
Na verdade, um recurso como esse está sendo elaborado atualmente com o nome de Integridade de sub-recursos . Observe o
integrity
atributo da<script>
tag. Embora ainda não seja totalmente adotado em todo o quadro , ele cumpre exatamente esse propósito.Fonte
Fonte
Exemplo:
Observe, entretanto, que isso não o protegerá contra ataques do Man in the Middle se você estiver transferindo seus recursos via HTTP simples. Nesse caso, o código hash pode ser falsificado pelo invasor, tornando inútil a defesa contra arquivos de script manipulados.
Por esse motivo, você deve sempre usar conexões HTTPS seguras em vez de HTTP simples, além das medidas de segurança descritas acima.
fonte
https://code.jquery.com/
qualquer pessoa que comprometacode.jquery.com
poderá executar XSS em seu site, independentemente de estar ou nãocode.jquery.com
sendo acessado por HTTPS. Com essas verificações, o invasor pode apenas impedir o carregamento dos scripts, não substituí-los por scripts maliciosos.Você está procurando verificações de integridade de sub-recursos .
Por exemplo, aqui está o snippet jQuery CDN:
fonte
code.jquery.com
. Isso pode protegê-lo de um comprometimentocode.jquery.com
.Isenção de responsabilidade: como sempre, você só deve considerar esses mecanismos como tendo alguma utilidade ao usar https, pois eles podem ser facilmente desabilitados via MitM com http
Além do mecanismo nas respostas acima, você também pode usar os cabeçalhos de resposta http da política de segurança de conteúdo na página pai.
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
Este mecanismo já existe há algum tempo, então o suporte do navegador é provavelmente muito bom, mas certifique-se de verificar.
Além disso, se você quiser garantir que navegadores não compatíveis mais antigos não sejam inseguros, inclua um script de redirecionamento síncrono na parte superior da página que não seja permitido pela política.
fonte
Há um ponto importante sobre o que esse tipo de assinatura pode e não pode fazer. Ele pode proteger o usuário de ataques hipotéticos nos quais alguém modifica seu código. Ele não pode garantir ao seu site que seu código seja o código que está sendo executado. Em outras palavras, você ainda não pode confiar em nada que venha do cliente ao seu site.
fonte
Se o modelo do seu adversário permite que um invasor modifique os arquivos JavaScript à medida que são entregues a partir de um CDN, o modelo do seu adversário permite que um invasor modifique a fonte de referência à medida que é entregue para remover qualquer tentativa de verificação, para alterar o endereço de origem para outro que não o CDN e / ou para remover a referência ao JavaScript inteiramente.
E não vamos abrir a lata de vermes de como seu aplicativo pode determinar se o resolvedor do usuário está ou não resolvendo corretamente para o CDN por meio de solicitações HTTP (ou qualquer outro mecanismo que não tenha uma cadeia de confiança verificada).
/ etc / hosts:
fonte
Você pode garantir isso com Subresource Integrity. Muitos CDNs públicos incluem hashes SRI no código incorporável oferecido em sites de CDN. Por exemplo, em PageCDN, quando você clica no arquivo jquery no jQuery CDN página, você tem a opção de copiar a URL ou usar a tag script que contém hash de SRI como abaixo:
No carregamento da página, o navegador emitirá uma solicitação para este recurso e, na conclusão da solicitação, ele combinará o hash do arquivo recebido com aquele fornecido como o valor de integridade na tag de script. Se os dois hashes não corresponderem, o navegador descartará o arquivo jquery.
No momento, esse recurso é compatível com 91% dos navegadores em todo o mundo. Mais detalhes sobre caniuse .
fonte