Skip to main content

Como implantar um aplicativo Jamstack com Vue.js no Netlify e receber atualizações de segurança automáticas do Snyk

Escrito por
Blog illustrations netlify feature

24 de setembro de 2020

0 minutos de leitura

Quer aprender conceitos de segurança front-end e também descobrir como implantar um site estático no Netlify? Quer saber como detectar e corrigir automaticamente dependências JavaScript vulneráveis?

Vamos começar.

Neste artigo, vamos usar:

  • Netlify - uma plataforma para criar e implantar seus sites instantaneamente em uma rede global.

  • Snyk.io - uma plataforma de segurança que prioriza os desenvolvedores e protege bibliotecas open source, contêineres e aplicações nativas da nuvem.

  • Vue.js - um framework progressivo de JavaScript.

  • Vuetify - um framework de componentes de UI com Material Design para aplicativos Vue.js.

Uma ótima maneira de aprender novos conceitos é colocando a mão na massa. E que forma melhor de aprender sobre alguns tópicos de segurança front-end do que jogar Bingo?

Então, é isso: vamos implantar um jogo de Bingo de segurança front-end. Como ganhar? As regras são simples: marque todas as práticas que sua equipe ou seus projetos open source seguem. Marcou todas? Você ganhou!

Veja uma captura de tela do Bingo de segurança front-end em ação.

Página do Frontend Security Bingo exibindo cartões com práticas de segurança, incluindo segurança de frameworks, vulnerabilidades em JavaScript, cabeçalhos HTTP e DevSecOps.

Implantação no Netlify

Para disponibilizar o site estático, vamos implantá-lo no Netlify, uma das ferramentas preferidas e otimizadas para hospedar sites Jamstack.

Com o Netlify, você pode implantar um site de duas maneiras:

  1. Conecte o repositório de um projeto pela interface do Netlify. Essa opção é útil se você quiser usar um modelo de implantação contínua, no qual o Netlify acompanha as alterações feitas no controle de versão e sempre implanta o site quando há mudanças. Nesse caso, a configuração do Netlify executa a ferramenta de build escolhida para criar o site estático e, em seguida, o Netlify o implanta.

  2. Use a CLI do Netlify para implantar o site diretamente pela linha de comando. É uma maneira fácil e acessível de começar, pois você pode iniciar uma implantação rapidamente, direto do espaço de trabalho do projeto na sua máquina de desenvolvimento.

Vamos usar a primeira opção e implantar o jogo Bingo de segurança front-end diretamente de um repositório.

Para começar, faça login ou crie uma conta no Netlify:

Página da Netlify com o título “Thanks a million”, estatísticas sobre desenvolvedores, botões de chamada para ação e uma ilustração de pessoas ao redor de um gráfico da Netlify.

Em seguida, importe o repositório do projeto do seu site pelo GitHub, GitLab ou Bitbucket.

Tela “Criar um novo site” do Netlify, mostrando a configuração de implantação contínua com opções para GitHub, GitLab e Bitbucket

No meu caso, o repositório está no GitHub. O processo é:

  1. Clique em GitHub

  2. Autorize o aplicativo Netlify a acessar sua conta do GitHub

  3. Escolha o repositório do site na lista

Se aparecer a mensagem No repositories found, clique em Configure Netlify on GitHub e instale o aplicativo Netlify no perfil da conta do GitHub desejada. Depois disso, você poderá instalá-lo em todos os repositórios ou escolher especificamente o repositório do site.

Ao concluir, a tela deverá ficar assim. Aí, podemos começar a fazer implantações e conectar alguns plugins de build:

Tela “Create a new site” do Netlify, exibindo a busca de repositórios do GitHub por “bingo” e o repositório frontend-security-bingo.

Clique na entrada do site chamada frontend-security-bingo para concluir a configuração e, em seguida, clique no botão Deploy:

Página de configurações de implantação do Netlify, mostrando o repositório, a branch master, o comando de build, o diretório de publicação e o botão Implantar site

O Netlify começará clonando o repositório, instalando as dependências e fazendo o build do site. Quando terminar, ele fornecerá um URL temporário para o site, que você poderá personalizar.

Em poucos segundos, nosso jogo Bingo de segurança front-end fica disponível em https://frontend-security-bingo.netlify.app.

Painel do Netlify mostrando o site frontend-security-bingo implantado, orientações de configuração e uma implantação de produção publicada

Parece que terminamos, certo?

Não exatamente. Ainda falta mais uma coisa.

Uma vulnerabilidade de segurança JavaScript no meu site

É um site estático e pequeno. Como assim, ele pode ter vulnerabilidades de segurança JavaScript?

Nem estou usando tantas dependências. Na verdade, meu projeto tem apenas duas dependências de produção. Este é o package.json do site, que mostra a estrutura inicial criada pelo CLI do Vue.js quando iniciei o projeto:

Editor de código exibindo o package.json de um projeto Vue, com a dependência Vuetify destacada e um aviso indicando uma vulnerabilidade.

Parece que o Vuln Cost (uma extensão do VS Code que uso) está me avisando que, na linha 12, há uma dependência no meu projeto com uma vulnerabilidade de segurança.

Você costuma ignorar esses alertas? Sei que fazer a triagem de vulnerabilidades pode parecer complicado, mas, ao adotar ferramentas e fluxos de trabalho mais adequados ao seu desenvolvimento, tudo fica mais fácil. Com a Snyk, você conta com:

  • Banco de dados de vulnerabilidades - todos os usuários da Snyk, do plano gratuito ao pago, têm acesso ao banco de dados de inteligência sobre vulnerabilidades da Snyk. O banco é mantido por uma equipe experiente de pesquisadores de segurança da Snyk, que garante ampla cobertura de vulnerabilidades e poucos falsos positivos. Ele inclui 370% mais vulnerabilidades do que os conjuntos de dados CVE.

  • Monitoramento - As análises pontuais são uma ótima forma de começar a proteger seus projetos open source, mas aplicações reais exigem monitoramento contínuo para garantir que novas vulnerabilidades de segurança gerem alertas e, melhor ainda, correções automáticas em pull requests. Assim, você corrige as vulnerabilidades com um merge.

Ao expandir o erro em linha do Vuln Cost, vemos que é uma vulnerabilidade de gravidade média que afeta o framework de UI Vuetify para Vue.js. Ignorá-la não é uma boa ideia.

Editor de código exibindo o package.json com um alerta do Snyk informando que o Vuetify 2.1.8 tem uma vulnerabilidade de gravidade média

Topa um desafio rápido?

O site ativo em https://frontend-security-bingo.netlify.app/ contém essa vulnerabilidade JavaScript não corrigida do Vuetify. Você consegue encontrá-la?

Dica: é uma vulnerabilidade de Cross-site Scripting (XSS) em JavaScript que afeta versões do Vuetify anteriores à 2.1.9. Saiba mais na Snyk Vulnerability Database. Acesse os recursos de segurança da Snyk para entender melhor as vulnerabilidades de Cross-site Scripting e descobrir como elas são comuns até mesmo em aplicações web desenvolvidas em 2020.

Vou explicar como funciona essa vulnerabilidade.

Na parte inferior do site Bingo de segurança front-end, você encontra uma caixa para compartilhar o site pelo Twitter. O campo de texto permite personalizar o tweet antes de publicá-lo:

Captura de tela de um tuíte que divulga o Frontend Security Bingo, com as hashtags #FrontendSecurity e #WebDev e um botão Compartilhar no Twitter

Essa caixa de texto usa o slot **error-messages** do Vuetify para exibir uma mensagem de erro

<template>
 <div>
   <v-text-field
     :counter="true"
     v-model="shareTwitterText"
     label="tweet"
     required
     :error-messages="tweetErrors"
   ></v-text-field>
   <v-btn
     color="blue"
     outlined
     large
     @click="shareTwitter"
     class="blue--text text--darken-1 font-weight-bold"
     full-width
   >Share on Twitter</v-btn>
 </div>
</template>

No código do componente, configuramos a lógica de tratamento de erros usando o array **tweetErrors** e o método **shareTwitter()**.

<script>
export default {
 name: "SocialShare",
 data: () => {
   return {
     shareTwitterText:
       "Learn about Frontend Security Bingo: https://goo.gl #FrontendSecurity #WebDev",
     tweetErrors: []
   };
 },
 methods: {
   shareTwitter() {
     if (this.shareTwitterText.length > 280) {
       this.tweetErrors.push(
         `Your text is longer than 280 characters: ${this.shareTwitterText}`
       );
       return true;
     } else {
       this.tweetErrors = [];
       const tweetMsg = encodeURIComponent(this.shareTwitterText);
       const tweetUrl = `https://twitter.com/intent/tweet?text=${tweetMsg}&via=liran_tal`;
       window.open(tweetUrl, "_blank");
     }
   }
 }
};
</script>

Se o texto tiver mais de 280 caracteres, definimos o erro. Veja como fica:

Interface de compartilhamento do Twitter mostrando uma mensagem do Frontend Security Bingo que ultrapassa o limite de 280 caracteres e um botão “Compartilhar no Twitter”

E se o texto do tweet incluísse elementos HTML com JavaScript?

Inclua o texto a seguir no tweet e clique no botão de compartilhamento:

<img src=x onError=”alert(1)” />

Apareceu o alerta?

Parabéns. Você é um hacker! :-)

Mas isso não é nada bom se você não souber da vulnerabilidade. Como explica a página da vulnerabilidade de XSS do Vuetify:

As versões afetadas deste pacote são vulneráveis a Cross-site Scripting (XSS) por meio do array error-messages. Observação: se você não usa HTML nas propriedades rules, messages, hint, success-messages ou error-messages, não é afetado por esse problema.

É uma vulnerabilidade de segurança conhecida publicamente, o que significa que invasores podem encontrar essa informação com facilidade e usá-la para atacar você.

Como implantar sites e manter a segurança em dia?

Que bom que você perguntou!

Você pode — e deve — executar análises de segurança de terceiros antes de implantar seu site. E que maneira mais fácil de fazer isso do que usar um plugin da Snyk diretamente no build do Netlify?

O ecossistema de plugins do Netlify permite conectar plugins que executam ações adicionais e ampliam seu processo de build.

Vamos procurar e adicionar o plugin da Snyk ao nosso site:

Página de plugins da equipe Netlify mostrando uma busca por “Snyk” e dois plugins de vulnerabilidade de segurança com botões Instalar

Para obter os resultados de segurança, precisaremos de um token de API de desenvolvedor. Então, vamos acessar Snyk.io para gerar um. Na página inicial, clique no botão QUICK START no canto superior direito e faça login com a conta de sua preferência. Recomendo usar o GitHub para que a Snyk também possa enviar automaticamente pull requests com correções de segurança e atualizações de dependências desatualizadas.

Página inicial do site da Snyk com a frase “Desenvolva rápido. Mantenha-se seguro.” ao lado de uma ilustração de escudo de segurança e de nomes de tecnologias

Você encontrará o token de API na página geral de Configurações da sua conta:

Página de configurações da conta Snyk mostrando um painel de token de API, com opção para exibir a chave e botão Revogar e gerar novamente

Depois de obter o token de API da Snyk, podemos adicioná-lo como variável de ambiente ao processo de build do Netlify. No Netlify, você encontra as configurações de build na página geral de Configurações do site, no menu Build & deploy da barra lateral esquerda:

Página de configurações do Netlify do site frontend-security-bingo, mostrando a seção de variáveis de ambiente da implantação contínua.

Clique em Edit variables e adicione uma nova variável chamada SNYK_TOKEN. No campo de valor, insira o próprio token de API.

Pronto!

Agora, qualquer vulnerabilidade de segurança detectada nas dependências de pacotes necessárias para fazer o build do site fará o build falhar — assim, você poderá corrigi-la rapidamente antes de implantar. A Snyk dará orientações claras sobre como corrigir as vulnerabilidades e quais pacotes precisam ser atualizados.

Vamos ver como um build com falha aparece no meu projeto. Primeiro, o status geral da implantação mostra que o build falhou por causa do plugin e informa o motivo da falha:

Página de implantação do Netlify mostrando uma implantação de produção malsucedida devido a vulnerabilidades de segurança detectadas pelo plugin netlify-plugin-snyk.

Ao rolar a página até os logs, vemos claramente o erro apontado pelo plugin da Snyk: ele impede a implantação deste build do site devido a uma vulnerabilidade de segurança de Cross-site Scripting no vuetify:

Registro de implantação do Netlify mostrando o Snyk detectando uma vulnerabilidade XSS de alta gravidade e reprovando na verificação de segurança do netlify-plugin-snyk.

Graças ao plugin da Snyk, o processo de build do Netlify foi interrompido. Ele encontrou a vulnerabilidade de segurança exata no Vuetify que usamos para injetar código JavaScript malicioso por meio de uma vulnerabilidade de Cross-site Scripting, causada pela versão vulnerável do Vuetify na árvore de dependências.

E se surgir uma nova vulnerabilidade de segurança em uma dependência que você usa, mas já faz muito tempo que não faz o build do site? Não se preocupe, a Snyk cuida disso! Além de executar a cada build, o plugin da Snyk também monitora o projeto na plataforma da Snyk, realizando testes diários. Se uma nova vulnerabilidade de segurança afetar uma das suas dependências, você receberá uma notificação.

Qual é o próximo passo?

  • Se você usa o Vuetify, analise suas dependências em busca de vulnerabilidades de segurança e corrija-as. Dica: ao conectar seu repositório à Snyk, ela abrirá automaticamente pull requests para corrigi-las e monitorará novas vulnerabilidades — caso você não faça análises ou implantações regularmente por conta própria.

  • Comece a usar o plugin de build do Netlify da Snyk

  • Gere um token de API na Snyk e adicione seus repositórios para começar a monitorá-los e corrigi-los

Comece a resolver desafios de capture the flag

Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.

Leia mais

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.