
Um pacote amigável para Desenvolvedores e Engenheiros de Segurança para proteger Aplicações NodeJS.
Node Security Shield (NSS) é uma ferramenta de código aberto de Autoproteção de Aplicação em Tempo de Execução (RASP) que visa preencher a lacuna para uma segurança abrangente do NodeJS, permitindo que Desenvolvedores e Engenheiros de Segurança declarem quais recursos uma aplicação pode acessar.
Inspirados pela vulnerabilidade Log4Shell (CVE-2021-44228), que pode ser explorada porque uma aplicação pode fazer chamadas de rede arbitrárias, sentimos a necessidade de que uma aplicação tenha um mecanismo para declarar quais privilégios ela permite, a fim de dificultar a exploração de tais vulnerabilidades através da implementação de controles adicionais.
Para isso, o NSS (Node Security Shield) possui a Política de Acesso a Recursos (RAP)
A Política de Acesso a Recursos é semelhante à CSP (Content Security Policy).
Ela permite que o desenvolvedor/engenheiro de segurança declare quais recursos uma aplicação deve acessar. E o Node Security Shield a aplicará.
npm install nodesecurityshield
// Requer o Node Security Shield
let nodeSecurityShield = require('nodesecurityshield');
// Habilita o Monitoramento e/ou Bloqueio 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/HEAD/helper%5C/)[a-z|0-9]*(.js)"]
}
};
outBoundRequest: define o comportamento aceito para Requisições de Saída
executedCommand: define o comportamento aceito para Execução de Comandos
allowedCommands aceita String. Você pode passar uma RegEx para permitir um padrão de comandos.executedCommand definida.pwd é permitido para execução e.js dentro de helper são permitidos para serem gerados como processos node..* na regex, pois isso permitirá a execução de qualquer comando após um pipe .var callbackFunction = function (violationEvent, violations, violationLimitPerMinReached) {
console.log(JSON.stringify(violationEvent, null, 4));
}
violationEvent - Violação da RAP que ocorreu. É apresentada como uma violação de CSP.
violations - Contagem de violações da RAP. Reinicia para ZERO a cada minuto.
violationLimitPerMinReached - verdadeiro se a contagem de violações da RAP exceder 'maxViolationsPerMinute' [uma opção na RAP]
Para Bloquear um Ataque - lance um erro
throw new Error("Requisição Bloqueada. Viola a Política de Acesso 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: contém o Unique-App-Id, passado durante a inicialização do NSSblocked-uri: domínio da requisição de saída que violou a RAPviolated-directive: connect-src é um sinônimo para Requisição de Saída, assim como script-src é um sinônimo para Execução de Comandosoriginal-policy: a Política de Acesso a Recursos (RAP) violadasource-file: Stack Trace de onde ocorreu essa violação.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: define o comportamento aceito para Requisições de Saída
executedCommand: define o comportamento aceito para Execução de Comandos
allowedCommands aceita String. Você pode passar uma RegEx para permitir um padrão de comandos.executedCommand definida.pwd é permitido para execução e.js dentro de helper são permitidos para serem gerados como processos node..* na regex, pois isso permitirá a execução de qualquer comando após um pipe .Captura de tela do painel do 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: define o comportamento aceito para Requisições de Saída
executedCommand: define o comportamento aceito para Execução de Comandos
allowedCommands aceita String. Você pode passar uma RegEx para permitir um padrão de comandos.executedCommand definida.pwd é permitido para execução e.js dentro de helper são permitidos para serem gerados como processos node..* na regex, pois isso permitirá a execução de qualquer comando após um pipe .||reportUri: Envia Violações para um endpoint específico. Como as violações são semelhantes às violações de Política de Segurança de Conteúdo, qualquer solução de monitoramento de CSP pode ser usada. Usamos o endpoint do Sentry na RAP acima.|reportUri: Envia Violações para um endpoint específico. Como as violações são semelhantes às violações de Política de Segurança de Conteúdo, qualquer solução de monitoramento de CSP pode ser usada. Usamos o endpoint do Sentry na RAP acima.allowedDomain aceita Objetos com os seguintes campos:
domain: Array de domínios que devem ser permitidos para os arquivos fornecidos.modules: Array de Objetos contendo caminhos de arquivos. Apenas requisições de saída feitas através desses arquivos para os domínios especificados são permitidas.maxViolationsPerMinute: Número máximo de violações a serem enviadas para o reportUri.
Se não especificado, o valor padrão (100 violações) é usado.