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

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

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

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

ग्रुप को चुनिंदा रखना

ग्रुप पब्लिशिंग का इस्तेमाल करने पर, ग्रुप को भरोसेमंद डेवलपर तक ही सीमित रखें. अनजान लोगों से सदस्यता के अनुरोध स्वीकार न करें.

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

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

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

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

किसी एक्सटेंशन की अनुमतियों को सीमित करने से, हमलावर का फ़ायदा कम हो जाता है.

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

एक्सटेंशन, 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
}

ऊपर दिए गए सैंपल में मौजूद यह एक्सटेंशन, 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 की मदद से, डाइनैमिक तौर पर एचटीएमएल एलिमेंट बनाना आसान हो सकता है. हालांकि, इससे एक्सटेंशन और उन वेब पेजों को नुकसान पहुंच सकता है जिन पर एक्सटेंशन निर्भर करता है. ऐसा इसलिए, क्योंकि इन एलिमेंट की मदद से, नुकसान पहुंचाने वाली स्क्रिप्ट डाली जा सकती हैं. इसके बजाय, मैन्युअल तरीके से डीओएम नोड बनाएं और डाइनैमिक कॉन्टेंट डालने के लिए, innerText का इस्तेमाल करें.

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

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

कॉन्टेंट स्क्रिप्ट, अलग-अलग वर्शन में काम करती हैं. हालांकि, इन पर भी हमले हो सकते हैं:

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

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

  • मान लें कि कॉन्टेंट स्क्रिप्ट के मैसेज को हमलावर ने बनाया हो.उदाहरण के लिए, सभी इनपुट की पुष्टि करें और उन्हें सुरक्षित बनाएं. साथ ही, अपनी स्क्रिप्ट को क्रॉस-साइट स्क्रिप्टिंग से सुरक्षित रखें.
  • मान लें कि कॉन्टेंट स्क्रिप्ट में भेजा गया कोई भी डेटा, वेब पेज पर लीक हो सकता है. कॉन्टेंट स्क्रिप्ट में संवेदनशील डेटा (जैसे, एक्सटेंशन से मिली गोपनीय जानकारी, अन्य वेब ऑरिजिन से मिला डेटा, ब्राउज़िंग इतिहास) न भेजें.
  • कॉन्टेंट स्क्रिप्ट से ट्रिगर की जा सकने वाली खास कार्रवाइयों के दायरे को सीमित करें. कॉन्टेंट स्क्रिप्ट को किसी भी यूआरएल के लिए अनुरोध ट्रिगर करने या एक्सटेंशन एपीआई को मनमुताबिक आर्ग्युमेंट पास करने की अनुमति न दें. उदाहरण के लिए, 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.");
});