Aller au contenu
Blog

npm · PyPI · office-converter

npm et PyPI : 6 paquets avec injection de commande shell notée 9.8 (office-converter, webp-converter, pypdftk…)

Six paquets npm et PyPI (office-converter, webp-converter, pypdftk, doc-recog, whisper-node, transcribe2texts) passent des chemins au shell. Tous notés 9.8.

Le 14 octobre 2026, NVD a publié d'un coup six CVE notées 9.8 sur des paquets npm et PyPI. Des bibliothèques de conversion de documents, d'images et de transcription audio, du genre qu'on ajoute en dépendance sans y penser.

Le fil conducteur est le même pour les six : un chemin de fichier fourni par l'appelant est concaténé dans une chaîne de commande, puis exécuté par un shell. Si ce chemin vient, de près ou de loin, d'un utilisateur — un nom de fichier uploadé, un paramètre d'API — l'attaquant exécute des commandes avec les droits du processus Node.js ou Python.

PaquetÉcosystèmeCVEBornes NVDAppel en cause
office-converternpmCVE-2020-37282≤ 1.0.2child_process.exec()
webp-converternpmCVE-2026-110635< 3.0.0 (corrigé en 3.0.0)execFile avec shell activé
pypdftkPyPICVE-2026-110636≤ 0.5subprocess.Popen(..., shell=True)
doc-recognpmCVE-2026-110638≤ 1.1.6exec via shell
whisper-nodenpmCVE-2026-110640≤ 1.1.1shelljs exec()
transcribe2textsnpmCVE-2026-110643≤ 1.0.6child_process.exec()

Toutes : CVSS 3.1 9.8, vecteur AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, publication NVD le 14 octobre 2026, aucune au CISA KEV à la date de rédaction.


Pourquoi c'est grave, et pourquoi le 9.8 dépend de toi

Ces paquets enveloppent des outils en ligne de commande (unoconv, cwebp, pdftk, pdftotext, whisper.cpp). Le plus simple pour les appeler, c'est de construire une chaîne et de la passer à un shell. Le problème : le shell interprète cette chaîne. Tout caractère spécial présent dans le nom de fichier devient de la syntaxe.

Le score de 9.8 suppose le pire cas : le chemin est contrôlé à distance, sans authentification. Dans ton application, ça dépend du flux :

  • Exposé : un service qui reçoit un fichier uploadé et réutilise son nom d'origine pour la conversion ou la transcription.
  • Moins exposé : un script interne qui ne traite que des fichiers générés par toi, avec des noms que tu maîtrises.

Dans le doute, considère-toi exposé. Un nom de fichier venant de l'extérieur n'est jamais une donnée sûre.


office-converter — CVE-2020-37282

office-converter through 1.0.2 contains an OS command injection vulnerability [...] concatenated into an unoconv command run via child_process.exec()

Les fonctions de génération PDF et HTML reçoivent un nom de fichier qui finit dans une commande unoconv. NVD borne à 1.0.2 inclus et ne cite pas de version corrigée. Si tu ne peux pas vérifier un correctif côté mainteneur, remplace le paquet ou appelle unoconv toi-même sans shell.

webp-converter — CVE-2026-110635

Les helpers qui lancent les binaires libwebp utilisent execFile… avec le shell activé, ce qui annule l'intérêt d'execFile. Les noms de fichiers et les chaînes d'options sont concernés. NVD indique la correction en 3.0.0 : c'est le seul paquet du lot pour lequel une version corrigée est donnée. Monte en 3.0.0 et vérifie les changements d'API.

pypdftk — CVE-2026-110636

Côté Python : les fonctions de remplissage de formulaire et d'extraction de champs construisent la commande pdftk à partir des chemins d'entrée et de sortie, puis l'exécutent avec shell=True. Bornes NVD : ≤ 0.5, pas de version corrigée publiée.

doc-recog — CVE-2026-110638

Les fonctions de reconnaissance et de tagging de documents transmettent le chemin à un appel pdftotext passé par un shell. Bornes NVD : ≤ 1.1.6, pas de version corrigée publiée.

whisper-node — CVE-2026-110640

Le wrapper de whisper.cpp construit la ligne de commande à partir du chemin audio et de l'option de langue, puis l'exécute via shelljs. Attention : même si tu fixes le chemin, un paramètre de langue venant de l'utilisateur suffit. Bornes NVD : ≤ 1.1.1, pas de version corrigée publiée.

transcribe2texts — CVE-2026-110643

Même schéma : le chemin audio est passé non échappé à child_process.exec(). Bornes NVD : ≤ 1.0.6, pas de version corrigée publiée.

Rappel valable pour tout le tableau : ces bornes sont celles de NVD. Elles indiquent les versions vulnérables connues, pas forcément une version corrigée à installer. Vérifie le dépôt ou l'avis du mainteneur.


Détection

  • Inventaire des dépendances, y compris transitives : npm ls office-converter webp-converter doc-recog whisper-node transcribe2texts et pip show pypdftk (ou ton SBOM).
  • Processus enfants inattendus des workers de conversion : un sh qui lance autre chose que l'outil attendu (curl, wget, un interpréteur).
  • Connexions sortantes depuis des services de conversion qui n'en ont normalement pas besoin.
  • Noms de fichiers anormaux dans les journaux d'upload : caractères de ponctuation inhabituels dans des noms censés être simples.

Mitigation

  1. Mettre à jour webp-converter en 3.0.0. Pour les cinq autres, vérifier si le mainteneur a publié un correctif ; à défaut, retirer ou remplacer la dépendance.
  2. Corriger côté appelant, quel que soit le paquet : en Node.js, execFile / spawn sans l'option shell, avec les arguments en tableau ; en Python, subprocess.run([...]) avec une liste et shell=False. Sans shell, un nom de fichier reste un nom de fichier.
  3. Ne jamais réutiliser le nom d'origine d'un fichier uploadé. Renomme à la réception (identifiant aléatoire + extension validée) et stocke le nom d'origine en base, à part.
  4. Valider les chemins : résoudre le chemin, vérifier qu'il reste dans le répertoire de travail prévu, refuser ce qui ne correspond pas à une liste blanche de caractères.
  5. Valider les options (langue, format) contre une liste fermée de valeurs, jamais en texte libre.
  6. Isoler les workers de conversion : compte dédié sans privilèges, conteneur sans accès réseau sortant, pas de secrets dans l'environnement.

Pourquoi surveiller en continu vos dépendances

Ces six paquets n'ont rien d'exotique : ce sont des wrappers pratiques qu'on ajoute pour gagner une heure. Ils se retrouvent ensuite en dépendance transitive de projets qui ne savent même pas qu'ils lancent un shell.

Avec cveo.tech, déclare les bibliothèques sensibles de tes applications dans ton parc et reçois une alerte dès qu'une CVE critique les touche.

Chaque lundi

Les CVE critiques de la semaine, dans votre boîte mail

Un email par semaine : les vulnérabilités CVSS ≥ 9 publiées ces sept derniers jours, et nos dernières analyses. Rien d'autre.

Double confirmation par email. Désinscription en un clic, à tout moment.

Surveillez votre propre parc

Recherche CVE, inventaire de parc et alertes email, gratuitement.