
Un paquete amigable para desarrolladores e ingenieros de seguridad para asegurar aplicaciones NodeJS.
Node Security Shield (NSS) es una herramienta de protección de aplicaciones en tiempo de ejecución (RASP) de código abierto que busca cerrar la brecha en la seguridad integral de NodeJS, permitiendo que los desarrolladores e ingenieros de seguridad declaren qué recursos puede acceder una aplicación.
Inspirados por la vulnerabilidad Log4Shell (CVE-2021-44228), que puede ser explotada porque una aplicación puede realizar llamadas de red arbitrarias, sentimos la necesidad de que una aplicación tenga un mecanismo para declarar qué privilegios permite, con el fin de dificultar la explotación de dichas vulnerabilidades mediante la implementación de controles adicionales.
Para lograr esto, NSS (Node Security Shield) cuenta con una Política de Acceso a Recursos (RAP)
La Política de Acceso a Recursos es similar a la CSP (Content Security Policy).
Permite al desarrollador/ingeniero de seguridad declarar qué recursos debe acceder una aplicación. Y Node Security Shield la hará cumplir.
npm install nodesecurityshield
// Require Node Security Shield
let nodeSecurityShield = require('nodesecurityshield');
// Habilitar monitoreo y/o bloqueo de ataques
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/main/helper%5C)[a-z|0-9]*(.js)"]
}
};
outBoundRequest: define el comportamiento aceptado para las Solicitudes Salientes
blockedDomains tiene prioridad sobre allowedDomains.blockedDomains y luego contra allowedDomains.executedCommand: define el comportamiento aceptado para la Ejecución de Comandos
allowedCommands acepta String. Puede pasar una expresión regular (RegEx) para permitir un patrón de comandos.executedCommand.pwd y.js dentro de helper como procesos de Node..* en la expresión regular, ya que esto permitiría la ejecución de cualquier comando después de un pipe |.var callbackFunction = function (violationEvent, violations, violationLimitPerMinReached) {
console.log(JSON.stringify(violationEvent, null, 4));
}
violationEvent - Violación de la RAP que ocurrió. Se presenta como una violación de CSP.
violations - Contador de violaciones de la RAP. Se reinicia a CERO cada minuto.
violationLimitPerMinReached - verdadero si el contador de violaciones excede 'maxViolationsPerMinute' [una opción en la RAP]
Para Bloquear un Ataque - lanzar un error
throw new Error("Solicitud bloqueada. Viola la Política de Acceso a Recursos declarada.")
{
"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: contiene el Unique-App-Id, pasado durante la inicialización de NSSblocked-uri: dominio de la solicitud saliente que violó la RAPviolated-directive: connect-src es un sinónimo de Solicitud Saliente, del mismo modo script-src es un sinónimo de Ejecución de Comandosoriginal-policy: Política de Acceso a Recursos (RAP) violadasource-file: Traza de pila (stack trace) del lugar donde ocurrió esta violación.const resourceAccessPolicy = {
"outBoundRequest" : {
"blockedDomains" : ["compromised.domdog.io"],
"allowedDomains" : []
},
"executedCommand": {
"allowedCommands": ["pwd" , "(node)[](https://github.com/domdogsec/nodesecurityshield/blob/main/helper%5C)[a-z|0-9]*(.js)"]
},
"reportUri": "https://ingest.sentry.io/api/6011856/security/?sentry_key=",
};
outBoundRequest: define el comportamiento aceptado para las Solicitudes Salientes
blockedDomains tiene prioridad sobre allowedDomains.blockedDomains y luego contra allowedDomains.executedCommand: define el comportamiento aceptado para la Ejecución de Comandos
allowedCommands acepta String. Puede pasar una expresión regular (RegEx) para permitir un patrón de comandos.executedCommand.pwd y.js dentro de helper como procesos de Node..* en la expresión regular, ya que esto permitiría la ejecución de cualquier comando después de un pipe |.reportUri : Envía las violaciones a un endpoint dado. Como las violaciones son similares a las violaciones de la Política de Seguridad de Contenido (CSP), se puede usar cualquier solución de monitoreo de CSP. En la RAP anterior usamos el endpoint de Sentry.Captura de pantalla del panel de Sentry
