Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un bersaglio appetibile per gli autori di attacchi. Se un'estensione viene compromessa, ogni utente di quell'estensione diventa vulnerabile a intrusioni dannose e indesiderate. Mantieni un'estensione sicura e proteggi i 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 account sviluppatore specifici e attivando l'autenticazione a due fattori, preferibilmente con un token di sicurezza .
Mantenere i gruppi selettivi
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 e siti web da cui dipendono. Il codice arbitrario deve essere ridotto al minimo.
Limitare i privilegi di un'estensione limita le possibilità di attacco di un potenziale malintenzionato.
XMLHttpRequest multiorigine
Un'estensione può utilizzare XMLHttpRequest solo per recuperare risorse da se stessa e dai domini specificati 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 tutti i contenuti su developer.chrome.com e ai sottodomini di Google elencando "/*"
e "https://*google.com/"
nelle autorizzazioni. Se l'estensione venisse compromessa, avrebbe comunque l'autorizzazione a interagire solo con i siti web che soddisfano il pattern di corrispondenza. L'utente malintenzionato non potrebbe 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 fornisci la registrazione di campi specifici.
Collegabili esternamente
Utilizza il campo externally_connectable
per dichiarare con quali estensioni e pagine web esterne l'estensione scambierà 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 tramite il web
Se rendi le risorse accessibili tramite il web, in web_accessible_resources
, un'estensione sarà rilevabile dai siti web e dagli utenti malintenzionati.
{
...
"web_accessible_resources": [
"images/*.png",
"style/secure_extension.css",
"script/secure_extension.js"
],
...
}
Più risorse accessibili tramite il web sono disponibili, più canali può sfruttare un potenziale utente malintenzionato. Mantieni al minimo questi file.
Includi norme esplicite sulla sicurezza dei contenuti
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, puoi 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
}
Evitare le API eseguibili
Le API che eseguono codice devono essere sostituite con alternative più sicure.
document.write() e innerHTML
Sebbene possa essere più semplice creare elementi HTML dinamicamente con document.write()
e innerHTML
,
l'estensione e le pagine web da cui dipende sono aperte agli attaccanti che inseriscono
script dannosi. Crea manualmente i nodi DOM e utilizza 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 rapidi, 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 gli script di contenuti con cautela
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 potrebbero manipolare parti del DOM da cui dipende lo script dei contenuti o sfruttare comportamenti standard web sorprendenti, come gli elementi denominati.
- 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. Ciò rende gli script dei contenuti vulnerabili alla fuga di dati tramite attacchi lato canale (ad es. Spectre) e al controllo da parte di un malintenzionato se una pagina web dannosa compromette il processo del renderer.
Le operazioni sensibili devono essere eseguite in un processo dedicato, ad esempio lo script in background dell'estensione. 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.
- Supponiamo che tutti i dati inviati allo script dei contenuti potrebbero essere divulgati nella 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 dei 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 convalida gli input
Proteggi un'estensione da script dannosi limitando i listener solo a ciò che è l'estensione i mittenti dei dati in arrivo e la sanificazione di tutti gli input.
Un'estensione deve registrarsi per runtime.onRequestExternal
solo se si aspetta comunicazioni da un sito web o un'estensione esterni. Verifica sempre che il mittente corrisponda a 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 dell'estensione stessa devono essere esaminati per verificare 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 malintenzionato mediante la sanificazione degli input utente e dei dati in entrata, anche provenienti dall'estensione stessa e da fonti approvate. Evita le API eseguibili.
function sanitizeInput(input) {
return input.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}