Retour au blog
CVE-2026-44643angular-expressionsAngularsandbox escapeRCENode.jsCVE

Angular Expressions CVE-2026-44643 : sandbox escape → RCE (CVSS 10.0)

angular-expressions < 1.5.2 : un attaquant peut écrire une expression avec filtres qui échappe la sandbox et exécute du code arbitraire. CVSS 10.0, scope changed. Patch et mitigation.

15 mai 20265 min de lecture

angular-expressions est un module Node.js standalone qui expose le moteur d'expressions d'AngularJS — utilisé pour évaluer des expressions templates dynamiques côté serveur ou dans des outils de templating (notamment docxtemplater qui s'appuie dessus pour les templates Word). Le 11 mai 2026, une CVE CVSS 10.0 a été publiée : CVE-2026-44643 permet à un attaquant d'écrire une expression utilisant les filtres pour échapper la sandbox et exécuter du code arbitraire sur le système.

Le score de 10.0 (avec scope S:C) traduit la sévérité maximale : pas d'authentification, pas de prérequis, exploitation triviale, et impact au-delà du composant vulnérable. La version corrigée est 1.5.2.


Détails techniques

Pourquoi une sandbox ?

angular-expressions permet d'évaluer des expressions style AngularJS comme user.name | uppercase côté Node.js. Pour empêcher qu'un utilisateur ne saisisse process.exit() ou pire, le module embarque une sandbox qui filtre les accès aux objets sensibles (window, process, eval, Function, prototype chain).

C'est exactement ce mécanisme qui est régulièrement la cible de CVE successives — la complexité du parsing AngularJS rend la sandbox difficile à durcir. CVE-2026-44643 ajoute un chapitre à cette histoire.

Le bug

Le mécanisme de filtres (expression | filterName:arg) introduit un chemin où certaines références sont résolues différemment de l'expression principale. Un attaquant peut construire une expression chainée qui :

  1. Tire parti du filtre pour faire passer une référence interdite
  2. Utilise cette référence pour reconstruire un accès à Function ou constructor
  3. Appelle un constructeur de fonction avec un code malveillant en argument
  4. Exécute ce code dans le contexte Node.js — non sandboxé

Le pattern typique d'exploitation ressemble à :

const expr = compile("constructor.constructor('return process')() | someFilter");
expr(scope);  // → exécute process.exit() ou pire

(Le payload exact dépend du chemin précis trouvé par les chercheurs — la signature CVE n'expose pas les détails.)

Caractéristiques

ChampValeur
CVSS 3.110.0 (CRITICAL)
VecteurAV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CWECWE-1336 (Improper Neutralization of Special Elements in Template Engine)
ScopeChanged — impacte au-delà du composant (le processus Node.js entier)
AuthentificationAucune

Produits et versions affectés

ModuleVersions affectéesVersion corrigée
angular-expressions< 1.5.21.5.2

Dépendances transitives à risque : angular-expressions est embarqué par de nombreuses bibliothèques de templating, notamment :

  • docxtemplater (utilisé pour générer des documents Word à partir de templates)
  • Outils de génération de PDF/rapports
  • Moteurs de templating "à la AngularJS" dans des CMS et tools internes

Vérifie ton arbre de dépendances :

# npm
npm ls angular-expressions

# yarn
yarn why angular-expressions

# pnpm
pnpm why angular-expressions

Si tu utilises docxtemplater, vérifie aussi sa version : les versions récentes de docxtemplater incluent angular-expressions ≥ 1.5.2.


Exploitation et impact

Conditions d'exploitation

Toute application qui :

  1. Utilise angular-expressions directement ou via une dépendance
  2. Évalue une expression contenant des données utilisateur (input formulaire, paramètre URL, contenu de fichier uploadé)

Le cas le plus critique est l'utilisation dans un moteur de templating qui accepte des templates fournis par l'utilisateur (cas typique : génération de documents personnalisés via portail SaaS).

Conséquences post-exploitation

  • RCE Node.js : accès complet au processus serveur (process, require, fs, child_process)
  • Vol des secrets en mémoire : variables d'environnement, secrets de configuration
  • Pivot LAN depuis le serveur compromis
  • Modification du code applicatif si écriture sur disque autorisée
  • Exfiltration de données de la base de données via les credentials du processus

Exploit public

Aucun PoC public détaillé n'a été publié à ce jour, mais le pattern d'exploitation des sandboxes AngularJS est documenté depuis 2015 (PortSwigger, Mario Heiderich). La reconstruction de l'exploit par un chercheur motivé est une question d'heures, pas de jours.


Détection et IOC

Audit des dépendances

# Lister toutes les occurrences de angular-expressions dans votre tree
npm ls angular-expressions 2>&1 | grep -v "deduped"

# Vérifier la version exacte chargée
node -e "console.log(require('angular-expressions/package.json').version)"

Logs applicatifs

Si vous loggez les expressions évaluées (à activer si possible) :

# Chasse les expressions contenant les patterns d'évasion classiques
grep -E "constructor|prototype|__proto__|Function\(" /var/log/your-app.log

Runtime monitoring

Si vous opérez du runtime defense (Snyk Runtime, Aikido, JFrog Xray), ajoutez une règle qui alerte sur les évaluations d'expressions contenant constructor.constructor, __proto__, Function(, ou globalThis.

IOC réseau

  • Trafic sortant inhabituel depuis les processus Node.js (DNS exfiltration, callbacks C2)
  • Connexions vers des destinations non whitelistées
  • Augmentation soudaine de CPU sur le worker Node.js (mining)

Mitigation et patch

Action immédiate

# npm
npm install angular-expressions@^1.5.2

# yarn
yarn upgrade angular-expressions@^1.5.2

# pnpm
pnpm update angular-expressions@^1.5.2

Si la dépendance est transitive (via docxtemplater par exemple) :

# Forcer la version via overrides (package.json)
{
  "overrides": {
    "angular-expressions": "^1.5.2"
  }
}

Puis npm install pour appliquer.

Workaround si patch impossible

Sanitize les entrées utilisateur avant évaluation :

function isSafeExpression(expr) {
  // Rejette les patterns connus de sandbox escape
  const forbidden = /constructor|prototype|__proto__|Function\(|eval|globalThis|window|process|require/i;
  return !forbidden.test(expr);
}

if (!isSafeExpression(userInput)) {
  throw new Error("Expression contains forbidden patterns");
}
const result = compile(userInput)(scope);

⚠️ Cette mitigation est incomplète : la sandbox d'AngularJS a historiquement été contournée par des patterns créatifs qui passent les regex naïves. Considère ça comme un patch d'urgence, pas une vraie solution.

Hardening durable

  • N'utilise jamais angular-expressions directement sur de l'input utilisateur — c'est un moteur conçu pour les développeurs, pas pour les end-users
  • Pour les templates user-fourni, utilise une sandbox réelle : vm2 (note : a sa propre histoire de CVE), isolated-vm, ou un runtime séparé (worker thread, container)
  • Audit régulier de tes dépendances Node.js — utilise npm audit, Snyk, Renovate

Pourquoi surveiller en continu vos dépendances JavaScript

L'écosystème npm contient des milliers de modules dont la sécurité dépend du temps libre de mainteneurs bénévoles. Les CVE comme CVE-2026-44643 — sur un module de templating qui finit transitivement dans des centaines de SaaS B2B — sont fréquentes et publiées sans préavis aux utilisateurs en aval. Sans veille automatique, vous découvrez la vulnérabilité quand elle est déjà exploitée.

Avec cveo.tech, inventorie tes runtimes Node.js et leurs dépendances clés et reçois un email automatique dès qu'une CVE critique vise une version exacte présente dans ton tree — pour patcher dans la foulée du commit upstream.

Surveillez les CVE avec l'IA

Recherche IA, scoring CVSS, surveillance de parc et alertes automatiques.