
حزمة صديقة للمطورين ومهندسي الأمن لتأمين تطبيقات NodeJS.
Node Security Shield (NSS) هي أداة حماية ذاتية مفتوحة المصدر للتطبيق أثناء التشغيل (RASP) تهدف إلى سد الفجوة في أمان NodeJS الشامل من خلال تمكين المطور ومهندس الأمان من إعلان الموارد التي يمكن للتطبيق الوصول إليها.
مستوحاة من ثغرة Log4Shell (CVE-2021-44228) والتي يمكن استغلالها لأن التطبيق يمكنه إجراء استدعاءات شبكية عشوائية، شعرنا بوجود حاجة إلى أن يكون للتطبيق آلية يمكنها إعلان الصلاحيات التي يسمح بها من أجل جعل استغلال هذه الثغرات أكثر صعوبة من خلال تنفيذ ضوابط إضافية.
لتحقيق ذلك، يحتوي NSS (Node Security Shield) على سياسة الوصول إلى الموارد (RAP)
Resource Access Policy مماثلة لـ CSP(سياسة أمان المحتوى).
تتيح للمطور/مهندس الأمان إعلان الموارد التي يجب على التطبيق الوصول إليها. وسيقوم Node Security Shield بفرضها.
npm install nodesecurityshield
// Require Node Security Shield
let nodeSecurityShield = require('nodesecurityshield');
// Enable Attack Monitoring and/or Blocking
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: يحدد السلوك المقبول لـ Outbound Requests
blockedDomains بالأولوية على allowedDomains.blockedDomains أولاً ثم ضد allowedDomains.executedCommand: يحدد السلوك المقبول لـ Command Execution
allowedCommands قيمة من نوع String. يمكنك تمرير تعبير نمطي (RegEx) للسماح بنمط من الأوامر.executedCommand معرفة.pwd، وvar callbackFunction = function (violationEvent,violations,violationLimitPerMinReached) {
console.log(JSON.stringify(violationEvent,null, 4));
}
violationEvent - انتهاك RAP الذي حدث. يتم تقديمه كانتهاك CSP.
violations - عدد انتهاكات RAP. يُعاد تعيينه إلى الصفر كل دقيقة.
violationLimitPerMinReached - صحيح إذا تجاوز عدد انتهاكات RAP قيمة 'maxViolationsPerMinute' [خيار في RAP]
لحظر هجوم - طرح خطأ
throw new Error("Request Blocked. It violates declared Resource Access Policy.")
{
"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: يحتوي على معرف التطبيق الفريد (Unique-App-Id)، الذي تم تمريره أثناء تهيئة NSSblocked-uri: نطاق الطلب الصادر الذي انتهك سياسة RAPviolated-directive: connect-src هو مرادف لـ Outbound Request وكذلك script-src هو مرادف لـ Command Executionoriginal-policy: سياسة الوصول إلى الموارد (RAP) المنتهكةsource-file: تتبع المكدس (Stack Trace) لمكان حدوث هذا الانتهاك.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: يحدد السلوك المقبول لـ Outbound Requests
blockedDomains بالأولوية على allowedDomains.blockedDomains أولاً ثم ضد allowedDomains.executedCommand: يحدد السلوك المقبول لـ Command Execution
allowedCommands قيمة من نوع String. يمكنك تمرير تعبير نمطي (RegEx) للسماح بنمط من الأوامر.executedCommand معرفة.pwd، ولقطة شاشة من لوحة تحكم 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: يحدد السلوك المقبول لـ Outbound Requests
blockedDomains بالأولوية على allowedDomains.blockedDomains أولاً ثم ضد allowedDomains.executedCommand: يحدد السلوك المقبول لـ Command Execution
allowedCommands قيمة من نوع String. يمكنك تمرير تعبير نمطي (RegEx) للسماح بنمط من الأوامر.executedCommand معرفة.pwd، و.js داخل helper بالتشغيل كعمليات node..* في regex. لأن هذا سيسمح بتنفيذ أي أمر بعد أنبوب |..js داخل helper بالتشغيل كعمليات node..* في regex. لأن هذا سيسمح بتنفيذ أي أمر بعد أنبوب |.reportUri: يرسل الانتهاكات إلى نقطة نهاية معينة. نظرًا لأن الانتهاكات مشابهة لانتهاكات سياسة أمان المحتوى (CSP)، يمكن استخدام أي حلول مراقبة CSP. استخدمنا نقطة نهاية Sentry في سياسة RAP أعلاه..js داخل helper بالتشغيل كعمليات node..* في regex. لأن هذا سيسمح بتنفيذ أي أمر بعد أنبوب |.reportUri: يرسل الانتهاكات إلى نقطة نهاية معينة. نظرًا لأن الانتهاكات مشابهة لانتهاكات سياسة أمان المحتوى (CSP)، يمكن استخدام أي حلول مراقبة CSP. استخدمنا نقطة نهاية Sentry في سياسة RAP أعلاه.allowedDomain كائنات تحتوي على التالي
domain: مصفوفة من النطاقات المسموح بها للملفات المقدمة.modules: مصفوفة من الكائنات تحتوي على مسارات الملفات. يُسمح فقط بالطلبات الصادرة التي تتم من خلال هذه الملفات إلى النطاقات المحددة.maxViolationsPerMinute: الحد الأقصى لعدد الانتهاكات التي سيتم إرسالها إلى reportUri.
إذا لم يتم تحديده، يتم استخدام القيمة الافتراضية (100 انتهاك).