Skip to content

Security risk due to dynamic code execution using new Function #328

@Abderrahmane-MERSTANI

Description

@Abderrahmane-MERSTANI

Description
La bibliothèque doT.js génère dynamiquement des fonctions JavaScript à partir de templates en utilisant new Function.
Cette approche peut introduire des risques de sécurité, notamment des vulnérabilités de type code injection / XSS, lorsque les templates ou les données ne sont pas totalement maîtrisés.

Problème identifié
Dans plusieurs parties du code (ex: resolveDefs et doT.template) :

new Function("def", "def['"+code+"']=" + value)(def);

et

return new Function(c.varname, str);

Le contenu des templates est injecté directement dans du code JavaScript exécuté dynamiquement.

Si un template provient d’une source externe ou utilisateur, un attaquant pourrait injecter du code malveillant.

Cela peut conduire à :

Exécution de code arbitraire

XSS côté client

Compromission de l’environnement JavaScript

Étapes pour reproduire

Utiliser un template provenant d’une entrée utilisateur non filtrée

Injecter du JavaScript dans une expression {{ }} ou {{= }}

Compiler et exécuter le template

Observer que le code injecté est exécuté

Comportement attendu

Les templates devraient être traités de manière sécurisée

L’exécution de code arbitraire ne devrait pas être possible à partir d’entrées non fiables

Comportement actuel

Le moteur de template exécute directement le code généré sans sandbox ni validation

Toute expression valide JavaScript est exécutée

Impact

Risque de failles de sécurité critiques

Inadapté pour des environnements exposés (applications web publiques)

Problématique dans des contextes modernes avec CSP strictes

Suggestion de correction

Documenter clairement que doT.js ne doit pas être utilisé avec des templates non fiables

Ajouter une option pour désactiver evaluate ({{ }}) et use

Envisager :

Un mode “safe” sans new Function

Une validation ou un parsing plus strict des expressions

Une alternative plus sécurisée pour les environnements sensibles

Contexte

Version concernée : 1.1.1

Environnement : navigateur / Node.js

Type : Sécurité / Design

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions