Sommario di gestione
Polkadot ha contattato Sayfer Security per eseguire un controllo di sicurezza sull'applicazione Metamask Snap di Polkadot nell'agosto 2023.
Prima di valutare i servizi di cui sopra, abbiamo tenuto un incontro iniziale con il team tecnico e abbiamo ricevuto una panoramica del sistema e degli obiettivi di questa ricerca.
Nel corso di un periodo di ricerca di 2 settimane, abbiamo scoperto 5 vulnerabilità nel codice base dello snap.
In conclusione, a seguito del rapporto dovrebbero essere implementate diverse soluzioni, ma il livello di sicurezza del sistema è adeguato.
Metodologia del rischio
Noi di Sayfer ci impegniamo a fornire ai nostri clienti test di penetrazione della massima qualità. Ecco perché abbiamo implementato un modello completo di valutazione del rischio per valutare la gravità dei nostri risultati e fornire ai nostri clienti le migliori raccomandazioni possibili per la mitigazione.
Il nostro modello di valutazione del rischio si basa su due fattori chiave: IMPATTO ed PROBABILITÀ. L'impatto si riferisce al danno potenziale che potrebbe derivare da un problema, come una perdita finanziaria, un danno alla reputazione o un sistema non operativo. La probabilità si riferisce alla probabilità che si verifichi un problema, tenendo conto di fattori quali la complessità dell'attacco e il numero di potenziali aggressori.
Combinando questi due fattori, possiamo creare una comprensione completa del rischio posto da un particolare problema e fornire ai nostri clienti una valutazione chiara e attuabile della gravità del problema. Questo approccio ci consente di dare priorità alle nostre raccomandazioni e garantire che i nostri clienti ricevano la migliore consulenza possibile su come proteggere la loro attività.
Il rischio è definito come segue:
Vulnerabilità per rischio
Alta – Minaccia diretta ai processi aziendali chiave.
Medio – Minaccia indiretta ai processi aziendali chiave o minaccia parziale ai processi aziendali.
Basso – Non esiste alcuna minaccia diretta. La vulnerabilità può essere sfruttata utilizzando altre vulnerabilità.
Informativo – Questo risultato non indica vulnerabilità, ma riporta un commento che segnala difetti di progettazione e implementazione impropria che potrebbero causare problemi a lungo termine.
Approccio
Metodologia di valutazione della sicurezza
Sayfer utilizza OWASP WSTG come nostro standard tecnico durante la revisione delle applicazioni web. Dopo aver acquisito una conoscenza approfondita del sistema, abbiamo deciso quali test OWASP sono necessari per valutare il sistema.
Valutazione della sicurezza
Dopo aver compreso e definito l'ambito, eseguito la modellazione delle minacce e valutato i test corretti richiesti per verificare completamente l'eventuale presenza di difetti di sicurezza nell'applicazione, abbiamo eseguito la nostra valutazione della sicurezza.
Descrizione della tabella dei problemi
Titolo del problema
ID | DIRE-??: un ID per facilitare la comunicazione su ciascuna vulnerabilità |
Stato dei servizi | Aperto/Fisso/Confermato |
Rischio | Rappresenta il fattore di rischio del problema. Per una descrizione più approfondita fare riferimento al Vulnerabilità per rischio . |
Impatto sul business | Il principale rischio di vulnerabilità a livello aziendale. |
Dove | L'URL o il file in cui è stato rilevato questo problema. I numeri senza ubicazione non hanno una ubicazione particolare e si riferiscono al prodotto nel suo complesso. |
Descrizione
Qui forniamo una breve descrizione del problema e di come si è formato, i passaggi che abbiamo effettuato per individuarlo o sfruttarlo, insieme alla prova di concetto (se presente) e in che modo questo problema può influire sul prodotto o sui suoi utenti.
Mitigazione
Opzioni di risoluzione suggerite per questo problema e collegamenti a siti consigliati per ulteriori soluzioni.
Valutazione della sicurezza
I seguenti test sono stati condotti durante l'audit del sistema
Raccolta di informazioni
Raccolta di informazioni | Nome del test |
WSTG-INFO-01 | Condurre la ricognizione della scoperta dei motori di ricerca per la fuga di informazioni |
WSTG-INFO-02 | Server web di impronte digitali |
WSTG-INFO-03 | Esamina i metafile del server Web per perdite di informazioni |
WSTG-INFO-04 | Enumerare le applicazioni sul server Web |
WSTG-INFO-05 | Esaminare il contenuto della pagina Web per perdite di informazioni |
WSTG-INFO-06 | Identificare i punti di ingresso dell'applicazione |
WSTG-INFO-07 | Mappa i percorsi di esecuzione attraverso l'applicazione |
WSTG-INFO-08 | Framework di applicazioni Web per impronte digitali |
WSTG-INFO-09 | Applicazione Web per impronte digitali |
WSTG-INFO-10 | Mappa dell'architettura dell'applicazione |
Test di gestione della configurazione e della distribuzione
Test di gestione della configurazione e della distribuzione | Nome del test |
WSTG-CONF-01 | Testare la configurazione dell'infrastruttura di rete |
WSTG-CONF-02 | Testare la configurazione della piattaforma dell'applicazione |
WSTG-CONF-03 | Testare la gestione delle estensioni dei file per le informazioni riservate |
WSTG-CONF-04 | Esamina il vecchio backup e i file senza riferimenti per informazioni riservate |
WSTG-CONF-05 | Enumerare le interfacce di amministrazione dell'infrastruttura e dell'applicazione |
WSTG-CONF-06 | Prova i metodi HTTP |
WSTG-CONF-07 | Testare la sicurezza del trasporto HTTP Strict |
WSTG-CONF-08 | Testare la politica interdominio RIA |
WSTG-CONF-09 | Testare l'autorizzazione del file |
WSTG-CONF-10 | Test per Subdomain Takeover |
WSTG-CONF-11 | Prova l'archiviazione cloud |
Test di gestione dell'identità
Test di gestione dell'identità | Nome del test |
WSTG-IDNT-01 | Testare le definizioni dei ruoli |
WSTG-IDNT-02 | Processo di registrazione dell'utente di prova |
WSTG-IDNT-03 | Processo di provisioning dell'account di prova |
WSTG-IDNT-04 | Test per l'enumerazione degli account e l'account utente indovinabile |
WSTG-IDNT-05 | Test per la politica del nome utente debole o non applicata |
Test di autenticazione
Test di autenticazione | Nome del test |
WSTG-ATHN-01 | Test per le credenziali trasportate su un canale crittografato |
WSTG-ATHN-02 | Test per le credenziali predefinite |
WSTG-ATHN-03 | Test per il meccanismo di blocco debole |
WSTG-ATHN-04 | Test per bypassare lo schema di autenticazione |
WSTG-ATHN-05 | Test per la password ricordata vulnerabile |
WSTG-ATHN-06 | Test per le debolezze della cache del browser |
WSTG-ATHN-07 | Test per criteri password deboli |
WSTG-ATHN-08 | Test per risposta alla domanda di sicurezza debole |
WSTG-ATHN-09 | Test per funzionalità di modifica o ripristino password deboli |
WSTG-ATHN-10 | Test per un'autenticazione più debole in un canale alternativo |
Test di autorizzazione
Test di autorizzazione | Nome del test |
WSTG-ATHZ-01 | Includi file di attraversamento directory di prova |
WSTG-ATHZ-02 | Test per bypassare lo schema di autorizzazione |
WSTG-ATHZ-03 | Test per l'escalation dei privilegi |
WSTG-ATHZ-04 | Test per riferimenti a oggetti diretti non sicuri |
Test di gestione della sessione
Test di gestione della sessione | Nome del test |
WSTG-SESS-01 | Test per lo schema di gestione delle sessioni |
WSTG-SESS-02 | Test per gli attributi dei cookie |
WSTG-SESS-03 | Test per la fissazione della sessione |
WSTG-SESS-04 | Test per le variabili di sessione esposte |
WSTG-SESS-05 | Test per contraffazione di richieste cross-site |
WSTG-SESS-06 | Test per la funzionalità di logout |
WSTG-SESS-07 | Timeout della sessione di test |
WSTG-SESS-08 | Test per il puzzle della sessione |
WSTG-SESS-09 | Test per il dirottamento della sessione |
Test di convalida dei dati
Test di convalida dei dati | Nome del test |
WSTG-INPV-01 | Test per Reflected Cross Site Scripting |
WSTG-INPV-02 | Test per Stored Cross Site Scripting |
WSTG-INPV-03 | Test per la manomissione dei verbi HTTP |
WSTG-INPV-04 | Test per l'inquinamento dei parametri HTTP |
WSTG-INPV-05 | Test per SQL Injection |
WSTG-INPV-06 | Test per l'iniezione di LDAP |
WSTG-INPV-07 | Test per l'iniezione XML |
WSTG-INPV-08 | Test per l'iniezione SSI |
WSTG-INPV-09 | Test per l'iniezione di XPath |
WSTG-INPV-10 | Test per IMAP SMTP Injection |
WSTG-INPV-11 | Test per l'iniezione di codice |
WSTG-INPV-12 | Test per l'iniezione di comandi |
WSTG-INPV-13 | Test per l'inserimento di stringhe di formato |
WSTG-INPV-14 | Test per la vulnerabilità incubata |
WSTG-INPV-15 | Test per il contrabbando di splitting HTTP |
WSTG-INPV-16 | Test per richieste HTTP in entrata |
WSTG-INPV-17 | Test per l'iniezione di intestazione host |
WSTG-INPV-18 | Test per l'iniezione di modelli lato server |
WSTG-INPV-19 | Test per contraffazione di richieste lato server |
Gestione degli errori
Gestione degli errori | Nome del test |
WSTG-ERRH-01 | Test per la gestione impropria degli errori |
WSTG-ERRH-02 | Test per le tracce dello stack |
Crittografia
Crittografia | Nome del test |
WSTG-CRYP-01 | Test per la sicurezza del livello di trasporto debole |
WSTG-CRYP-02 | Test per Padding Oracle |
WSTG-CRYP-03 | Test per informazioni sensibili inviate tramite canali non crittografati |
WSTG-CRYP-04 | Test per la crittografia debole |
Test di logica aziendale
Test di logica aziendale | Nome del test |
WSTG-BUSL-01 | Testare la convalida dei dati della logica aziendale |
WSTG-BUSL-02 | Prova la capacità di falsificare le richieste |
WSTG-BUSL-03 | Controlli di integrità del test |
WSTG-BUSL-04 | Test per i tempi di processo |
WSTG-BUSL-05 | Test Numero di volte che una funzione può essere utilizzata Limiti |
WSTG-BUSL-06 | Test per l'elusione dei flussi di lavoro |
WSTG-BUSL-07 | Testare le difese contro l'uso improprio delle applicazioni |
WSTG-BUSL-08 | Caricamento di prova di tipi di file imprevisti |
WSTG-BUSL-09 | Caricamento di prova di file dannosi |
Test lato client
Test lato client | Nome del test |
WSTG-CLNT-01 | Test per Cross Site Scripting basato su DOM |
WSTG-CLNT-02 | Test per l'esecuzione di JavaScript |
WSTG-CLNT-03 | Test per l'iniezione di HTML |
WSTG-CLNT-04 | Test per il reindirizzamento URL lato client |
WSTG-CLNT-05 | Test per l'iniezione di CSS |
WSTG-CLNT-06 | Test per la manipolazione delle risorse lato client |
WSTG-CLNT-07 | Testare la condivisione delle risorse tra le origini |
WSTG-CLNT-08 | Test per il lampeggiamento tra siti |
WSTG-CLNT-09 | Test per il clickjacking |
WSTG-CLNT-10 | Testare i WebSocket |
WSTG-CLNT-11 | Prova la messaggistica Web |
WSTG-CLNT-12 | Testare l'archiviazione del browser |
WSTG-CLNT-13 | Test per l'inclusione di script tra siti |
Test API
Test API | Nome del test |
WSTG-APIT-01 | Testare GraphQL |
Controllo dell'ordine da Sayfer
Risultati della valutazione della sicurezza
Gli URL RPC sono definiti come wsRpcUrl durante l'utilizzo di HTTP
ID | DIRE-01 |
Stato dei servizi | Apri |
Rischio | Medio |
Impatto sul business | È difficile determinare l'impatto senza una demo funzionante. Se la modifica è errata, potrebbe interrompere lo snap, altrimenti si tratta di un semplice problema di documentazione/denominazione delle variabili. |
Dove | packages/snap/src/configuration/prefined.ts:11,22,33 |
Descrizione
Gli URL RPC dei singoli protocolli sono stati modificati nell'ultima versione dello snap. Viene utilizzato HTTP (http://) invece di WebSocket (wss://).
Questo è inaspettato, perché il documentazione ufficiale di Polkadot indica solo gli indirizzi websocket nelle loro risorse. Inoltre, in molti punti del codice, i nomi delle variabili contengono ancora il prefisso ws, come wsRpcurl.
predefinito.ts:
wsRpcUrl: 'https: /
wsRpcUrl: 'https: /kusama-rpc.polkadot.io/'
{...}
wsRpcUrl: 'https: /westend-rpc.polkadot.io/'
{...}
wsRpcUrl: 'https: /rpc.polkadot.io/'
Mitigazione
Assicurarsi che venga utilizzato il protocollo HTTP. In tal caso, modificare la documentazione ufficiale per riflettere ciò e modificare i nomi delle variabili pertinenti.
Conformazioni per le funzionalità principali non vengono gestite se rifiutate
ID | DIRE-02 |
Stato dei servizi | Apri |
Rischio | Medio |
Impatto sul business | Se l'utente rifiuta la transazione, non verrà restituito nulla, il che si concluderà con un errore JavaScript, di tipo generico indefinito messaggio o niente del tutto. Ciò potrebbe causare un comportamento indefinito o imprevisto. |
Dove | – packages/snap/src/rpc/exportSeed.ts:14 – packages/snap/src/rpc/substrate/sign.ts:33,53 |
Descrizione
Per le funzionalità chiave di Snap (come la visualizzazione della chiave privata o la firma di un messaggio), vengono visualizzate finestre di dialogo in cui l'utente può confermare se è a conoscenza di ciò che sta accettando. Se l'utente conferma la transazione, questa viene eseguita. Il contrario, quando l'utente rifiuta la transazione, non viene gestito affatto.
exportSeed(SnapsGlobalObject), nota come non esiste nessun altro blocco
if (confirmation) {
const bip44Node = (await snap.request({
method: "snap_getBip44Entropy",
params: { coinType: kusamaCoinType },
})) as JsonBIP44CoinTypeNode;
signPayloadJSON(SnapsGlobalObject, ApiPromise, SignerPayloadJSON)
if (confirmation) {
const extrinsic = api.registry.createType('ExtrinsicPayload', payload, { version: payload.version });
return extrinsic.sign(keyPair);
}
signPayloadRaw(SnapsGlobalObject, ApiPromise, SignerPayloadRaw)
if (confirmation) {
const signedBytes = keyPair.sign(hexToU8a(payload.data));
return {
signature: u8aToHex(signedBytes)
};
Purtroppo, poiché i test automatizzati non hanno funzionato, non abbiamo potuto verificare e confermare definitivamente questo scenario.
Mitigazione
Gestisci il file altro caso in cui l'utente rifiuta la transazione, nel qual caso dovrebbe essere visualizzato un errore appropriato.
Nessuna finestra di dialogo di conferma durante l'invio
ID | DIRE-03 |
Stato dei servizi | Apri |
Rischio | Basso |
Impatto sul business | Senza una finestra di dialogo di conferma, c'è il rischio che un potenziale utente esegua erroneamente una transazione inviando fondi al conto sbagliato. |
Dove | – pacchetti/snap/src/rpc/send.ts:7-34 |
Descrizione
Quando si firmano messaggi o si visualizza la chiave privata, lo snap visualizza una finestra di dialogo che chiede all'utente se è sicuro di voler procedere. Tuttavia, durante l'invio non viene visualizzata alcuna finestra di dialogo di conferma.
Mitigazione
Implementare una finestra di dialogo che chiede all'utente di confermare la transazione.
abilitaPolkadotSnap Restituisce un errore quando si utilizza l'impostazione predefinita nome della rete
ID | DIRE-04 |
Stato dei servizi | Apri |
Rischio | Basso |
Impatto sul business | Non conformità con i presupposti aziendali secondo cui Westend è la rete predefinita. |
Dove | – packages/adapter/src/index.ts:27-29 |
Descrizione
È stato notato che, nonostante abbia selezionato Westend come rete predefinita in snap/src/configuration/prefined.ts, se l'adattatore esegue la sua unica funzione esposta, EnablePolkadotSnap(), senza specificare config.networkName, verrà restituito un errore.
Ciò non è coerente con i presupposti di Snap, descritti tra gli altri nel README.md dell'adattatore, che indica che la specifica di una configurazione sovrascriverà quella predefinita.
pacchetti/snap/src/configuration/prefined.ts; righe 13-22, 35
export const westendConfiguration: SnapConfig = {
addressPrefix: 42,
networkName: "westend",
unit: {
decimals: 12,
image: "https: /svgshare.com/i/L2d.svg",
symbol: "WND",
},
wsRpcUrl: "wss: /westend-rpc.polkadot.io/",
};
[ .]
export const defaultConfiguration: SnapConfig = westendConfiguration;
pacchetti/snap/src/configuration/prefined.ts; righe 27-29
if (!config.networkName) {
throw new Error("Configuration must at least define network type");
}
Mitigazione
A giudicare dalla documentazione e dal codice in predefinito.ts, questo errore non deve essere restituito e deve essere utilizzato Westend. Al contrario, Westend non dovrebbe essere impostato come predefinito e la documentazione dovrebbe essere modificata per rifletterlo.
Demo non funzionante
ID | DIRE-05 |
Stato dei servizi | Apri |
Rischio | Informativo |
Impatto sul business | Avere una demo funzionante può aiutare gli utenti a testare la funzionalità di Snap e aiutare gli auditor a migliorare notevolmente i propri test. |
Dove | - |
Descrizione
Secondo la documentazione, il comando yarn install & yarn run demo should run a working demo
di Snap, permettendoti di installarlo e di utilizzare le varie funzionalità. Sfortunatamente, durante l'installazione, la console del browser ha restituito un errore. Pertanto, la verifica di Snap come “organismo vivente” era impossibile}
Mitigazione
Suggeriamo di portare Snap in uno stato utilizzabile e quindi di condurre test approfonditi su transazioni reali con la rete Polkadot.