Ledningssammanfattning
Qtum kontaktade Sayfer Security för att utföra penetrationstestning på Qtums MetaMask Snap 05/2024.
Innan vi bedömde ovanstående tjänster höll vi ett kickoffmöte med Qtums tekniska team och fick en översikt över systemet och målen för denna forskning.
Under forskningsperioden på 2 veckor upptäckte vi 5 sårbarheter i systemet, ingen av dem kritisk.
Sammanfattningsvis bör flera korrigeringar implementeras efter rapporten, men systemets säkerhetsställning är kompetent.
Efter en granskning av Sayfer-teamet intygar vi att alla säkerhetsproblem som nämns i denna rapport har åtgärdats av Qtum-teamet.
Riskmetodik
På Sayfer har vi åtagit oss att leverera penetrationstestning av högsta kvalitet till våra kunder. Det är därför vi har implementerat en omfattande riskbedömningsmodell för att utvärdera hur allvarliga våra fynd är och ge våra kunder bästa möjliga rekommendationer för begränsning.
Vår riskbedömningsmodell bygger på två nyckelfaktorer: IMPACT och SANNOLIKHET. Påverkan hänvisar till den potentiella skada som kan bli följden av ett problem, såsom ekonomisk förlust, skada på rykte eller ett icke-operativt system. Sannolikhet avser sannolikheten att ett problem kommer att inträffa, med hänsyn till faktorer som attackens komplexitet och antalet potentiella angripare.
Genom att kombinera dessa två faktorer kan vi skapa en heltäckande förståelse för risken för en viss fråga och ge våra kunder en tydlig och handlingsbar bedömning av problemets allvar. Detta tillvägagångssätt gör att vi kan prioritera våra rekommendationer och säkerställa att våra kunder får bästa möjliga råd om hur de kan skydda sin verksamhet.
Risk definieras enligt följande:

Sårbarheter efter risk
Hög – Direkt hot mot viktiga affärsprocesser.
Medium – Indirekt hot mot viktiga affärsprocesser eller partiellt hot mot affärsprocesser.
Låg – Det finns inget direkt hot. Sårbarheten kan utnyttjas med andra sårbarheter.
Upplysande – Detta fynd indikerar inte sårbarhet, men anger en kommentar som meddelar om designfel och felaktig implementering som kan orsaka problem i det långa loppet.
Tillvägagångssätt
Säkerhetsutvärderingsmetodik
Sayfer använder OWASP WSTG som vår tekniska standard vid granskning av webbapplikationer. Efter att ha fått en grundlig förståelse av systemet bestämde vi oss för vilka OWASP-tester som krävs för att utvärdera systemet.
Säkerhetsbedömning
Efter att ha förstått och definierat omfattningen, utfört hotmodellering och utvärderat de korrekta testerna som krävs för att fullständigt kontrollera applikationen för säkerhetsbrister, utförde vi vår säkerhetsbedömning.
Problemtabell Beskrivning
Nummertitel
| ID | SÄGA-??: Ett ID för enkel kommunikation om varje sårbarhet |
| Status | Öppen/Fastad/Bekräftad |
| Risk | Representerar riskfaktorn för problemet. För ytterligare beskrivning se Sårbarheter efter risk sektion. |
| Business Impact | Den största risken för sårbarheten på affärsnivå. |
| Plats | URL:en eller filen där problemet upptäcktes. Problem utan plats har ingen speciell plats och hänvisar till produkten som helhet. |
BESKRIVNING
Här ger vi en kort beskrivning av problemet och hur det uppstod, stegen vi gjorde för att hitta eller utnyttja det, tillsammans med proof of concept (om det finns) och hur detta problem kan påverka produkten eller dess användare.
Mitigation
Föreslagna lösningsalternativ för det här problemet och länkar till rekommenderade webbplatser för ytterligare åtgärdande.
Säkerhetsutvärdering
Följande tester utfördes under revision av systemet
Informationsmöte
| Informationsmöte | Testnamn |
| WSTG-INFO-01 | Genomför sökmotorupptäcktsspaning för informationsläckage |
| WSTG-INFO-02 | Fingeravtryck webbserver |
| WSTG-INFO-03 | Granska webbservermetafiler för informationsläckage |
| WSTG-INFO-04 | Räkna upp applikationer på webbservern |
| WSTG-INFO-05 | Granska webbsidans innehåll för informationsläckage |
| WSTG-INFO-06 | Identifiera applikationsingångspunkter |
| WSTG-INFO-07 | Kartlägg exekveringsvägar genom applikation |
| WSTG-INFO-08 | Fingerprint Web Application Framework |
| WSTG-INFO-09 | Webbapplikation med fingeravtryck |
| WSTG-INFO-10 | Kartapplikationsarkitektur |
Konfigurations- och distributionshanteringstestning
| Konfigurations- och distributionshanteringstestning | Testnamn |
| WSTG-CONF-01 | Testa nätverksinfrastrukturens konfiguration |
| WSTG-CONF-02 | Testa applikationsplattformens konfiguration |
| WSTG-CONF-03 | Testa filtilläggshantering för känslig information |
| WSTG-CONF-04 | Granska gamla säkerhetskopior och filer utan referens för känslig information |
| WSTG-CONF-05 | Räkna upp gränssnitt för infrastruktur och applikationsadministration |
| WSTG-CONF-06 | Testa HTTP-metoder |
| WSTG-CONF-07 | Testa HTTP Strict Transport Security |
| WSTG-CONF-08 | Testa RIA-policy över flera domäner |
| WSTG-CONF-09 | Testa filbehörighet |
| WSTG-CONF-10 | Testa för övertagande av underdomän |
| WSTG-CONF-11 | Testa molnlagring |
Identitetshanteringstestning
| Identitetshanteringstestning | Testnamn |
| WSTG-IDNT-01 | Testrollsdefinitioner |
| WSTG-IDNT-02 | Testa användarregistreringsprocessen |
| WSTG-IDNT-03 | Testa kontotilldelningsprocessen |
| WSTG-IDNT-04 | Testa för kontouppräkning och gissningsbart användarkonto |
| WSTG-IDNT-05 | Testar för svag eller otillämpad användarnamnspolicy |
Autentiseringstest
| Autentiseringstest | Testnamn |
| WSTG-ATHN-01 | Testa för inloggningsuppgifter som transporteras över en krypterad kanal |
| WSTG-ATHN-02 | Testar för standardinloggningsuppgifter |
| WSTG-ATHN-03 | Testar för svag låsningsmekanism |
| WSTG-ATHN-04 | Testar för att kringgå autentiseringsschema |
| WSTG-ATHN-05 | Testa för sårbara Kom ihåg lösenord |
| WSTG-ATHN-06 | Testar för svagheter i webbläsarens cache |
| WSTG-ATHN-07 | Testar för svag lösenordspolicy |
| WSTG-ATHN-08 | Testa för svag säkerhetsfråga Svar |
| WSTG-ATHN-09 | Testar för svaga lösenordsändringar eller återställningsfunktioner |
| WSTG-ATHN-10 | Testar för svagare autentisering i alternativ kanal |
Tillståndstest
| Tillståndstest | Testnamn |
| WSTG-ATHZ-01 | Testa kataloggenomgångsfil inkluderar |
| WSTG-ATHZ-02 | Testa för att förbigå auktoriseringsschema |
| WSTG-ATHZ-03 | Testar för privilegieupptrappning |
| WSTG-ATHZ-04 | Testa för osäkra direkta objektreferenser |
Test av sessionhantering
| Test av sessionhantering | Testnamn |
| WSTG-SESS-01 | Testning för Session Management Schema |
| WSTG-SESS-02 | Testa för cookiesattribut |
| WSTG-SESS-03 | Testning för sessionsfixering |
| WSTG-SESS-04 | Testa för exponerade sessionsvariabler |
| WSTG-SESS-05 | Testar för förfalskning av förfrågningar mellan webbplatser |
| WSTG-SESS-06 | Testar för utloggningsfunktioner |
| WSTG-SESS-07 | Timeout för testsession |
| WSTG-SESS-08 | Testa för sessionspussel |
| WSTG-SESS-09 | Testar för sessionskapning |
Datavalideringstest
| Datavalideringstest | Testnamn |
| WSTG-INPV-01 | Testa för Reflekterad Cross Site Scripting |
| WSTG-INPV-02 | Testning för lagrad cross Site Scripting |
| WSTG-INPV-03 | Testar för manipulering av HTTP-verb |
| WSTG-INPV-04 | Testar för HTTP-parameterförorening |
| WSTG-INPV-05 | Testa för SQL Injection |
| WSTG-INPV-06 | Testning för LDAP-injektion |
| WSTG-INPV-07 | Testa för XML-injektion |
| WSTG-INPV-08 | Testning för SSI Injection |
| WSTG-INPV-09 | Testar för XPath-injektion |
| WSTG-INPV-10 | Testar för IMAP SMTP-injektion |
| WSTG-INPV-11 | Testning för kodinsprutning |
| WSTG-INPV-12 | Testning för kommandoinjektion |
| WSTG-INPV-13 | Testa för formatsträngsinjektion |
| WSTG-INPV-14 | Testa för inkuberad sårbarhet |
| WSTG-INPV-15 | Testar för HTTP-delningssmuggling |
| WSTG-INPV-16 | Testar för inkommande HTTP-förfrågningar |
| WSTG-INPV-17 | Testning av Host Header Injection |
| WSTG-INPV-18 | Testar för mallinjektion på serversidan |
| WSTG-INPV-19 | Testar för förfalskning av förfrågningar på serversidan |
Felhantering
| Felhantering | Testnamn |
| WSTG-ERRH-01 | Testar för felaktig felhantering |
| WSTG-ERRH-02 | Testar för stackspår |
Kryptografi
| Kryptografi | Testnamn |
| WSTG-CRYP-01 | Testning för svag transportlagersäkerhet |
| WSTG-CRYP-02 | Testar för Padding Oracle |
| WSTG-CRYP-03 | Testa för känslig information som skickas via okrypterade kanaler |
| WSTG-CRYP-04 | Testar för svag kryptering |
Affärslogiktestning
| Affärslogiktestning | Testnamn |
| WSTG-BUSL-01 | Testa affärslogikdatavalidering |
| WSTG-BUSL-02 | Testa förmåga att förfalska förfrågningar |
| WSTG-BUSL-03 | Testa integritetskontroller |
| WSTG-BUSL-04 | Testa för processtiming |
| WSTG-BUSL-05 | Testa Antal gånger en funktion kan användas Gränser |
| WSTG-BUSL-06 | Test för att kringgå arbetsflöden |
| WSTG-BUSL-07 | Testa skydd mot felaktig användning av applikationer |
| WSTG-BUSL-08 | Testuppladdning av oväntade filtyper |
| WSTG-BUSL-09 | Testuppladdning av skadliga filer |
Testning på klientsidan
| Testning på klientsidan | Testnamn |
| WSTG-CLNT-01 | Testning för DOM-baserad Cross Site Scripting |
| WSTG-CLNT-02 | Testa för JavaScript-exekvering |
| WSTG-CLNT-03 | Testa för HTML-injektion |
| WSTG-CLNT-04 | Testar för URL-omdirigering på klientsidan |
| WSTG-CLNT-05 | Testar för CSS-injektion |
| WSTG-CLNT-06 | Testning för resurshantering på klientsidan |
| WSTG-CLNT-07 | Testa Cross Origin-resursdelning |
| WSTG-CLNT-08 | Testar för Cross Site Flashing |
| WSTG-CLNT-09 | Testar för Clickjacking |
| WSTG-CLNT-10 | Testar WebSockets |
| WSTG-CLNT-11 | Testa webbmeddelanden |
| WSTG-CLNT-12 | Testar webbläsarlagring |
| WSTG-CLNT-13 | Testa för inkludering av skript på flera webbplatser |
API-testning
| API-testning | Testnamn |
| WSTG-APIT-01 | Testar GraphQL |
Beställ revision från Sayfer
Säkerhetsbedömningsresultat
Ingen metod för att ta bort tillagda nätverk
| ID | SÄG-01 |
| Status | Fast |
| Risk | Låg |
| Business Impact | Det är inte möjligt att ta bort enskilda nätverk som lagts till från snappen. |
| Plats | – packages/snap/src/helpers.ts:105 |
BESKRIVNING
Koden implementerar möjligheten att lägga till ytterligare nätverk, vilket utökar deras lista utöver standard. Det noterades dock att det inte finns något sätt att ta bort dem förutom genom att installera om snappen. Denna funktionalitet var förmodligen planerad, eftersom det finns en removeNetwork()-funktion, men det är inte möjligt att anropa den från allmänt tillgängliga metoder.
export const networks = {
get: getNetworks,
setCurrent: setCurrentNetwork,
add: addNetwork,
remove: removeNetwork,
};
Mitigation
Vi rekommenderar att du implementerar denna metod, som förmodligen var tänkt.
Saknas bekräftelseprompt för export av privata nycklar
| ID | SÄG-02 |
| Status | Fast |
| Risk | Låg |
| Business Impact | Risk för att den privata nyckeln läcker när den av misstag visas på en skärm, till exempel på en offentlig plats. |
| Plats | – packages/snap/src/index.ts:145 |
BESKRIVNING
I de flesta kritiska funktionerna på ett ögonblick visas en dialogruta som informerar användaren om den åtgärd som utförs och begär deras godkännande.
Denna säkerhetsåtgärd finns dock inte i WalletExportPrivateKey-metoden, den som används för att visa den privata nyckeln på snapskärmen. Om den anropas av misstag skulle den omedelbart visa den privata nyckeln.
Mitigation
Innan du visar den privata nyckeln, lägg till en bekräftelseprompt som begär användarens godkännande.
Flera oimplementerade metoder
| ID | SÄG-03 |
| Status | Fast |
| Risk | Låg |
| Business Impact | Det finns en risk att några av metoderna som lämnats oimplementerade kan vara viktiga för snappens funktionalitet och av misstag förbises. |
| Plats | – packages/snap/src/index.ts:163, 169, 260, 266, 272, 278, 284, 290, 296, 302, 308, 314, 320, 326, 472, 509, 541, 568, 574, 580, 586, 592, 609, 615, 637, 643, 649, 655 696, 735, 741, 747, 753, 759, 765, 771, 777, 783, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX |
BESKRIVNING
En stor del av metoderna som finns i snappen verkar lämnas oanvända. Endast pannplattan som omger dem finns, men ingen konkret logik.
Mitigation
Vi rekommenderar att du granskar de metoder du vill implementera i din snap och se till att de alla innehåller faktisk logik. Det ska inte vara möjligt för användaren att anropa onödiga metoder som du inte har för avsikt att implementera.
Redundant kod
| ID | SÄG-04 |
| Status | Fast |
| Risk | Upplysande |
| Business Impact | Metoder som gör samma sak och returnerar samma data ökar i onödan storleken på snappens kodbas. |
| Plats | – packages/snap/src/index.ts:332, 338 |
BESKRIVNING
Under vår analys har vi märkt att två RPC-metoder, EthRequestAccounts och EthAccounts, verkar göra samma sak och returnera samma värden.
case RPCMethods.EthRequestAccounts: {
const wallet = await getWallet();
return [wallet.address];
}
case RPCMethods.EthAccounts: {
console.log('RPCMethods.EthAccounts');
console.log('request.params', JSON.stringify(request.params));
const wallet = await getWallet();
return [wallet.address];
}
I båda fallen hämtar dessa metoder den aktiva plånbokens data genom att använda getWallet() och returnerar sedan dess adress. För närvarande är den enda skillnaden att EthAccounts loggar medan EthRequestAccounts inte gör det.
Mitigation
Överväg att antingen ta bort en av metoderna eller modifiera en för att skilja den från den andra
Återstående TODO-kommentarer
| ID | SÄG-05 |
| Status | Fast |
| Risk | Upplysande |
| Business Impact | TODO-kommentarer och kommenterade kodavsnitt kan ge potentiella angripare värdefull information, förutom att de verkar oprofessionella. |
| Plats | – packages/snap/src/index.ts:460, 550 – packages/snap/src/polyfill.ts:7 – packages/snap/src/helpers/parsers/tx.ts:55 |
BESKRIVNING
Kodbasen innehåller flera TODO-kommentarer och även delar av kommenterad kod som inte längre används.
Även om detta är acceptabelt i en testmiljö, bör det elimineras i produktionen. Sådana kommentarer kan ge en potentiell intressent värdefull information om saknade funktioner, säkerhetsåtgärder och utvecklares tankar, som kan användas för att profilera attacker.
Mitigation
Vi föreslår att du tar bort kommentarer markerade som TODO och oanvända kodfragment i din produktionsgren.




