एक्सटेंशन के पास ब्राउज़र में खास अनुमतियां होती हैं. इसलिए, ये हमलावरों के लिए एक आकर्षक टारगेट बन जाते हैं. अगर कोई एक्सटेंशन हैक हो जाता है, तो उस एक्सटेंशन का हर उपयोगकर्ता, नुकसान पहुंचाने वाले और अनचाहे घुसपैठ के लिए संवेदनशील हो जाता है. इन तरीकों को अपनाकर, किसी एक्सटेंशन को सुरक्षित रखें और उसके उपयोगकर्ताओं को सुरक्षित रखें.
डेवलपर खातों को सुरक्षित रखना
एक्सटेंशन का कोड, Google खातों के ज़रिए अपलोड और अपडेट किया जाता है. अगर डेवलपर के खाते हैक हो जाते हैं, तो कोई हमलावर सीधे सभी उपयोगकर्ताओं को नुकसान पहुंचाने वाला कोड भेज सकता है. इन खातों को सुरक्षित रखने के लिए , दो तरीकों से पुष्टि करने की सुविधा चालू करें. बेहतर होगा कि इसके लिए सुरक्षा कुंजी का इस्तेमाल किया जाए.
सदस्यों की भूमिकाएं तय करना
अगर आपके पब्लिशर के पास एक से ज़्यादा सदस्य हैं, तो पक्का करें कि हर उपयोगकर्ता को दी गई भूमिका सही हो.
कभी भी एचटीटीपी का इस्तेमाल न करें
डेटा का अनुरोध करते या भेजते समय, एचटीटीपी कनेक्शन का इस्तेमाल न करें. मान लें कि एचटीटीपी कनेक्शन में, सेंध लगाने वाले लोग मौजूद होंगे या उनमें बदलाव किए गए होंगे. एचटीटीपीएस को हमेशा प्राथमिकता दी जानी चाहिए, क्योंकि इसमें सुरक्षा की सुविधा पहले से मौजूद होती है. इससे, ज़्यादातर मैन-इन-द-मिडल हमलों से बचा जा सकता है.
कम से कम अनुमतियों का अनुरोध करना
Chrome ब्राउज़र, किसी एक्सटेंशन को सिर्फ़ उन अनुमतियों का ऐक्सेस देता है जिनका साफ़ तौर पर मेनिफ़ेस्ट में अनुरोध किया गया है. एक्सटेंशन को सिर्फ़ उन एपीआई और वेबसाइटों को रजिस्टर करके अपनी अनुमतियां कम करनी चाहिए जिन पर वे निर्भर हैं.
किसी एक्सटेंशन की अनुमतियां सीमित करने से, यह तय होता है कि कोई संभावित हमलावर किस चीज़ का फ़ायदा उठा सकता है.
क्रॉस-ऑरिजिन फ़ेच()
कोई एक्सटेंशन, fetch() और XMLHttpRequest() का इस्तेमाल करके, सिर्फ़ एक्सटेंशन और अनुमतियों में बताए गए डोमेन से संसाधन पा सकता है. ध्यान दें कि दोनों के लिए किए गए कॉल,
सर्विस वर्कर में फ़ेच हैंडलर से इंटरसेप्ट किए जाते हैं.
{
"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 और Google के सबडोमेन पर मौजूद किसी भी चीज़ का ऐक्सेस पाने का अनुरोध करता है. अगर एक्सटेंशन हैक हो जाता है, तो भी उसके पास सिर्फ़ उन वेबसाइटों के साथ इंटरैक्ट करने की अनुमति होगी जो मैच पैटर्न के मुताबिक हों. हमलावर के पास "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 की मदद से, एचटीएमएल एलिमेंट को डाइनैमिक तरीके से बनाना आसान हो सकता है. हालांकि, इससे एक्सटेंशन और एक्सटेंशन पर निर्भर वेब पेजों में, नुकसान पहुंचाने वाली स्क्रिप्ट डालने के लिए हमलावरों को मौका मिल जाता है. इसके बजाय, DOM नोड को मैन्युअल तरीके से बनाएं और डाइनैमिक कॉन्टेंट डालने के लिए innerText का इस्तेमाल करें.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
कॉन्टेंट स्क्रिप्ट का इस्तेमाल ध्यान से करना
कॉन्टेंट स्क्रिप्ट, आइसोलेट किए गए एनवायरमेंट में काम करती हैं. हालांकि, ये हमलों से सुरक्षित नहीं होती हैं:
- कॉन्टेंट स्क्रिप्ट, एक्सटेंशन का वह हिस्सा होती हैं जो सीधे वेब पेज के साथ इंटरैक्ट करती हैं. इस वजह से, नुकसान पहुंचाने वाले वेब पेज, DOM के उन हिस्सों में बदलाव कर सकते हैं जिन पर कॉन्टेंट स्क्रिप्ट निर्भर करती हैं. इसके अलावा, वे वेब स्टैंडर्ड के ऐसे व्यवहार का फ़ायदा उठा सकते हैं जो चौंकाने वाले हों. जैसे, नाम वाले आइटम.
- वेब पेजों के DOM के साथ इंटरैक्ट करने के लिए, कॉन्टेंट स्क्रिप्ट को वेब पेज के जैसे ही रेंडरर प्रोसेस में एक्ज़ीक्यूट करना होता है. इससे, कॉन्टेंट स्क्रिप्ट, साइड चैनल हमलों (जैसे, Spectre) के ज़रिए डेटा लीक करने के लिए संवेदनशील हो जाती हैं. साथ ही, अगर कोई नुकसान पहुंचाने वाला वेब पेज, रेंडरर प्रोसेस को हैक कर लेता है , तो हमलावर कॉन्टेंट स्क्रिप्ट को अपने कंट्रोल में ले सकता है.
संवेदनशील डेटा (जैसे, उपयोगकर्ता की निजी जानकारी) या Chrome API का इस्तेमाल करके की जाने वाली कार्रवाइयां, एक्सटेंशन के सर्विस वर्कर में की जानी चाहिए. इन एपीआई के पास ब्राउज़र के फ़ंक्शन का ऐक्सेस होता है. कॉन्टेंट स्क्रिप्ट के लिए, एक्सटेंशन की अनुमतियां गलती से भी न दिखाएं:
- मान लें कि कॉन्टेंट स्क्रिप्ट से मिले मैसेज, किसी हमलावर ने तैयार किए होंगे.जैसे, सभी इनपुट की पुष्टि करें और उन्हें सैनिटाइज़ करें. साथ ही, अपनी स्क्रिप्ट को क्रॉस-साइट स्क्रिप्टिंग से बचाएं.
- मान लें कि कॉन्टेंट स्क्रिप्ट को भेजा गया कोई भी डेटा, वेब पेज पर लीक हो सकता है. कॉन्टेंट स्क्रिप्ट को संवेदनशील डेटा न भेजें. जैसे, एक्सटेंशन से मिले सीक्रेट, दूसरे वेब ऑरिजिन से मिला डेटा, ब्राउज़िंग इतिहास.
- अनुमतियों वाली उन कार्रवाइयों का दायरा सीमित करें जिन्हें कॉन्टेंट स्क्रिप्ट की मदद से ट्रिगर किया जा सकता है. कॉन्टेंट स्क्रिप्ट को, किसी भी यूआरएल पर अनुरोध ट्रिगर करने या एक्सटेंशन एपीआई को कोई भी आर्ग्युमेंट पास करने की अनुमति न दें. जैसे,
fetch()याchrome.tabs.create()तरीकों को कोई भी यूआरएल पास करने की अनुमति न दें.
इनपुट रजिस्टर करना और उन्हें सैनिटाइज़ करना
एक्सटेंशन को नुकसान पहुंचाने वाली स्क्रिप्ट से बचाने के लिए, लिसनर को सिर्फ़ उन स्क्रिप्ट तक सीमित रखें जिनकी एक्सटेंशन को उम्मीद है. साथ ही, आने वाले डेटा के सेंडर की पुष्टि करें और सभी इनपुट को सैनिटाइज़ करें.
किसी एक्सटेंशन को 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.");
});