Prototype Pollution: জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনে কোড ইনজেকশন এবং এর ভয়াবহ সাইবার ঝুঁকি!
JavaScript Prototype Pollution-এর কাজের প্রক্রিয়া, রিয়েল-ওয়ার্ল্ড CVE, এবং কার্যকর প্রতিরক্ষা কৌশল।
জাভাস্ক্রিপ্ট আজকের ওয়েব ডেভেলপমেন্টের মেরুদণ্ড। Node.js-এর কল্যাণে এটি সার্ভার-সাইডেও ব্যাপকভাবে ব্যবহৃত হচ্ছে। কিন্তু JavaScript-এর একটি অনন্য বৈশিষ্ট্য — প্রোটোটাইপ-ভিত্তিক ইনহেরিটেন্স — একটি বিশেষ ধরনের নিরাপত্তা দুর্বলতার জন্ম দিয়েছে: Prototype Pollution। এই আক্রমণ পদ্ধতি প্রথম ২০১৮ সালে Olivier Arteau তার DEF CON উপস্থাপনায় ব্যাপকভাবে আলোচনা করেন, এবং এরপর থেকে এটি অসংখ্য জনপ্রিয় npm প্যাকেজে (lodash, jQuery, Express, Mongoose) আবিষ্কৃত হয়েছে।
Prototype Pollution-এর ভয়াবহতা এর সর্বব্যাপী প্রভাবের কারণে। একবার যদি গ্লোবাল Object.prototype দূষিত হয়, তবে অ্যাপ্লিকেশনের সমস্ত অবজেক্ট প্রভাবিত হয়, যা DoS, অথেন্টিকেশন বাইপাস, এবং এমনকি Remote Code Execution-এর দিকে নিয়ে যেতে পারে। এই প্রবন্ধে আমরা গভীরভাবে আলোচনা করব এর প্রক্রিয়া, বাস্তব উদাহরণ, এবং প্রতিরক্ষা কৌশল।
মূল ধারণা
JavaScript-এ প্রতিটি অবজেক্টের একটি লুকানো প্রোপার্টি __proto__ থাকে, যা তার প্রোটোটাইপের দিকে নির্দেশ করে। যখন আপনি একটি প্রোপার্টি অ্যাক্সেস করেন, JavaScript প্রথমে অবজেক্টে খোঁজে, না পেলে প্রোটোটাইপে যায়, এবং এভাবে চেইন উপরে যেতে থাকে যতক্ষণ না Object.prototype-এ পৌঁছায়।
const obj = {};
console.log(obj.toString); // function from Object.prototype
console.log(obj.__proto__ === Object.prototype); // true
Prototype Pollution ঘটে যখন আক্রমণকারী এমনভাবে অবজেক্ট ম্যানিপুলেট করতে পারে যে সে Object.prototype-এ নতুন প্রোপার্টি যুক্ত বা পরিবর্তন করতে পারে। এর ফলে অ্যাপ্লিকেশনের প্রতিটি অবজেক্ট সেই প্রোপার্টি ইনহেরিট করে।
দুর্বল প্যাটার্ন
সাধারণত পল্যুশন হয় তিন ধরনের অপারেশনে:
Recursive Merge: যখন একটি ফাংশন target[key] = source[key] করে অবজেক্ট মার্জ করে, এবং key যদি __proto__ হয়, তাহলে আক্রমণ সম্ভব।
function merge(target, source) {
for (let key in source) {
if (typeof source[key] === 'object') {
if (!target[key]) target[key] = {};
merge(target[key], source[key]);
} else {
target[key] = source[key];
}
}
return target;
}
const userInput = JSON.parse('{"__proto__": {"polluted": true}}');
merge({}, userInput);
console.log({}.polluted); // true
Property Assignment by Path: lodash.set বা সদৃশ ফাংশন যা ডট-নোটেশন বা অ্যারে পাথ ব্যবহার করে গভীর প্রোপার্টি সেট করে।
_.set({}, '__proto__.polluted', true);
Object.assign on Untrusted Input: যদিও Object.assign সাধারণত নিরাপদ, কিন্তু কাস্টম র্যাপারে সমস্যা হতে পারে।
বাস্তব উদাহরণ
lodash CVE-2019-10744
lodash লাইব্রেরির defaultsDeep ফাংশনে Prototype Pollution ভালনারেবিলিটি ছিল। লক্ষ লক্ষ npm প্যাকেজ এটি ব্যবহার করত, তাই প্রভাব ছিল বিশাল।
const _ = require('lodash');
_.defaultsDeep({}, JSON.parse('{"__proto__":{"foo":"bar"}}'));
console.log({}.foo); // "bar"
jQuery CVE-2019-11358
jQuery-এর extend ফাংশনে অনুরূপ দুর্বলতা ছিল। যেহেতু jQuery বিশ্বের প্রায় সকল ওয়েবসাইটে ব্যবহৃত হয়, এটি ব্যাপক প্যাচিং অভিযানের প্রয়োজন হয়েছিল।
Mongoose CVE-2022-2564
MongoDB ORM Mongoose-এ Schema.path() মেথডে Prototype Pollution আবিষ্কৃত হয়েছিল। এটি ডেটাবেস অপারেশনে গুরুতর প্রভাব ফেলতে পারত।
বাস্তব এক্সপ্লয়েট চেইন
Prototype Pollution একা প্রায়ই DoS-এ সীমাবদ্ধ। কিন্তু এর সত্যিকারের ভয়াবহতা প্রকাশ পায় যখন এটি অন্য দুর্বলতার সাথে চেইন হয়:
অথেন্টিকেশন বাইপাস:
// দুর্বল কোড
function isAdmin(user) {
return user.isAdmin === true;
}
// পল্যুশন: Object.prototype.isAdmin = true
// যেকোনো ইউজার এখন অ্যাডমিন
RCE in Node.js: কিছু পল্যুশন child_process.spawn-এর অপশনে বা require মেকানিজমে কোড এক্সিকিউশনে পরিণত হতে পারে। ২০২১ সালে গবেষকরা Kibana-তে Prototype Pollution → RCE চেইন প্রদর্শন করেছিলেন।
Object.prototype.shell = "/bin/sh";
Object.prototype.argv0 = "-c";
Object.prototype.env = {};
require('child_process').spawn('echo', ['hello']);
Client-Side XSS: ব্রাউজার-সাইডে Prototype Pollution প্রায়ই XSS-এ পরিণত হয়। DOMPurify বাইপাস, sanitizer বাইপাস — এ ধরনের চেইন বাস্তবে পাওয়া গেছে।
ডিটেকশন কৌশল
Prototype Pollution শনাক্তকরণে কয়েকটি কৌশল কার্যকর।
স্ট্যাটিক অ্যানালাইসিস: Semgrep, ESLint plugin (eslint-plugin-security), এবং Snyk Code এই ধরনের দুর্বলতা শনাক্ত করতে পারে। কাস্টম রুল লিখে নির্দিষ্ট প্যাটার্ন (যেমন রিকার্সিভ মার্জ ফাংশনে আনচেকড কী) খুঁজে বের করা যায়।
ডাইনামিক টেস্টিং: Burp Suite-এ Prototype Pollution স্ক্যানার এক্সটেনশন রয়েছে। আক্রমণ পেলোডের একটি সাধারণ তালিকা:
{"__proto__": {"polluted": "yes"}}
{"constructor": {"prototype": {"polluted": "yes"}}}
{"__proto__.polluted": "yes"}
Browser DevTools: ক্লায়েন্ট-সাইড টেস্টিংয়ে কনসোলে ({}).polluted চেক করে দেখা যায় পল্যুশন হয়েছে কিনা।
Fuzzing: গভীর পাথ-ভিত্তিক ফাজিং নতুন গ্যাজেট আবিষ্কারে সহায়ক।
প্রতিরোধ ও প্রতিকার
প্রোটোটাইপ পল্যুশন প্রতিরোধে ডেভেলপারদের কয়েকটি কৌশল অনুসরণ করা উচিত।
প্রথমত, Object.create(null) ব্যবহার করুন। এটি একটি প্রোটোটাইপহীন অবজেক্ট তৈরি করে।
const safeObj = Object.create(null);
// safeObj.__proto__ undefined
দ্বিতীয়ত, Map ব্যবহার করুন। সাধারণ অবজেক্টের পরিবর্তে যেখানে কী-ভ্যালু স্টোরেজ প্রয়োজন, সেখানে Map ব্যবহার করুন। Map-এ প্রোটোটাইপ চেইন প্রভাবিত হয় না।
const userMap = new Map();
userMap.set(userInput.key, userInput.value);
তৃতীয়ত, Object.freeze(Object.prototype)। অ্যাপ্লিকেশন শুরুতে এটি কল করলে কেউ গ্লোবাল প্রোটোটাইপ পরিবর্তন করতে পারে না।
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Function.prototype);
চতুর্থত, কী ভ্যালিডেশন। কোনো মার্জ বা সেট অপারেশনের আগে কী চেক করুন:
function safeMerge(target, source) {
for (let key in source) {
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
continue;
}
if (typeof source[key] === 'object' && source[key] !== null) {
if (!target[key]) target[key] = {};
safeMerge(target[key], source[key]);
} else {
target[key] = source[key];
}
}
return target;
}
পঞ্চমত, নির্ভরযোগ্য লাইব্রেরি ব্যবহার করুন। Object.assign, structuredClone, এবং সাম্প্রতিক সংস্করণের lodash.merge নিরাপদ। সর্বদা npm audit চালান এবং নির্ভরশীলতা আপডেট রাখুন।
ষষ্ঠত, নতুন ECMAScript ফিচার। আধুনিক JavaScript-এ hasOwn(), ?., এবং অন্যান্য ফিচার নিরাপদ কোড লেখা সহজ করে।
সপ্তমত, সিকিউরিটি হেডার এবং CSP। ক্লায়েন্ট-সাইডে Prototype Pollution-ভিত্তিক XSS প্রতিরোধে Content Security Policy অত্যন্ত গুরুত্বপূর্ণ।
অষ্টমত, নিয়মিত SAST/DAST এবং পেনিট্রেশন টেস্টিং। CI/CD পাইপলাইনে স্বয়ংক্রিয় স্ক্যান এবং বছরে অন্তত একবার পেশাদার পেনিট্রেশন টেস্ট চালানো উচিত।
Prototype Pollution জাভাস্ক্রিপ্টের একটি অনন্য, প্রায়ই উপেক্ষিত নিরাপত্তা চ্যালেঞ্জ। এর সরলতা প্রতারণামূলক — মাত্র একটি __proto__ কী একটি অ্যাপ্লিকেশনের পুরো নিরাপত্তা কাঠামো ধসিয়ে দিতে পারে। ডেভেলপারদের অবশ্যই JavaScript-এর প্রোটোটাইপ ইনহেরিটেন্স গভীরভাবে বোঝা, নিরাপদ কোডিং প্যাটার্ন গ্রহণ করা, এবং তৃতীয়-পক্ষ লাইব্রেরির ভালনারেবিলিটি সম্পর্কে সচেতন থাকা প্রয়োজন। আজকের সাপ্লাই চেইন আক্রমণের যুগে একটি দূষিত ডিপেন্ডেন্সি লক্ষ লক্ষ অ্যাপ্লিকেশনকে ঝুঁকিতে ফেলতে পারে। তাই Prototype Pollution-কে কেবল একটি নির্দিষ্ট বাগ হিসেবে নয়, বরং পুরো অ্যাপ্লিকেশন সিকিউরিটি দর্শনের একটি অংশ হিসেবে বিবেচনা করুন।
আপনার জ্ঞান যাচাই করতে প্রস্তুত? আজই HackCert-এ Prototype Pollution MCQ Quiz-টি দিন!

