सुरक्षित रहें

एक्सटेंशन के पास ब्राउज़र में खास अनुमतियां होती हैं. इसलिए, हमलावर इन्हें आसानी से निशाना बना सकते हैं. अगर किसी एक्सटेंशन से समझौता किया जाता है, तो उस एक्सटेंशन का इस्तेमाल करने वाला हर व्यक्ति, दुर्भावनापूर्ण और अनचाहे दखलअंदाज़ी के लिए संवेदनशील हो जाता है. इन तरीकों को अपनाकर, एक्सटेंशन को सुरक्षित रखें और उसके उपयोगकर्ताओं को सुरक्षित रखें.

डेवलपर खातों को सुरक्षित रखना

एक्सटेंशन कोड को Google खातों के ज़रिए अपलोड और अपडेट किया जाता है. अगर डेवलपर के खातों से समझौता किया जाता है, तो हमलावर सीधे तौर पर सभी उपयोगकर्ताओं के लिए नुकसान पहुंचाने वाला कोड पुश कर सकता है. इन खातों को सुरक्षित रखने के लिए , दो तरीकों से पुष्टि करने की सुविधा चालू करें. हमारा सुझाव है कि आप सुरक्षा कुंजी का इस्तेमाल करें.

सदस्यों की भूमिकाओं का सही तरीके से इस्तेमाल करना

अगर आपके पब्लिशर के पास एक से ज़्यादा सदस्य हैं, तो पक्का करें कि हर उपयोगकर्ता को दी गई भूमिका सही हो.

एचटीटीपी का इस्तेमाल कभी न करें

डेटा का अनुरोध करते समय या डेटा भेजते समय, एचटीटीपी कनेक्शन का इस्तेमाल न करें. मान लें कि किसी भी एचटीटीपी कनेक्शन को कोई तीसरा पक्ष सुन सकता है या उसमें बदलाव कर सकता है. एचटीटीपीएस को हमेशा प्राथमिकता दी जानी चाहिए, क्योंकि इसमें सुरक्षा की सुविधा पहले से मौजूद होती है. इससे ज़्यादातर मैन-इन-द-मिडल अटैक से बचा जा सकता है.

कम से कम अनुमतियों का अनुरोध करना

Chrome ब्राउज़र, एक्सटेंशन को सिर्फ़ उन सुविधाओं का ऐक्सेस देता है जिनके लिए मेनिफ़ेस्ट में साफ़ तौर पर अनुरोध किया गया है. एक्सटेंशन को अपनी अनुमतियों को कम से कम रखना चाहिए. इसके लिए, उन्हें सिर्फ़ उन एपीआई और वेबसाइटों को रजिस्टर करना चाहिए जिन पर वे निर्भर हैं.

एक्सटेंशन के विशेषाधिकारों को सीमित करने से, हमलावर के लिए एक्सप्लॉइट करने के विकल्प कम हो जाते हैं.

क्रॉस-ऑरिजिन फ़ेच()

कोई एक्सटेंशन, एक्सटेंशन और अनुमतियों में बताए गए डोमेन से संसाधन पाने के लिए, सिर्फ़ 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
}

ऊपर दिए गए सैंपल में मौजूद यह एक्सटेंशन, developer.chrome.com और Google के सबडोमेन पर मौजूद किसी भी चीज़ को ऐक्सेस करने का अनुरोध करता है. इसके लिए, वह अनुमतियों में "https://developer.chrome.com/*" और "https://*.google.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 की मदद से, एचटीएमएल एलिमेंट को डाइनैमिक तरीके से बनाना आसान हो सकता है. हालांकि, इससे एक्सटेंशन और एक्सटेंशन पर निर्भर वेब पेज, हमलावरों के लिए खुले हो जाते हैं. हमलावर, नुकसान पहुंचाने वाली स्क्रिप्ट डाल सकते हैं. इसके बजाय, मैन्युअल तरीके से DOM नोड बनाएं और डाइनैमिक कॉन्टेंट डालने के लिए innerText का इस्तेमाल करें.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

कॉन्टेंट स्क्रिप्ट का इस्तेमाल सावधानी से करें

कॉन्टेंट स्क्रिप्ट, आइसोलेटेड वर्ल्ड में रहती हैं. हालांकि, इन पर हमले हो सकते हैं:

  • कॉन्टेंट स्क्रिप्ट, एक्सटेंशन का वह हिस्सा होती हैं जो वेब पेज के साथ सीधे तौर पर इंटरैक्ट करती हैं. इस वजह से, नुकसान पहुंचाने वाले वेब पेज, डीओएम के उन हिस्सों में बदलाव कर सकते हैं जिन पर कॉन्टेंट स्क्रिप्ट निर्भर करती है. इसके अलावा, वे वेब स्टैंडर्ड के अनचाहे व्यवहार का गलत फ़ायदा उठा सकते हैं. जैसे, नाम वाले आइटम.
  • वेब पेजों के DOM के साथ इंटरैक्ट करने के लिए, कॉन्टेंट स्क्रिप्ट को उसी रेंडरर प्रोसेस में एक्ज़ीक्यूट करना होगा जिसमें वेब पेज है. इस वजह से, कॉन्टेंट स्क्रिप्ट, साइड चैनल के ज़रिए होने वाले हमलों (जैसे, Spectre) से डेटा लीक होने के खतरे में रहती हैं. साथ ही, अगर कोई नुकसान पहुंचाने वाला वेब पेज, रेंडरर प्रोसेस से समझौता करता है, तो हमलावर कॉन्टेंट स्क्रिप्ट को अपने कंट्रोल में ले सकता है.

संवेदनशील डेटा (जैसे, उपयोगकर्ता की निजी जानकारी) का इस्तेमाल करने वाले ऑपरेशन या ब्राउज़र के फ़ंक्शन ऐक्सेस करने वाले Chrome API, एक्सटेंशन के सर्विस वर्कर में किए जाने चाहिए. कॉन्टेंट स्क्रिप्ट को गलती से एक्सटेंशन के विशेषाधिकारों का ऐक्सेस देने से बचें:

इनपुट रजिस्टर करना और उन्हें सैनिटाइज़ करना

एक्सटेंशन को नुकसान पहुंचाने वाली स्क्रिप्ट से सुरक्षित रखें. इसके लिए, लिसनर को सिर्फ़ उतना डेटा दें जितना एक्सटेंशन को चाहिए. साथ ही, आने वाले डेटा को भेजने वालों की पुष्टि करें और सभी इनपुट को साफ़ करें.

एक्सटेंशन को सिर्फ़ तब runtime.onMessageExternal के लिए रजिस्टर करना चाहिए, जब उसे किसी बाहरी वेबसाइट या एक्सटेंशन से कम्यूनिकेशन करना हो. हमेशा यह पुष्टि करें कि ईमेल भेजने वाला व्यक्ति, भरोसेमंद सोर्स से हो.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

browser.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

एक्सटेंशन से runtime.onMessage इवेंट के ज़रिए भेजे गए मैसेज की भी जांच की जानी चाहिए, ताकि यह पक्का किया जा सके कि MessageSender, किसी ऐसी कॉन्टेंट स्क्रिप्ट से न हो जिसे हैक कर लिया गया हो.

browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});