CVE-2026-45231 : DumbAssets, XSS stockée dans les champs d'asset

CVE-2026-45231

Les champs d'un asset DumbAssets sont stockés bruts et réaffichés en innerHTML : XSS stockée.

DumbAssets est un petit gestionnaire d’inventaire auto-hébergé en Node.js. Quand on crée un asset, le serveur enregistre le corps de la requête tel quel, sans nettoyer les champs texte (server.js) :

const newAsset = req.body;              // name, description, modelNumber, serialNumber, tags... bruts
if (!newAsset.name) {
    return res.status(400).json({ error: 'Asset name is required' });
}
assets.push(newAsset);
writeJsonFile(assetsFilePath, assets); // stocké en l'état, aucun échappement

Et côté navigateur, ces mêmes champs sont réinjectés directement dans la page via innerHTML (public/script.js) :

details.innerHTML = `
    <div class="sub-asset-title">${subAsset.name}</div>   // le nom part brut dans le DOM
`;

info.innerHTML = `
    <span>${subAsset.modelNumber}</span>
    <span>#${subAsset.serialNumber}</span>
    ${subAsset.tags.map(tag => `<span class="tag">${tag}</span>`).join('')}
`;

Rien n’échappe les < et > : ni au stockage, ni à l’affichage. Il suffit donc de créer un asset dont le nom vaut :

<img src=x onerror=alert(document.cookie)>

Le navigateur ne l’affiche pas comme du texte, il l’interprète comme du HTML et exécute le script, chez toute personne qui ouvre la liste des assets. Les champs qui passent par ce rendu : name, description, modelNumber, serialNumber et tags.

Liens