এক্সটেনশনগুলোর ব্রাউজারের মধ্যে বিশেষ সুবিধা ব্যবহারের সুযোগ থাকে, যা সেগুলোকে আক্রমণকারীদের জন্য একটি লোভনীয় লক্ষ্যে পরিণত করে। যদি কোনো এক্সটেনশন হ্যাক হয়, তবে সেই এক্সটেনশনের প্রত্যেক ব্যবহারকারী ক্ষতিকর ও অনাকাঙ্ক্ষিত অনুপ্রবেশের ঝুঁকিতে পড়ে। এই পদ্ধতিগুলো অনুসরণ করে একটি এক্সটেনশনকে সুরক্ষিত রাখুন এবং এর ব্যবহারকারীদের সুরক্ষিত রাখুন।
ডেভেলপার অ্যাকাউন্ট সুরক্ষিত রাখুন
এক্সটেনশন কোড গুগল অ্যাকাউন্টের মাধ্যমে আপলোড ও আপডেট করা হয়। যদি ডেভেলপারদের অ্যাকাউন্ট হ্যাক হয়, তবে একজন আক্রমণকারী সরাসরি সকল ব্যবহারকারীর কাছে ক্ষতিকারক কোড পাঠিয়ে দিতে পারে। টু-ফ্যাক্টর অথেনটিকেশন চালু করে, বিশেষত একটি সিকিউরিটি কী ব্যবহার করে, এই অ্যাকাউন্টগুলোকে সুরক্ষিত রাখুন।
উপযুক্ত সদস্য ভূমিকা ব্যবহার করুন
আপনার পাবলিশারের একাধিক সদস্য থাকলে, প্রত্যেক ব্যবহারকারীকে দেওয়া ভূমিকাটি যথাযথ কিনা তা নিশ্চিত করুন।
কখনো HTTP ব্যবহার করবেন না
ডেটা অনুরোধ বা প্রেরণ করার সময় HTTP সংযোগ এড়িয়ে চলুন। ধরে নিন যে যেকোনো HTTP সংযোগে আড়িপাতা থাকবে অথবা তাতে পরিবর্তন করা থাকবে। সর্বদা HTTPS-কে অগ্রাধিকার দেওয়া উচিত, কারণ এতে অন্তর্নির্মিত নিরাপত্তা ব্যবস্থা রয়েছে যা বেশিরভাগ ম্যান-ইন-দ্য-মিডল আক্রমণ প্রতিরোধ করে।
ন্যূনতম অনুমতির জন্য অনুরোধ করুন
ক্রোম ব্রাউজার একটি এক্সটেনশনের অ্যাক্সেসকে শুধুমাত্র সেইসব সুবিধার মধ্যে সীমাবদ্ধ রাখে, যেগুলোর জন্য ম্যানিফেস্টে স্পষ্টভাবে অনুরোধ করা হয়েছে। এক্সটেনশনগুলোর উচিত শুধুমাত্র সেইসব এপিআই (API) এবং ওয়েবসাইট রেজিস্টার করার মাধ্যমে তাদের অনুমতি সীমিত রাখা, যেগুলোর ওপর তারা নির্ভরশীল।
কোনো এক্সটেনশনের বিশেষাধিকার সীমিত করলে, একজন সম্ভাব্য আক্রমণকারী কী কাজে লাগাতে পারবে তাও সীমিত হয়ে যায়।
ক্রস-অরিজিন ফেচ()
একটি এক্সটেনশন শুধুমাত্র নিজের এবং পারমিশনে নির্দিষ্ট করা ডোমেইনগুলো থেকে রিসোর্স পেতে fetch() এবং XMLHttpRequest() ব্যবহার করতে পারে। উল্লেখ্য যে, এই দুটি ফাংশনের কলই সার্ভিস ওয়ার্কারের `fetch` হ্যান্ডলার দ্বারা ইন্টারসেপ্ট করা হয়।
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"host_permissions": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"manifest_version": 3
}
উপরের নমুনায় থাকা এই এক্সটেনশনটি পারমিশনে "https://developer.chrome.com/*" এবং "https://*.google.com/*" উল্লেখ করার মাধ্যমে developer.chrome.com এবং গুগলের সাবডোমেইনগুলোতে থাকা যেকোনো কিছুতে অ্যাক্সেসের অনুরোধ করে। যদি এক্সটেনশনটি হ্যাকও হয়, তবুও এটির কেবল সেইসব ওয়েবসাইটের সাথেই ইন্টারঅ্যাক্ট করার অনুমতি থাকবে যেগুলো এই ম্যাচ প্যাটার্নের সাথে মেলে। আক্রমণকারীর কেবল "https://user_bank_info.com" অ্যাক্সেস করার, বা "https://malicious_website.com" এর সাথে ইন্টারঅ্যাক্ট করার সীমিত ক্ষমতা থাকবে।
ম্যানিফেস্ট ক্ষেত্রগুলি সীমিত করুন
ম্যানিফেস্টে অপ্রয়োজনীয় কী এবং পারমিশন অন্তর্ভুক্ত করলে দুর্বলতা তৈরি হয় এবং এক্সটেনশনটি আরও সহজে দৃশ্যমান হয়ে পড়ে। ম্যানিফেস্ট ফিল্ডগুলোকে শুধু সেগুলোর মধ্যেই সীমাবদ্ধ রাখুন, যেগুলোর ওপর এক্সটেনশনটি নির্ভর করে।
বাহ্যিকভাবে সংযোগযোগ্য
এক্সটেনশনটি কোন কোন বাহ্যিক এক্সটেনশন এবং ওয়েব পেজের সাথে তথ্য আদান-প্রদান করবে তা নির্ধারণ করতে "externally_connectable" ফিল্ডটি ব্যবহার করুন। এক্সটেনশনটি শুধুমাত্র বিশ্বস্ত উৎসের সাথেই বাহ্যিকভাবে সংযোগ স্থাপন করতে পারবে, তা সীমাবদ্ধ করুন।
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"accepts_tls_channel_id": false
},
...
}
ওয়েব-অ্যাক্সেসযোগ্য সম্পদ
"web_accessible_resources" এর অধীনে রিসোর্সগুলিকে ওয়েবের জন্য অ্যাক্সেসযোগ্য করে তুললে, একটি এক্সটেনশন ওয়েবসাইট এবং আক্রমণকারীদের কাছে শনাক্তযোগ্য হয়ে উঠবে।
{
...
"web_accessible_resources": [
{
"resources": [ "test1.png", "test2.png" ],
"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
}
]
...
}
ওয়েবে যত বেশি রিসোর্স পাওয়া যাবে, একজন সম্ভাব্য আক্রমণকারী তত বেশি সুযোগ কাজে লাগাতে পারবে। এই ফাইলগুলো ন্যূনতম পরিমাণে রাখুন।
একটি সুস্পষ্ট বিষয়বস্তু নিরাপত্তা নীতি অন্তর্ভুক্ত করুন
ক্রস-সাইট স্ক্রিপ্টিং আক্রমণ প্রতিরোধ করতে এক্সটেনশনটির ম্যানিফেস্টে একটি কন্টেন্ট সিকিউরিটি পলিসি অন্তর্ভুক্ত করুন। যদি এক্সটেনশনটি শুধুমাত্র নিজের থেকেই রিসোর্স লোড করে, তাহলে নিম্নলিখিতগুলি রেজিস্টার করুন:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": {
"extension_pages": "default-src 'self'"
},
"manifest_version": 3
}
যদি এক্সটেনশনটির ওয়েব অ্যাসেম্বলি ব্যবহার করার প্রয়োজন হয়, অথবা স্যান্ডবক্সড পেজগুলোর ওপর বিধিনিষেধ বাড়ানোর প্রয়োজন হয়, তবে সেগুলো যোগ করা যেতে পারে:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": {
"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';",
"sandboxed_pages":"script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
},
"manifest_version": 3
}
document.write() এবং innerHTML পরিহার করুন
document.write() এবং innerHTML ব্যবহার করে ডাইনামিকভাবে HTML এলিমেন্ট তৈরি করা সহজ হলেও, এতে এক্সটেনশনটি এবং এর ওপর নির্ভরশীল ওয়েব পেজগুলো আক্রমণকারীদের দ্বারা ক্ষতিকারক স্ক্রিপ্ট ঢোকানোর ঝুঁকিতে থাকে। এর পরিবর্তে, ম্যানুয়ালি DOM নোড তৈরি করুন এবং ডাইনামিক কন্টেন্ট যোগ করতে innerText ব্যবহার করুন।
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
কন্টেন্ট স্ক্রিপ্ট সাবধানে ব্যবহার করুন
যদিও কন্টেন্ট স্ক্রিপ্টগুলো একটি বিচ্ছিন্ন জগতে থাকে, তবুও সেগুলো আক্রমণ থেকে মুক্ত নয়:
- কন্টেন্ট স্ক্রিপ্ট হলো একটি এক্সটেনশনের একমাত্র অংশ যা সরাসরি ওয়েব পেজের সাথে যোগাযোগ করে। এই কারণে, ক্ষতিকর ওয়েব পেজগুলো কন্টেন্ট স্ক্রিপ্টের উপর নির্ভরশীল DOM-এর অংশবিশেষে পরিবর্তন আনতে পারে, অথবা নেমড আইটেমের মতো অপ্রত্যাশিত ওয়েব স্ট্যান্ডার্ড আচরণের অপব্যবহার করতে পারে।
- ওয়েব পেজের DOM-এর সাথে ইন্টারঅ্যাক্ট করার জন্য, কন্টেন্ট স্ক্রিপ্টগুলোকে ওয়েব পেজের সাথে একই রেন্ডারার প্রসেসে এক্সিকিউট করতে হয়। এর ফলে কন্টেন্ট স্ক্রিপ্টগুলো সাইড চ্যানেল অ্যাটাকের (যেমন, Spectre ) মাধ্যমে ডেটা ফাঁসের ঝুঁকিতে থাকে এবং কোনো ক্ষতিকারক ওয়েব পেজ রেন্ডারার প্রসেসকে কম্প্রোমাইজ করলে আক্রমণকারীর দ্বারা এর নিয়ন্ত্রণ নেওয়ার সম্ভাবনা থাকে।
সংবেদনশীল ডেটা (যেমন ব্যবহারকারীর ব্যক্তিগত তথ্য) ব্যবহার করে এমন অপারেশন অথবা ব্রাউজারের ফাংশনগুলিতে অ্যাক্সেস আছে এমন Chrome API এক্সটেনশনের সার্ভিস ওয়ার্কারে সম্পাদন করা উচিত। ভুলবশত কন্টেন্ট স্ক্রিপ্টের কাছে এক্সটেনশনের বিশেষাধিকার প্রকাশ করা থেকে বিরত থাকুন:
- ধরে নিন যে একটি কন্টেন্ট স্ক্রিপ্ট থেকে আসা বার্তাগুলো কোনো আক্রমণকারী দ্বারা তৈরি করা হয়ে থাকতে পারে (যেমন, সমস্ত ইনপুট যাচাই ও পরিমার্জন করুন এবং আপনার স্ক্রিপ্টগুলোকে ক্রস-সাইট স্ক্রিপ্টিং থেকে সুরক্ষিত রাখুন)।
- মনে রাখবেন, কন্টেন্ট স্ক্রিপ্টে পাঠানো যেকোনো ডেটা ওয়েব পেজে ফাঁস হয়ে যেতে পারে। কন্টেন্ট স্ক্রিপ্টে সংবেদনশীল ডেটা (যেমন এক্সটেনশনের গোপনীয় তথ্য, অন্যান্য ওয়েব অরিজিনের ডেটা, ব্রাউজিং হিস্ট্রি) পাঠাবেন না।
- কন্টেন্ট স্ক্রিপ্ট দ্বারা ট্রিগার করা যেতে পারে এমন বিশেষাধিকারপ্রাপ্ত ক্রিয়াকলাপগুলির পরিধি সীমিত করুন। কন্টেন্ট স্ক্রিপ্টকে যথেচ্ছ URL-এ অনুরোধ ট্রিগার করতে বা এক্সটেনশন API-গুলিতে যথেচ্ছ আর্গুমেন্ট পাস করতে দেবেন না (যেমন,
fetch()বাchrome.tabs.create()মেথডগুলিতে যথেচ্ছ URL পাস করার অনুমতি দেবেন না)।
ইনপুটগুলি নিবন্ধন এবং স্যানিটাইজ করুন
লিসেনারকে শুধুমাত্র এক্সটেনশনের প্রত্যাশিত তথ্যের মধ্যে সীমাবদ্ধ রেখে, আগত ডেটার প্রেরকদের যাচাই করে এবং সমস্ত ইনপুট স্যানিটাইজ করার মাধ্যমে একটি এক্সটেনশনকে ক্ষতিকারক স্ক্রিপ্ট থেকে সুরক্ষিত রাখুন।
একটি এক্সটেনশন কেবল তখনই runtime.onMessageExternal জন্য রেজিস্টার করবে, যখন এটি কোনো বাহ্যিক ওয়েবসাইট বা এক্সটেনশন থেকে যোগাযোগের প্রত্যাশা করবে। প্রেরক একটি বিশ্বস্ত উৎসের সাথে মেলে কিনা, তা সর্বদা যাচাই করুন।
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
এমনকি এক্সটেনশনটির নিজস্ব runtime.onMessage ইভেন্টের মাধ্যমে পাঠানো বার্তাগুলোও পুঙ্খানুপুঙ্খভাবে খতিয়ে দেখা উচিত, যাতে নিশ্চিত করা যায় যে MessageSender কোনো আপোসকৃত কন্টেন্ট স্ক্রিপ্ট থেকে আসছে না।
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});