拡張機能はブラウザ内の特別な権限にアクセスできるため、攻撃者にとって格好のターゲット 無償ツールキットで拡張機能が不正使用された場合、その拡張機能のすべてのユーザーが悪意のある侵入や望ましくない侵入に対して脆弱になります。以下の方法を組み込むことで、拡張機能の安全性を確保し、ユーザーを保護します。
デベロッパー アカウントを保護する
拡張機能のコードは、Google アカウントを介してアップロードおよび更新されます。デベロッパーのアカウントが不正使用された場合、攻撃者は悪意のあるコードをすべてのユーザーに直接プッシュできます。これらのアカウントを保護するには、デベロッパー アカウントを作成して2 要素認証を有効にします(セキュリティ キーを使用することをおすすめします)。
グループを選択したままにする
グループ公開を使用している場合は、グループを信頼できるデベロッパーに制限します。不明な人物からのメンバーシップ リクエストは承認しないでください。
HTTP を使わない
データをリクエストまたは送信する際は、HTTP 接続を使用しないでください。HTTP 接続は、すべての HTTP 盗聴したり改変したりします。HTTPS が組み込まれているため、常に HTTPS を使用することをおすすめします。 ほとんどの中間者攻撃を回避します。
最小限の権限をリクエストする
Chrome ブラウザでは、マニフェストで明示的にリクエストされた権限への拡張機能のアクセスが制限されます。拡張機能では、API と API の登録のみを行い、権限を最小限に抑える ウェブサイト全体。任意のコードを最小限に抑える必要があります。
拡張機能の権限を制限すると、攻撃者が悪用できる範囲が制限されます。
クロスオリジン XMLHttpRequest
拡張機能は、拡張機能自体とドメインからリソースを取得するためにのみ XMLHttpRequest を使用できます。 権限で指定されます。
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": [
"/*",
"https://*.google.com/"
],
"manifest_version": 2
}
この拡張機能は、developer.chrome.com と Google のサブドメインへのアクセスを
権限に "/*"
と "https://*google.com/"
をリストする。もし
アクセスするウェブサイトとやり取りできる権限は、
一致パターン。攻撃者は、"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
}
実行可能 API を使用しない
コードを実行する API は、より安全な代替手段に置き換える必要があります。
document.write() と innerHTML
document.write()
と innerHTML
を使用して HTML 要素を動的に作成する方が簡単な場合もありますが、
拡張機能と依存しているウェブページが攻撃者にさらされる
できます。代わりに、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 の一部を操作したり、名前付きアイテムなどのウェブ標準の予期しない動作を悪用したりする可能性があります。
- ウェブページの DOM を操作するには、コンテンツ スクリプトをウェブページと同じレンダラ プロセスで実行する必要があります。これにより、コンテンツ スクリプトがサイドチャネル攻撃によってデータ漏洩する脆弱性がある (例:Spectre)や、悪意のあるウェブページがレンダラ プロセスを侵害した場合の攻撃者の乗っ取りにつながる可能性があります。
機密性の高い作業は、拡張機能のバックグラウンド スクリプトなどの専用プロセスで行う必要があります。拡張機能の権限をコンテンツ スクリプトに誤って公開しないようにする:
- コンテンツ スクリプトからのメッセージが攻撃者( すべての入力を検証してサニタイズし、スクリプトをクロスサイト スクリプティングから保護します)。
- コンテンツ スクリプトに送信されたデータがウェブページに漏洩する可能性があることを想定してください。センシティブ データを送信しない (拡張機能からのシークレット、他のウェブ生成元のデータ、閲覧履歴など)をコンテンツ 使用できます。
- コンテンツ スクリプトがトリガーできる特権操作の範囲を制限する。コンテンツ スクリプトが任意の URL へのリクエストをトリガーしたり、拡張機能の API に任意の引数を渡したりすることを許可しないでください(例:
fetch
またはchrome.tabs.create
API に任意の URL を渡すことを許可しないでください)。
入力の登録とサニタイズ
対象の拡張機能のみにリスナーを制限することで、悪意のあるスクリプトから拡張機能を保護 受信データの送信者の期待、検証、すべての入力のサニタイズを行います。
拡張機能が外部ウェブサイトまたは拡張機能からの通信を待機している場合にのみ、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.");
});
拡張機能自体や承認済みのソースからでも、ユーザー入力と受信データをサニタイズして、拡張機能が攻撃者のスクリプトを実行しないようにします。実行可能な API を避ける。
function sanitizeInput(input) {
return input.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}