NodeJS :: Manual fix para vulnerabilidade de segurança acusado pelo npm audit

ROBSON.JUNIOR
4 min readApr 3, 2020
Capa Vulnerabilidade de Segurança da Informação

Todo e qualquer desenvolvedor que possui NodeJS em sua stack de desenvolvimento, com certeza já passou pelo problema de executar um simples npm install e logo em seguida receber N logs acusando alguma falha de vulnerabilidade. Certo?

npm audit mostrando log com problemas de vulnerabilidade

No final do log, podemos ver a ferramenta sugerindo que um simples npm audit fix resolveria. Ok, vamos lá…

npm audi fix :: comando sugere manual fix

Ops!!!

A ferramenta não conseguiu corrigir as falhas. E agora??

Podemos usar --force para tentar forçar??? Podemos. Vamos lá.

npm audit fix — force :: também sem sucesso
Susto, reação ao ver que a ferramenta não conseguiu realizar fix de segurança

E agora?

Agora temos que encontrar uma opção, mas antes de listar as opções quero que olhe para o package.json a seguir:

{
"name": "app-test-aztech",
"version": "1.0.0",
"description": "Aplicação teste para artigo no Medium",
"scripts": {
"postinstall": "npm install gulp-cli -g ",
"build": "gulp build"
},
"dependencies": {
"gulp-cli": "^2.2.0"
},
"devDependencies": {
"gulp": "^4.0.2",
"gulp-clean": "^0.4.0",
"gulp-copy": "^4.0.1",
"gulp-jshint": "^2.1.0",
"gulp-rename": "^2.0.0",
"gulp-replace-include": "^1.3.1",
"gulp-sass": "^4.0.2",
"gulp-sass-lint": "^1.4.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-uglify-es": "^2.0.0",
"jshint": "^2.11.0",
"map-stream": "0.0.7",
"node-sass": "^4.13.1",
"node-wget": "^0.4.3"
}
}

Este é um exemplo package.json, nele contém nossas dependências e esse mesmo package.json é o responsável pelos logs com problemas de vulnerabilidade acima.

O package-lock.json

O npm já teve algumas maneiras para poder contornar esses problemas… Quem aí lembra do npm shrinkwrap?

Então, ele não é mais utilizado desde npm superior a 5.x.x. Você deve usar o package-lock.json para garantir uma instalação consistente e dependências compatíveis.

A cada npm install ou npm update o package-lock.json será atualizado de acordo o package-lock.json .

Agora vem a pergunta…

Se o package-lock.json é sempre atualizado a cada npm install ou npm update , como irei fixar a versão de uma sub-dependência?

NOTA: sub-dependência é toda dependência usada por suas dependências.

Exemplo:

No nosso projeto usamos Gulp, com isso uma task que se chama gulp-replace-include, por sua vez, esse módulo possui as próprias dependências dele e é nessa hora que a coisa pega, isso porque as sub-dependências são configuradas apenas no package-lock.json .

Para entender melhor, olha o resultado do comando npm audit :

tabela com resultado da verificação com falhas de vulnerabilidade

Na imagem acima, podemos ver qual dependência tem a falha, qual é a falha e em que versão essa falha foi corrigida.

Como comentado antes, não adianta pinar a versão da dependência com falha no package-lock.json pois será o arquivo será regerado depois do primeiro npm install ou npm update .

Manual fix — npm-force-resolutions

Este pacote modifica o package-lock.json , forçando a instalação de uma versão específica de uma dependência transitiva (dependência da dependência).

NOTA: O caso de uso para este aproach é quando temos uma vulnerabilidade de segurança onde devemos atualizar pontualmente uma dependência.

Agora que estamos entendidos, vamos ao fix:

  1. Adicione o atributo resolutions no package.json com a dependência e a versão desejada para fix.
"resolutions": {
"minimist": "1.2.3",
"lodash": "4.17.15",
"cryptiles": "4.1.3"
}

NOTA: ter os seguintes pacotes intalados:

npm install npm-force-resnpm olutions && npm install -g npx

Por último, basta rodar:

npx npm-force-resolutions
Print do comando: npx npm-force-resolutions

Pronto, basta rodar:

npm install
Print do resultado do comando npm install

Dedicatória

Dedico este artigo a todas pessoas que escrevem conteúdo Open Source em volta do mundo com o objetivo de continuarmos duelando para evoluir.

Dedico também a todo iniciante da área, para que não desista quando encontrar pedras no caminho e que sigam firme em seus esforços e estudos.

Muito obrigado!

Referências

--

--