fokan/.npmrc
Gautier Stefanini df613bb99c Un hook d'installation s'exécutait avant la première ligne du projet
Le ver « ChainDrop » publié sur npm le 4 août au matin partait d'un hook
`preinstall` sur `keyv`, `cacheable`, `flat-cache` et `file-entry-cache`, volait
les jetons npm et GitHub, les clés SSH et les chaînes de connexion, puis se
republiait avec ce qu'il venait de prendre — plus de 1 300 versions en une
matinée.

fokan n'a pas été touché, et il faut dire pourquoi : `node_modules` et le lock
dataient du 29/07, six jours avant la fenêtre, et `npm ci` résout depuis le lock.
Les trois paquets sont pourtant bien là, en transitif sous ESLint, chacun tiré
par un `^`. Un seul `npm install` ce jour-là aurait suffi. `ignore-scripts=true`
rend désormais un paquet compromis inerte tant que rien ne l'importe ; les trois
qui ont réellement besoin de leur binaire sont reliés nommément par `npm rebuild`
dans la CI et dans les deux étages du Dockerfile.

Séparément, le `COPY . .` du builder emportait tout le répertoire de travail dans
une couche de l'image : le `.env` de développement — gitignoré, donc bien présent
sur le disque — devenait lisible par n'importe quel script de build, et le
`node_modules` de l'hôte écrasait celui que `npm ci` venait d'installer à la ligne
précédente. Un `.dockerignore` ferme les deux.

Au passage, les actions GitHub sont épinglées au commit et non au tag — un tag est
mutable, c'est le `^` de npm sous un autre nom — et le jeton du runner passe en
lecture seule.

D-047.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 21:03:57 +00:00

8 lines
532 B
Text

legacy-peer-deps=true
# Aucun script d'installation n'est exécuté (D-047, 5 août 2026). Le ver ChainDrop du 04/08 volait
# les secrets depuis un hook `preinstall`, avant même que la moindre ligne du projet ne s'exécute.
# 7 paquets sur 687 ont un script ici ; les trois qui en ont besoin sont relancés nommément par
# `npm rebuild` dans la CI et le Dockerfile. Un paquet compromis reste alors du code inerte tant
# que rien ne l'importe — et `keyv`, la tête de pont du 04/08, n'est importé par rien.
ignore-scripts=true