Ledelsesoversigt
Polkadot kontaktede Sayfer Security for at udføre en sikkerhedsrevision af Polkadots Metamask Snap-applikation i august 2023.
Inden vi vurderede ovenstående tjenester, holdt vi et kickoff-møde med det tekniske team og fik et overblik over systemet og målene for denne forskning.
I løbet af undersøgelsesperioden på 2 uger opdagede vi 5 sårbarheder på tværs af snapsens kodebase.
Som konklusion bør flere rettelser implementeres efter rapporten, men systemets sikkerhedsposition er kompetent.
Risikometodologi
Hos Sayfer er vi forpligtet til at levere penetrationstest af højeste kvalitet til vores kunder. Det er derfor, vi har implementeret en omfattende risikovurderingsmodel for at evaluere alvoren af vores resultater og give vores kunder de bedst mulige anbefalinger til afbødning.
Vores risikovurderingsmodel er baseret på to nøglefaktorer: IMPACT og SANDSYNLIGHED. Påvirkning refererer til den potentielle skade, der kan følge af et problem, såsom økonomisk tab, skade på omdømme eller et ikke-operativt system. Sandsynlighed refererer til sandsynligheden for, at et problem vil opstå under hensyntagen til faktorer som kompleksiteten af angrebet og antallet af potentielle angribere.
Ved at kombinere disse to faktorer kan vi skabe en omfattende forståelse af den risiko, et bestemt problem udgør, og give vores kunder en klar og handlekraftig vurdering af problemets alvor. Denne tilgang giver os mulighed for at prioritere vores anbefalinger og sikre, at vores kunder får den bedst mulige rådgivning om, hvordan de beskytter deres forretning.
Risiko er defineret som følger:

Sårbarheder efter risiko
Høj – Direkte trussel mod vigtige forretningsprocesser.
Medium – Indirekte trussel mod vigtige forretningsprocesser eller delvis trussel mod forretningsprocesser.
Lav - Der er ingen direkte trussel. Sårbarheden kan udnyttes ved hjælp af andre sårbarheder.
Informational – Denne konstatering indikerer ikke sårbarhed, men angiver en kommentar, der giver besked om designfejl og ukorrekt implementering, der kan forårsage et problem i det lange løb.
Tilgang
Sikkerhedsvurderingsmetode
Sayfer bruger OWASP WSTG som vores tekniske standard ved gennemgang af webapplikationer. Efter at have fået en grundig forståelse af systemet besluttede vi, hvilke OWASP-tests der kræves for at evaluere systemet.
Sikkerhedsvurdering
Efter at have forstået og defineret omfanget, udført trusselsmodellering og evalueret de korrekte test, der kræves for fuldt ud at kontrollere applikationen for sikkerhedsfejl, udførte vi vores sikkerhedsvurdering.
Beskrivelse af problemtabel
Udgavetitel
| ID | SIGE-??: Et ID for nem kommunikation om hver sårbarhed |
| Status | Åben/fast/Anerkendt |
| Risiko | Repræsenterer problemets risikofaktor. For yderligere beskrivelse henvises til Sårbarheder efter risiko sektion. |
| Virksomhedseffekt | Den største risiko for sårbarheden på forretningsniveau. |
| Lokation | URL'en eller filen, hvor dette problem blev opdaget. Problemer uden placering har ingen bestemt placering og refererer til produktet som helhed. |
Beskrivelse
Her giver vi en kort beskrivelse af problemet og hvordan det opstod, de trin, vi tog for at finde eller udnytte det, sammen med proof of concept (hvis det er til stede), og hvordan dette problem kan påvirke produktet eller dets brugere.
Mitigation
Foreslåede løsningsmuligheder for dette problem og links til anbefalede websteder for yderligere afhjælpning.
Sikkerhedsvurdering
Følgende test blev udført under revision af systemet
Information Indsamling
| Information Indsamling | Testnavn |
| WSTG-INFO-01 | Udfør søgemaskineopdagelse for informationslækage |
| WSTG-INFO-02 | Fingeraftryk webserver |
| WSTG-INFO-03 | Gennemgå webservermetafiler for informationslækage |
| WSTG-INFO-04 | Opregn applikationer på webserver |
| WSTG-INFO-05 | Gennemgå websideindhold for informationslækage |
| WSTG-INFO-06 | Identificer applikationsindgangspunkter |
| WSTG-INFO-07 | Kortlæg udførelsesstier gennem applikationen |
| WSTG-INFO-08 | Fingerprint Web Application Framework |
| WSTG-INFO-09 | Webapplikation med fingeraftryk |
| WSTG-INFO-10 | Kortapplikationsarkitektur |
Konfiguration og implementering af ledelsestest
| Konfiguration og implementering af ledelsestest | Testnavn |
| WSTG-CONF-01 | Test netværksinfrastrukturkonfiguration |
| WSTG-CONF-02 | Test applikationsplatformens konfiguration |
| WSTG-CONF-03 | Test filudvidelseshåndtering for følsomme oplysninger |
| WSTG-CONF-04 | Gennemgå gamle sikkerhedskopier og filer uden reference for følsomme oplysninger |
| WSTG-CONF-05 | Opregn infrastruktur- og applikationsadministrationsgrænseflader |
| WSTG-CONF-06 | Test HTTP-metoder |
| WSTG-CONF-07 | Test HTTP Strict Transport Security |
| WSTG-CONF-08 | Test RIA-politik på tværs af domæner |
| WSTG-CONF-09 | Test filtilladelse |
| WSTG-CONF-10 | Test for subdomæneovertagelse |
| WSTG-CONF-11 | Test Cloud Storage |
Identitetsstyringstest
| Identitetsstyringstest | Testnavn |
| WSTG-IDNT-01 | Testrolledefinitioner |
| WSTG-IDNT-02 | Test brugerregistreringsproces |
| WSTG-IDNT-03 | Test kontoprovisioneringsproces |
| WSTG-IDNT-04 | Test for kontooptælling og gættelig brugerkonto |
| WSTG-IDNT-05 | Tester for svag eller uhåndhævet brugernavnpolitik |
Autentificeringstest
| Autentificeringstest | Testnavn |
| WSTG-ATHN-01 | Test af legitimationsoplysninger transporteret over en krypteret kanal |
| WSTG-ATHN-02 | Test for standardlegitimationsoplysninger |
| WSTG-ATHN-03 | Test for svag låsemekanisme |
| WSTG-ATHN-04 | Test for omgåelse af godkendelsesskema |
| WSTG-ATHN-05 | Test for sårbare Husk adgangskode |
| WSTG-ATHN-06 | Test for svagheder i browsercache |
| WSTG-ATHN-07 | Test for svag adgangskodepolitik |
| WSTG-ATHN-08 | Test for svagt sikkerhedsspørgsmål svar |
| WSTG-ATHN-09 | Test for svag adgangskodeændring eller nulstilling af funktioner |
| WSTG-ATHN-10 | Test for svagere autentificering i alternativ kanal |
Autorisationstest
| Autorisationstest | Testnavn |
| WSTG-ATHZ-01 | Test af kataloggennemløbsfil inkluderer |
| WSTG-ATHZ-02 | Test for omgåelse af autorisationsskema |
| WSTG-ATHZ-03 | Test for privilegie-eskalering |
| WSTG-ATHZ-04 | Test for usikre direkte objektreferencer |
Sessionsstyringstest
| Sessionsstyringstest | Testnavn |
| WSTG-SESS-01 | Test for Session Management Schema |
| WSTG-SESS-02 | Test for cookies-attributter |
| WSTG-SESS-03 | Test for sessionsfiksering |
| WSTG-SESS-04 | Test for eksponerede sessionsvariabler |
| WSTG-SESS-05 | Test for forfalskning af anmodninger på tværs af websteder |
| WSTG-SESS-06 | Test for logout funktionalitet |
| WSTG-SESS-07 | Timeout for testsession |
| WSTG-SESS-08 | Test for Session Puzzle |
| WSTG-SESS-09 | Test for sessionskapring |
Datavalideringstest
| Datavalideringstest | Testnavn |
| WSTG-INPV-01 | Test af reflekteret scripting på tværs af websteder |
| WSTG-INPV-02 | Test for Stored Cross Site Scripting |
| WSTG-INPV-03 | Test af HTTP-udsagnsordsmanipulation |
| WSTG-INPV-04 | Test for HTTP-parameterforurening |
| WSTG-INPV-05 | Test for SQL Injection |
| WSTG-INPV-06 | Test for LDAP-injektion |
| WSTG-INPV-07 | Test for XML-injektion |
| WSTG-INPV-08 | Test for SSI-injektion |
| WSTG-INPV-09 | Test for XPath-injektion |
| WSTG-INPV-10 | Test for IMAP SMTP-injektion |
| WSTG-INPV-11 | Test for kodeinjektion |
| WSTG-INPV-12 | Test for kommandoinjektion |
| WSTG-INPV-13 | Test for Format String Injection |
| WSTG-INPV-14 | Test for inkuberet sårbarhed |
| WSTG-INPV-15 | Test for HTTP-smugling |
| WSTG-INPV-16 | Test for indgående HTTP-anmodninger |
| WSTG-INPV-17 | Test for Host Header Injection |
| WSTG-INPV-18 | Test af skabeloninjektion på serversiden |
| WSTG-INPV-19 | Test for server-side anmodningsforfalskning |
Fejlhåndtering
| Fejlhåndtering | Testnavn |
| WSTG-ERRH-01 | Test for forkert fejlhåndtering |
| WSTG-ERRH-02 | Test af stakspor |
Kryptografi
| Kryptografi | Testnavn |
| WSTG-CRYP-01 | Test for svag transportlagssikkerhed |
| WSTG-CRYP-02 | Test af polstring Oracle |
| WSTG-CRYP-03 | Test for følsomme oplysninger sendt via ukrypterede kanaler |
| WSTG-CRYP-04 | Test for svag kryptering |
Test af forretningslogik
| Test af forretningslogik | Testnavn |
| WSTG-BUSL-01 | Test Business Logic Data Validering |
| WSTG-BUSL-02 | Test evne til at forfalske anmodninger |
| WSTG-BUSL-03 | Test integritetstjek |
| WSTG-BUSL-04 | Test for procestiming |
| WSTG-BUSL-05 | Test Antal gange, en funktion kan bruges Grænser |
| WSTG-BUSL-06 | Test for omgåelse af arbejdsgange |
| WSTG-BUSL-07 | Test forsvar mod applikationsmisbrug |
| WSTG-BUSL-08 | Test upload af uventede filtyper |
| WSTG-BUSL-09 | Test upload af ondsindede filer |
Test på klientsiden
| Test på klientsiden | Testnavn |
| WSTG-CLNT-01 | Test af DOM-baseret Cross Site Scripting |
| WSTG-CLNT-02 | Test af JavaScript-udførelse |
| WSTG-CLNT-03 | Test for HTML-injektion |
| WSTG-CLNT-04 | Test af URL-omdirigering på klientsiden |
| WSTG-CLNT-05 | Test for CSS-injektion |
| WSTG-CLNT-06 | Test for klientsideressourcemanipulation |
| WSTG-CLNT-07 | Test Cross Origin-ressourcedeling |
| WSTG-CLNT-08 | Test for Cross Site Flashing |
| WSTG-CLNT-09 | Test for Clickjacking |
| WSTG-CLNT-10 | Test af WebSockets |
| WSTG-CLNT-11 | Test webmeddelelser |
| WSTG-CLNT-12 | Test af browserlagring |
| WSTG-CLNT-13 | Test for Cross Site Script-inkludering |
API-testning
| API-testning | Testnavn |
| WSTG-APIT-01 | Test af GraphQL |
Bestil revision hos Sayfer
Sikkerhedsvurderingsresultater
RPC URL'er er defineret som wsRpcUrl mens du bruger HTTP
| ID | SIG-01 |
| Status | Åbne |
| Risiko | Medium |
| Virksomhedseffekt | Det er svært at bestemme effekten uden en fungerende demo. Hvis ændringen er fejlagtig, kan den bryde snappet, ellers er dette et simpelt dokumentations-/variabelnavngivningsproblem. |
| Lokation | packages/snap/src/configuration/predefined.ts:11,22,33 |
Beskrivelse
RPC-URL'erne for individuelle protokoller er blevet ændret i den seneste version af snap. HTTP (http://) bruges i stedet for WebSocket (wss://).
Dette er uventet, fordi officiel Polkadot-dokumentation angiver kun websocket-adresser i deres ressourcer. Derudover indeholder variabelnavne mange steder i koden stadig ws-præfikset, såsom wsRpcurl.
foruddefineret.ts:
wsRpcUrl: 'https: /
wsRpcUrl: 'https: /kusama-rpc.polkadot.io/'
{...}
wsRpcUrl: 'https: /westend-rpc.polkadot.io/'
{...}
wsRpcUrl: 'https: /rpc.polkadot.io/'
Mitigation
Sørg for, at HTTP-protokollen formodes at blive brugt. Hvis det er det, skal du ændre den officielle dokumentation for at afspejle dette, og ændre de relevante variabelnavne.
Konformationer for nøglefunktioner håndteres ikke, når de afvises
| ID | SIG-02 |
| Status | Åbne |
| Risiko | Medium |
| Virksomhedseffekt | Hvis brugeren afslår transaktionen, vil der ikke blive returneret noget, hvilket vil ende med en JavaScript-fejl, en generisk undefined besked eller slet ingenting. Dette kan forårsage udefineret eller uventet adfærd. |
| Lokation | – packages/snap/src/rpc/exportSeed.ts:14 – packages/snap/src/rpc/substrate/sign.ts:33,53 |
Beskrivelse
For nøgle Snap-funktioner (såsom visning af den private nøgle eller signering af en besked), vises dialogbokse, så brugeren kan bekræfte, om de er klar over, hvad de accepterer. Hvis brugeren bekræfter transaktionen, udføres den. Det omvendte, når brugeren afviser transaktionen, håndteres slet ikke.
exportSeed(SnapsGlobalObject), bemærk, hvordan der ikke er nogen anden blok
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)
};
Desværre, da de automatiserede tests ikke virkede, kunne vi ikke definitivt bekræfte og bekræfte dette scenarie.
Mitigation
Håndter andet tilfælde, hvor brugeren afviser transaktionen, i hvilket tilfælde en passende fejl skal vises.
Ingen bekræftelsesdialog ved afsendelse
| ID | SIG-03 |
| Status | Åbne |
| Risiko | Lav |
| Virksomhedseffekt | Uden en bekræftelsesdialog er der risiko for, at en potentiel bruger fejlagtigt udfører en transaktion og sender penge til den forkerte konto. |
| Lokation | – packages/snap/src/rpc/send.ts:7-34 |
Beskrivelse
Når du signerer beskeder eller viser den private nøgle, viser snappen en dialogboks, der spørger brugeren, om de er sikre på, at de vil fortsætte. Der vises dog ingen sådan bekræftelsesdialog ved afsendelse.
Mitigation
Implementer en dialogboks, der beder brugeren om at bekræfte transaktionen.
aktiver PolkadotSnap Returnerer en fejl ved brug af standarden netværksnavn
| ID | SIG-04 |
| Status | Åbne |
| Risiko | Lav |
| Virksomhedseffekt | Manglende overholdelse af forretningsantagelser om, at Westend er standardnetværket. |
| Lokation | – packages/adapter/src/index.ts:27-29 |
Beskrivelse
Det er blevet bemærket, at trods valg af Westend som standardnetværk i snap/src/configuration/predefined.ts, hvis adapteren udfører sin eneste udsatte funktion, enablePolkadotSnap(), uden at angive config.networkName, vil der blive returneret en fejl.
Dette er ikke i overensstemmelse med Snaps antagelser, beskrevet blandt andet i README.md af adapteren, hvilket indikerer, at specificering af en konfiguration vil tilsidesætte standardkonfigurationen.
packages/snap/src/configuration/predefined.ts; linje 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;
packages/snap/src/configuration/predefined.ts; linje 27-29
if (!config.networkName) {
throw new Error("Configuration must at least define network type");
}
Mitigation
At dømme efter dokumentationen og koden i foruddefineret.ts, denne fejl skal ikke returneres, og Westend skal bruges. Omvendt bør Westend ikke indstilles som standard, og dokumentationen skal ændres for at afspejle det.
Ikke-fungerende demo
| ID | SIG-05 |
| Status | Åbne |
| Risiko | Informational |
| Virksomhedseffekt | At have en fungerende demo kan både hjælpe brugere med at teste funktionaliteten af Snap og hjælpe revisorer med at forbedre deres test i høj grad. |
| Lokation | - |
Beskrivelse
Ifølge dokumentationen er kommandoen yarn install & yarn run demo should run a working demo af Snap, så du kan installere det og bruge de forskellige funktioner. Under installationen returnerede browserkonsollen desværre en fejl. Verifikationen af Snap som en "levende organisme" var således umulig}
Mitigation
Vi foreslår at bringe Snap til en brugbar tilstand og derefter udføre dybdegående test af rigtige transaktioner med Polkadot-netværket.




