
Un package convivial pour développeurs et ingénieurs en sécurité pour sécuriser les applications NodeJS.
Node Security Shield (NSS) est un outil open source de protection d'application au moment de l'exécution (RASP) qui vise à combler le fossé en matière de sécurité complète de NodeJS en permettant au développeur et à l'ingénieur sécurité de déclarer les ressources auxquelles une application peut accéder.
Inspiré par la vulnérabilité Log4Shell (CVE-2021-44228) qui peut être exploitée car une application peut effectuer des appels réseau arbitraires, nous avons ressenti le besoin qu'une application dispose d'un mécanisme lui permettant de déclarer les privilèges qu'elle autorise afin de rendre l'exploitation de telles vulnérabilités plus difficile en mettant en œuvre des contrôles supplémentaires.
Pour y parvenir, NSS (Node Security Shield) dispose d'une Politique d'Accès aux Ressources (RAP)
La Politique d'Accès aux Ressources est similaire à la CSP (Content Security Policy).
Elle permet au développeur/ingénieur sécurité de déclarer les ressources auxquelles une application doit accéder. Et Node Security Shield l'appliquera.
npm install nodesecurityshield
// Exiger Node Security Shield
let nodeSecurityShield = require('nodesecurityshield');
// Activer la surveillance et/ou le blocage des attaques
nodeSecurityShield.enableAttackMonitoring("Unique-App-Id",resourceAccessPolicy ,callbackFunction);
const resourceAccessPolicy = {
"outBoundRequest" : {
"blockedDomains" : ["compromised.domdog.io"],
"allowedDomains" : []
},
"executedCommand": {
"allowedCommands": ["pwd" , "(node)[](https://github.com/domdogsec/nodesecurityshield/blob/HEAD/helper%5C/)[a-z|0-9]*(.js)"]
}
};
outBoundRequest : définit le comportement accepté pour les Requêtes sortantes
executedCommand : définit le comportement accepté pour l'Exécution de commande
allowedCommands accepte une String. Vous pouvez passer une RegEx pour autoriser un modèle de commandes.executedCommand définie.pwd est autorisée à s'exécuter et.js dans helper sont autorisés à être lancés en tant que processus node..* dans les regex. Cela permettrait l'exécution de n'importe quelle commande après un pipe .var callbackFunction = function (violationEvent,violations,violationLimitPerMinReached) {
console.log(JSON.stringify(violationEvent,null, 4));
}
violationEvent - Violation RAP survenue. Elle est présentée comme une violation CSP.
violations - Compteur de violations RAP. Remis à ZÉRO chaque minute.
violationLimitPerMinReached - true si le nombre de violations RAP dépasse 'maxViolationsPerMinute' [une option dans la RAP]
Pour bloquer une attaque - lancer une erreur
throw new Error("Requête bloquée. Elle viole la politique d'accès aux ressources déclarée.")
{
"csp-report": {
"document-uri": "https://Unique-App-Id",
"blocked-uri": "https://compromised.domdog.io:443",
"violated-directive": "connect-src",
"effective-directive": "connect-src",
"original-policy": "{\"outBoundRequest\":{\"blockedDomains\":[\"compromised.domdog.io\"],\"allowedDomains\":[]}}",
"disposition": "report",
"status-code": 200,
"script-sample": "",
"source-file": "Error\n at TLSSocket.obj.<computed> [as connect] (/mnt/c/Ironwasp/Product/NodeSecurityShield/lib/hook.js:20:25)\n at Object.connect (_tls_wrap.js:1606:13)\n at Agent.createConnection (https.js:126:22)\n at Agent.createSocket (_http_agent.js:273:26)\n at Agent.addRequest (_http_agent.js:232:10)\n at new ClientRequest (_http_client.js:302:16)\n at request (https.js:310:10)\n at Object.get (https.js:314:15)\n at /mnt/c/Ironwasp/RD/Node/SimpleVulnerableNode/routes/ssrf.js:19:19\n at Layer.handle [as handle_request] (/mnt/c/Ironwasp/RD/Node/SimpleVulnerableNode/node_modules/express/lib/router/layer.js:95:5)"
}
}
document-uri: contient Unique-App-Id, transmis lors de l'initialisation de NSSblocked-uri: domaine de la requête sortante qui a violé la RAPviolated-directive: connect-src est un synonyme de Requête sortante ; de même script-src est un synonyme d'Exécution de commandeoriginal-policy: Politique d'accès aux ressources (RAP) violéesource-file: Trace de la pile à l'origine de cette violation.const resourceAccessPolicy = {
"outBoundRequest" : {
"blockedDomains" : ["compromised.domdog.io"],
"allowedDomains" : []
},
"executedCommand": {
"allowedCommands": ["pwd" , "(node)[](https://github.com/domdogsec/nodesecurityshield/blob/HEAD/helper%5C/)[a-z|0-9]*(.js)"]
},
"reportUri": "https://ingest.sentry.io/api/6011856/security/?sentry_key=",
};
outBoundRequest : définit le comportement accepté pour les Requêtes sortantes
executedCommand : définit le comportement accepté pour l'Exécution de commande
allowedCommands accepte une String. Vous pouvez passer une RegEx pour autoriser un modèle de commandes.executedCommand définie.pwd est autorisée à s'exécuter et.js dans helper sont autorisés à être lancés en tant que processus node..* dans les regex. Cela permettrait l'exécution de n'importe quelle commande après un pipe .Capture d'écran depuis le tableau de bord Sentry

const resourceAccessPolicy = {
"outBoundRequest" : {
"blockedDomains" : ["compromised.domdog.io"],
"allowedDomains" : ["domdog.io","*.domdog.io",
{
"domains": [
"domgo.at",
],
"modules": [
{
"file": "\/routes\/ssrf.js",
},
{
"file": "\/node_modules\/axios\/",
}
]
},
{
"domains": [
"cluster0-shard-00-00.lb9jm.mongodb.net",
"cluster0-shard-00-01.lb9jm.mongodb.net",
"cluster0-shard-00-02.lb9jm.mongodb.net"
],
"modules": [
{
"file": "\/node_modules\/mongodb\/"
}
]
}
]
},
"executedCommand": {
"allowedCommands": ["pwd" , "(node)[](https://github.com/domdogsec/nodesecurityshield/blob/HEAD/helper%5C/)[a-z|0-9]*(.js)"]
},
"reportUri": "https://endpoint-to-send-violations",
"maxViolationsPerMinute": 50
}
outBoundRequest : définit le comportement accepté pour les Requêtes sortantes
executedCommand : définit le comportement accepté pour l'Exécution de commande
allowedCommands accepte une String. Vous pouvez passer une RegEx pour autoriser un modèle de commandes.executedCommand définie.pwd est autorisée à s'exécuter et.js dans helper sont autorisés à être lancés en tant que processus node..* dans les regex. Cela permettrait l'exécution de n'importe quelle commande après un pipe .||reportUri : Envoie les violations à un point de terminaison donné. Comme les violations sont similaires aux violations de la Content Security Policy, toutes les solutions de surveillance CSP peuvent être utilisées. Nous avons utilisé le point de terminaison Sentry dans la RAP ci-dessus.|reportUri : Envoie les violations à un point de terminaison donné. Comme les violations sont similaires aux violations de la Content Security Policy, toutes les solutions de surveillance CSP peuvent être utilisées. Nous avons utilisé le point de terminaison Sentry dans la RAP ci-dessus.allowedDomain accepte des objets avec les éléments suivants :
domain : Tableau de domaines autorisés pour les fichiers fournis.modules : Tableau d'objets contenant des chemins de fichiers. Seules les requêtes sortantes effectuées via ces fichiers vers les domaines spécifiés sont autorisées.maxViolationsPerMinute : Nombre maximum de violations à envoyer à reportUri.
S'il n'est pas spécifié, la valeur par défaut (100 violations) est utilisée.