NodeJS :: Manual fix para vulnerabilidade de segurança acusado pelo npm audit
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?
No final do log, podemos ver a ferramenta sugerindo que um simples npm audit fix
resolveria. Ok, vamos lá…
Ops!!!
A ferramenta não conseguiu corrigir as falhas. E agora??
Podemos usar --force
para tentar forçar??? Podemos. Vamos lá.
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
:
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:
- Adicione o atributo
resolutions
nopackage.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
Pronto, basta rodar:
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
- https://docs.npmjs.com/files/package-locks
- https://docs.npmjs.com/cli/shrinkwrap
- https://docs.npmjs.com/cli/audit
- https://medium.com/trainingcenter/tudo-que-voc%C3%AA-queria-saber-sobre-o-package-lock-json-mas-estava-com-vergonha-de-perguntar-e70589f2855f
- https://medium.com/@hossam.hilal0/package-json-vs-package-lock-json-vs-npm-shrinkwrap-json-33fcddc1521a
- https://blog.npmjs.org/post/115305091285/introducing-the-npm-semantic-version-calculator
- https://www.npmjs.com/package/npm-force-resolutions
- https://www.npmjs.com/package/npx