برنامههای افزودنی به امتیازات ویژه در مرورگر دسترسی دارند و آنها را به یک هدف جذاب برای مهاجمان تبدیل میکند. اگر یک برنامه افزودنی در معرض خطر قرار گیرد، هر کاربر آن افزونه در برابر نفوذ مخرب و ناخواسته آسیب پذیر می شود. با استفاده از این اقدامات، یک برنامه افزودنی را ایمن نگه دارید و از کاربران آن محافظت کنید.
از حساب های توسعه دهنده محافظت کنید
کد برنامه افزودنی از طریق حساب های گوگل آپلود و به روز می شود. اگر حسابهای توسعهدهندگان به خطر بیفتد، مهاجم میتواند کدهای مخرب را مستقیماً به همه کاربران ارسال کند. با فعال کردن احراز هویت دو مرحلهای ، ترجیحاً با یک کلید امنیتی ، از این حسابها محافظت کنید.
گروه ها را انتخابی نگه دارید
اگر از انتشار گروهی استفاده می کنید، گروه را محدود به توسعه دهندگان مورد اعتماد نگه دارید. درخواست عضویت افراد ناشناس را نپذیرید.
هرگز از HTTP استفاده نکنید
هنگام درخواست یا ارسال داده، از اتصال HTTP اجتناب کنید. فرض کنید هر اتصال HTTP دارای استراق سمع یا تغییراتی است. HTTPS همیشه باید ترجیح داده شود، زیرا دارای امنیت داخلی است که اکثر حملات مرد میانی را دور میزند.
حداقل مجوزها را درخواست کنید
مرورگر Chrome دسترسی یک برنامه افزودنی را به امتیازاتی که صریحاً در مانیفست درخواست شده اند محدود می کند. برنامههای افزودنی باید مجوزهای خود را فقط با ثبت APIها و وبسایتهایی که به آنها وابسته هستند، به حداقل برسانند.
محدود کردن امتیازات یک برنامه افزودنی، آنچه یک مهاجم بالقوه می تواند از آن سوء استفاده کند را محدود می کند.
واکشی متقاطع ()
یک برنامه افزودنی فقط می تواند 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
}
اگر برنامه افزودنی نیاز به استفاده از اسمبلی وب داشته باشد، یا محدودیتهای صفحات sandbox را افزایش دهد، میتوان آنها را اضافه کرد:
{
"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 اجتناب کنید
اگرچه ممکن است ایجاد پویا عناصر HTML با document.write()
و innerHTML
سادهتر باشد، اما پسوند و صفحات وب که پسوند به آنها وابسته است، برای مهاجمانی که اسکریپتهای مخرب را وارد میکنند باز میماند. در عوض، به صورت دستی گره های DOM ایجاد کنید و از innerText
برای درج محتوای پویا استفاده کنید.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
از اسکریپت های محتوا با دقت استفاده کنید
در حالی که اسکریپت های محتوا در دنیایی منزوی زندگی می کنند، از حملات مصون نیستند:
- اسکریپت های محتوا تنها بخشی از یک برنامه افزودنی است که مستقیماً با صفحه وب در تعامل است. به همین دلیل، صفحات وب متخاصم ممکن است بخشهایی از DOM را که اسکریپت محتوا به آن وابسته است دستکاری کرده یا از رفتار استاندارد وب شگفتانگیز، مانند موارد نامگذاری شده، سوء استفاده کنند.
- برای تعامل با DOM صفحات وب، اسکریپت های محتوا باید در همان فرآیند رندر صفحه وب اجرا شوند. این باعث میشود اسکریپتهای محتوا در برابر نشت دادهها از طریق حملات کانال جانبی (مثلاً Spectre ) آسیبپذیر شوند و اگر یک صفحه وب مخرب فرآیند رندر را به خطر بیندازد، توسط مهاجم تحت کنترل قرار میگیرد.
عملیات با استفاده از دادههای حساس (مانند اطلاعات خصوصی کاربر) یا APIهای Chrome با دسترسی به عملکردهای مرورگر باید در سرویسدهنده برنامههای افزودنی انجام شود. از قرار دادن تصادفی امتیازات برنامه افزودنی در اسکریپت های محتوا اجتناب کنید:
- فرض کنید که پیامهای یک اسکریپت محتوا ممکن است توسط یک مهاجم ساخته شده باشد (مثلاً تمام ورودیها را اعتبارسنجی و پاکسازی کنید و از اسکریپتهای خود در برابر اسکریپتهای بین سایتی محافظت کنید).
- فرض کنید هرگونه داده ارسال شده به اسکریپت محتوا ممکن است به صفحه وب نشت کند. داده های حساس (مثلاً اسرار از برنامه افزودنی، داده های سایر منابع وب، تاریخچه مرور) را به اسکریپت های محتوا ارسال نکنید.
- دامنه اقدامات ممتازی را که میتوانند توسط اسکریپتهای محتوا ایجاد شوند، محدود کنید. اجازه ندهید اسکریپتهای محتوا درخواستهایی را برای URLهای دلخواه راهاندازی کنند یا آرگومانهای دلخواه را به APIهای برنامههای افزودنی ارسال کنند (مثلاً اجازه ندهید URLهای دلخواه به
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.");
});