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

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

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

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

निष्पादित किए जा सकने वाले एपीआई का इस्तेमाल न करना

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

document.write() और innerHTML

हालांकि, document.write() और innerHTML की मदद से, एचटीएमएल एलिमेंट को डाइनैमिक तरीके से बनाना आसान हो सकता है. हालांकि, इससे एक्सटेंशन और एक्सटेंशन पर निर्भर वेब पेजों को, नुकसान पहुंचाने वाली स्क्रिप्ट डालने वाले हमलावरों के लिए खुला छोड़ दिया जाता है. इसके बजाय, डीओएम नोड को मैन्युअल तरीके से बनाएं और डाइनैमिक कॉन्टेंट डालने के लिए, 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();

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

हालांकि, कॉन्टेंट स्क्रिप्ट एक अलग दुनिया में रहती हैं, लेकिन ये हमलों से सुरक्षित नहीं हैं:

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

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

इनपुट रजिस्टर करना और सैनिटाइज़ करना

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

किसी एक्सटेंशन को 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;');
}