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

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

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

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

ग्रुप को चुनकर रखें

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

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

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

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

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

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

क्रॉस-ऑरिजिन XMLHttpRequest

कोई एक्सटेंशन सिर्फ़ XMLHttpRequest का इस्तेमाल कर सकता है, ताकि वह खुद से और अनुमतियों में बताए गए डोमेन से रिसॉर्स पा सके.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

यह एक्सटेंशन, अनुमतियों में "/*" और "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://*google.com/"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

वेब पर ऐक्सेस किए जा सकने वाले संसाधन

web_accessible_resources के तहत संसाधनों को वेब से ऐक्सेस करने लायक बनाने से, वेबसाइटें और हमलावर एक एक्सटेंशन का पता लगा पाएंगे.

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

जितने ज़्यादा वेब ऐक्सेस करने लायक संसाधन उपलब्ध होंगे, संभावित हमलावर (हैकर) उतने ही ज़्यादा तरीकों का फ़ायदा ले सकता है. इन फ़ाइलों को कम से कम रखें.

साफ़ तौर पर कॉन्टेंट की सुरक्षा नीति शामिल करना

क्रॉस-साइट स्क्रिप्टिंग हमलों को रोकने के लिए, मेनिफ़ेस्ट में एक्सटेंशन के लिए कॉन्टेंट की सुरक्षा नीति शामिल करें. अगर एक्सटेंशन सिर्फ़ अपने-आप संसाधन लोड करता है, तो यह रजिस्टर करें:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

अगर एक्सटेंशन को किसी होस्ट से स्क्रिप्ट शामिल करने की ज़रूरत हो, तो उन्हें शामिल किया जा सकता है:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

एक्ज़ीक्यूटेबल एपीआई से बचना

कोड चलाने वाले एपीआई को सुरक्षित विकल्पों से बदला जाना चाहिए.

दस्तावेज़.write() और innerHTML

document.write() और innerHTML की मदद से, डाइनैमिक तरीके से एचटीएमएल एलिमेंट बनाना आसान हो सकता है. हालांकि, यह एक्सटेंशन को छोड़ देता है. साथ ही, यह एक्सटेंशन उन वेब पेजों पर भी निर्भर करता है जिन पर एक्सटेंशन निर्भर करता है. हमलावर, नुकसान पहुंचाने वाली स्क्रिप्ट शामिल कर सकते हैं. इसके बजाय, मैन्युअल रूप से DOM नोड बनाएं और डाइनैमिक कॉन्टेंट डालने के लिए, innerText का इस्तेमाल करें.

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

eval()

हमलों को रोकने के लिए जब भी संभव हो eval() का इस्तेमाल न करें, क्योंकि eval() इसमें दिए गए किसी भी कोड को एक्ज़ीक्यूट कर देगा, जो नुकसान पहुंचाने वाला हो सकता है.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

इसके बजाय, ज़्यादा सुरक्षित और तेज़ तरीकों को प्राथमिकता दें, जैसे कि JSON.parse()

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

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

कॉन्टेंट स्क्रिप्ट वाले लोग, अलग-अलग देशों में रहते हैं, लेकिन उन पर हमलों का कोई असर नहीं पड़ता:

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

संवेदनशील काम एक खास प्रोसेस में किया जाना चाहिए. जैसे, एक्सटेंशन की बैकग्राउंड स्क्रिप्ट. कॉन्टेंट स्क्रिप्ट को गलती से एक्सटेंशन के खास अधिकार न दिखाएं:

  • मान लें कि कॉन्टेंट स्क्रिप्ट के मैसेज किसी हमलावर ने बनाए होंगे. उदाहरण के लिए, सभी इनपुट की पुष्टि करके उसे सही करने और अपनी स्क्रिप्ट को क्रॉस-साइट स्क्रिप्टिंग से सुरक्षित रखने के लिए.
  • मान लें कि कॉन्टेंट स्क्रिप्ट को भेजा गया कोई भी डेटा, वेब पेज पर लीक हो सकता है. कॉन्टेंट स्क्रिप्ट में संवेदनशील डेटा (जैसे- एक्सटेंशन के सीक्रेट, दूसरे वेब ऑरिजिन का डेटा, ब्राउज़िंग इतिहास) न भेजें.
  • कॉन्टेंट स्क्रिप्ट से ट्रिगर की जा सकने वाली खास अधिकारों वाली कार्रवाइयों का दायरा सीमित करें. कॉन्टेंट स्क्रिप्ट को, ऑर्गैनिक यूआरएल पर अनुरोध ट्रिगर करने या एक्सटेंशन एपीआई में आर्बिट्रेरी तर्क पास करने की अनुमति न दें. उदाहरण के लिए, fetch या chrome.tabs.create एपीआई में आर्बिट्ररी यूआरएल पास करने की अनुमति न दें.

रजिस्टर करें और इनपुट की सफ़ाई करें

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

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

// 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.");
});

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

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}