Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un target interessante per gli aggressori. Se un'estensione viene compromessa, ogni utente di quell'estensione diventa vulnerabile a intrusioni dannose e indesiderate. Garantisci la sicurezza di un'estensione e dei suoi utenti incorporando queste pratiche.
Proteggere gli account sviluppatore
Il codice dell'estensione viene caricato e aggiornato tramite gli Account Google. Se gli sviluppatori account sono compromessi, un aggressore potrebbe inviare codice dannoso direttamente a tutti gli utenti. Proteggi questi account creando appositamente account sviluppatore e attivando l'autenticazione a due fattori , preferibilmente con un token di sicurezza .
Mantieni selettivi i gruppi
Se utilizzi la pubblicazione di gruppo, mantieni il gruppo limitato agli sviluppatori attendibili. Non accettare richieste di adesione da persone sconosciute.
Non usare mai HTTP
Evita una connessione HTTP quando richiedi o invii dati. Supponiamo che le connessioni HTTP presentano intercettazioni o contengono modifiche. È sempre preferibile utilizzare HTTPS in quanto sono integrati sicurezza che aggira la maggior parte degli attacchi man in the middle.
Richiedi autorizzazioni minime
Il browser Chrome limita l'accesso di un'estensione ai privilegi richiesti esplicitamente in il manifest. Le estensioni dovrebbero ridurre al minimo le autorizzazioni registrando solo API siti web da cui dipendono. Il codice arbitrario deve essere ridotto al minimo.
La limitazione dei privilegi di un’estensione limita ciò che un potenziale malintenzionato può sfruttare.
XMLHttpRequest multiorigine
Un'estensione può utilizzare solo XMLHttpRequest per ottenere risorse da se stessa e dai domini specificato nelle autorizzazioni.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": [
"/*",
"https://*.google.com/"
],
"manifest_version": 2
}
Questa estensione richiede l'accesso a qualsiasi contenuto su developer.chrome.com e sottodomini di Google tramite
elenca "/*"
e "https://*google.com/"
nelle autorizzazioni. Se
se un'estensione è stata compromessa, avrebbe comunque l'autorizzazione per interagire soltanto con i siti web
lo schema di corrispondenza. L'utente malintenzionato non riuscirebbe ad accedere a "https://user_bank_info.com"
o
interagire con "https://malicious_website.com"
.
Limita i campi del manifest
L'inclusione di registrazioni non necessarie nel file manifest crea vulnerabilità e crea un'estensione più visibile. Limita i campi manifest a quelli su cui si basa l'estensione e assegna un campo specifico registrazione.
Collegabili esternamente
Utilizza il campo externally_connectable
per dichiarare quali estensioni e pagine web esterne
scambia informazioni. Limita gli utenti a cui l'estensione può connettersi esternamente
da fonti attendibili.
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"/*",
"https://*google.com/"
],
"accepts_tls_channel_id": false
},
...
}
Risorse accessibili dal web
Rendendo le risorse accessibili sul web, in web_accessible_resources
sarà possibile
un'estensione rilevabile da siti web e utenti malintenzionati.
{
...
"web_accessible_resources": [
"images/*.png",
"style/secure_extension.css",
"script/secure_extension.js"
],
...
}
Maggiore è il numero di risorse web disponibili, maggiori sono le opportunità di sfruttamento da parte di un potenziale aggressore. Conserva almeno questi file.
Includere un criterio di sicurezza dei contenuti espliciti
Includi un criterio di sicurezza del contenuto per l'estensione nel file manifest in modo da evitare di attacchi di scripting. Se l'estensione carica risorse solo da sola, registra quanto segue:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": "default-src 'self'"
"manifest_version": 2
}
Se l'estensione deve includere script di host specifici, è possibile includerli:
{
"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
}
Evita le API eseguibili
Le API che eseguono il codice dovrebbero essere sostituite con alternative più sicure.
document.write() e innerHTML
Anche se può essere più semplice creare in modo dinamico elementi HTML con document.write()
e innerHTML
,
lascia l'estensione e le pagine web da cui dipende l'estensione, aperte agli autori di attacchi
script dannosi. Puoi invece creare manualmente i nodi DOM e utilizzare innerText
per inserire contenuti dinamici.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
eval()
Evita di utilizzare eval()
quando possibile per prevenire gli attacchi, poiché eval()
eseguirà qualsiasi codice passato
che potrebbe essere dannoso.
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();
Preferisci invece metodi più sicuri e veloci come 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();
Utilizza con attenzione i script di contenuti
Anche se gli script di contenuti risiedono in un mondo isolato, non sono immuni dagli attacchi:
- Gli script di contenuti sono l'unica parte di un'estensione che interagisce direttamente con la pagina web. Per questo motivo, le pagine web ostili possono manipolare parti del DOM da cui dipende lo script dei contenuti, o sfruttare un comportamento standard del web sorprendente, come gli elementi con nome.
- Per interagire con il DOM delle pagine web, gli script dei contenuti devono essere eseguiti nello stesso processo del renderer delle pagine la pagina web. Di conseguenza gli script di contenuti sono vulnerabili alla fuga di dati da attacchi a canale laterale (ad es. Spectre) e alla violazione da parte di un utente malintenzionato nel caso in cui una pagina web dannosa venga compromessa. il processo del renderer.
Le attività sensibili devono essere eseguite in un processo dedicato, ad esempio sui background dell'estensione. script. Evita di esporre accidentalmente i privilegi delle estensioni agli script di contenuti:
- Supponi che i messaggi provenienti da uno script di contenuti possano essere stati creati da un utente malintenzionato (ad es. convalida e sanitizza tutti gli input e proteggi i tuoi script dal cross-site scripting.
- Supponi che i dati inviati allo script di contenuti possano essere divulgati alla pagina web. Non inviare dati sensibili (ad es. segreti dell'estensione, dati provenienti da altre origini web, cronologia di navigazione) ai contenuti script.
- Limita l'ambito delle azioni privilegiate che possono essere attivate dagli script di contenuti. Non consentire
script di contenuti per attivare richieste a URL arbitrari o passare argomenti arbitrari a
API delle estensioni (ad es. non consentire il trasferimento di URL arbitrari a
fetch
o l'APIchrome.tabs.create
).
Registra e sanitizza gli input
Proteggi un'estensione da script dannosi limitando i listener solo a ciò che è l'estensione prevedendo, convalidando i mittenti dei dati in arrivo e sanificando tutti gli input.
Un'estensione deve essere registrata per runtime.onRequestExternal
solo se è in attesa
comunicazioni da un sito web o un'estensione esterni. Verifica sempre che il mittente corrisponda a un
una fonte attendibile.
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
Anche i messaggi tramite l'evento runtime.onMessage provenienti dall'estensione stessa devono essere esaminati per Assicurati che MessageSender non provenga da uno script di contenuti compromesso.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});
Impedisci a un’estensione di eseguire lo script di un aggressore sanificando gli input utente e anche dall'estensione stessa e da origini approvate. Evita le API eseguibili.
function sanitizeInput(input) {
return input.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}