Ledelsesoversigt
Centraliseret Exchange-team kontaktede Sayfer for at udføre fuld blackbox-penetrationstest på deres webapplikation og whitebox-gennemgang for deres kryptoarkitektur i december 2021.
Før vi vurderede ovenstående tjenester, holdt vi et kickoff-møde med det tekniske team på Centralized Exchange og modtog et overblik over systemet og målene for denne forskning.
I løbet af undersøgelsesperioden på 4 uger opdagede vi 10 sårbarheder i systemet. De farligste sårbarheder var SQL-injektion og fejl i forretningslogikken.
Indvirkningen på systemet er kritisk, da en ondsindet hacker kan udnytte nogle af disse sårbarheder til at drage fordel af systemet, enten ved at ændre sin brugerrolle til "super_user" via SQL-indsprøjtningen eller ved at misbruge systemet og stjæle penge fra den centraliserede børs ved hjælp af 30'ernes systemopdateringsmekanisme.
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.
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 |
Anmeldelse af Crypto Wallet
| Anmeldelse af Crypto Wallet | Testnavn |
| SAYFER-CRPTW-01 | Test handel forretningslogik |
| SAYFER-CRPTW-03 | Test UTXO-baserede cryptocurrency node konfigurationer |
| SAYFER-CRPTW-04 | Test kontobaserede cryptocurrency-kodekonfigurationer |
| SAYFER-CRPTW-05 | Test transaktionsbekræftelse kritisk kode |
| SAYFER-CRPTW-06 | Test TAPROOT-understøttelse |
| SAYFER-CRPTW-07 | Test opbevaring af privat nøgle |
Bestil revision hos Sayfer
Sikkerhedsvurderingsresultater
Gemmer private MPC-nøgler på en usikker måde
| ID | SAYFER-CRPTW-07 |
| Risiko | Høj |
| Påkrævet færdighed | Høj |
| OWASP Henvisning |
- |
| Lokation | - |
| Værktøjer | Konfigurationsrevision |
Beskrivelse
Centraliserede udvekslinger lider under nøgleledelsespraksis af lav kvalitet. Der er mange eksempler på sådanne tilfælde, hvor nøglerne blev tabt eller stjålet, hvilket medførte, at tjenesten mistede alle pengepungen eller låste midlerne fuldstændigt.
Under vores revision af konfigurationsfiler gennemgik vi nøglestyringslagringen. Vi fandt ud af, at nøglerne, der bliver brugt til den kolde multi-sig-pung, ikke opbevares fordelt nok steder.
Der er 3 nøgler, der bruges i MPC-nøglesigneringen. 1 opbevares i en fysisk beskyttet maskine. De andre 2 er gemt i den samme dedikerede maskine i GCP.
Der er taget et par sikkerhedsmålinger for at sikre disse maskiner, men problemet afhænger af distributionen, hvis maskinen, der er installeret på GCP, bliver kompromitteret, kan en angriber underskrive enhver transaktion fra den kolde tegnebog.
Dette er et højrisiko og følsomt sted, hvor mange har fejlet tidligere, bedste praksis bør følges nøje.
Mitigation
Brug 3. parts depotservice til at administrere hot wallets og bokse. Vi vil med glæde anbefale en af vores samarbejdspartnere.
Disse tjenester håndterer MPC og nøglestyring for dig, med andre ekstra sikkerhedslag, der gør brugen af sådanne tjenester til det bedste valg til centraliserede udvekslinger.
SQL Injection
| ID | WSTG-INPV-05 |
| Risiko | Høj |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | – ██████████████ |
| Værktøjer | Burp Repeater, sqlmap, PayloadAllTheThings |
Beskrivelse
Et SQL-injektionsangreb involverer at indsætte eller "injicere" en delvis eller komplet SQL-forespørgsel i datainputtet, der transmitteres fra klienten til webapplikationen. Et vellykket SQL-injektionsangreb kan læse følsomme data fra databasen, ændre databasedata (indsætte/opdatere/slette), udføre databaseadministrationshandlinger (såsom nedlukning af DBMS), gendanne indholdet af en given fil på DBMS-filsystemet eller skrive filer ind i filsystemet og i nogle tilfælde udstede kommandoer til operativsystemet.
Brug af transaction endepunkt, vi var i stand til at misbruge more URL-forespørgselsparameter til indsprøjtning af ondsindet SQL-nyttelast:
/api/transactions?size=10&more=te');INJECTION_PAYLOAD
Den nyttelast vi brugte var:
/api/transactions?size=10&sort=time,DESC&more=te');SELECT+CASE+WHEN+(substring(versio n(),12,2)+%3d+'10')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END%3b – Hvilket i dette tilfælde kontrollerer, om den kørende forekomst af Postgres er version 10 eller ej.
En hacker, der udnytter denne sårbarhed, kan overtage systemet. Vi var i stand til at udtrække tabelskemaerne, opdatere vores egen brugers rolle eller dumpe enhver information gemt på DB'en og endda ændret vores brugers balance på DB'en.
Mitigation
SQL-injektionssårbarhed er let at rette, men svær at afbøde. Der er behov for stærk lining eller implementering af kompileringsregler, der gennemtvinger fremtidige ændringer.
Afhjælpning af SQL-injektionssårbarheder udføres normalt ved at følge en ramme efter eget valg, hvilket betyder, at udvikleren aldrig bør sammenkæde strenge i en fuld SQL-sætning.
Hvert brugerinput bør renses til en SQL-eksekvering i stedet for at blive brugt som en simpel SQL-forespørgselsstreng.
For mere information om SQL-injektion perfektion henvises til SQL Injection Forebyggelse CheatSheet.
Usikre direkte objektreferencer
| ID | WSTG-ATHZ-04 |
| Risiko | Høj |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | – ██████████████████/dashboard/{DASHBOARD_ID} |
| Værktøjer | Burp Repeater, DevTools |
Beskrivelse
Usikre direkte objektreferencer (IDOR) er en type adgangskontrolsårbarhed, der opstår, når en applikation bruger brugerleveret input til at få direkte adgang til objekter. Som et resultat af denne sårbarhed kan angribere omgå autorisation og få direkte adgang til ressourcer i systemet, for eksempel databaseposter eller filer.
Vi fandt ud af, at █████████ API'en lader en angriber se andre brugeres dashboardoplysninger, herunder alle denne brugers finansielle data.
Sårbarheden er afhængig af dashboard-id-parameteren, som er et gætteligt heltal. Eksempel på anmodning om et enkelt dashboard (for et dashboard, der ikke ejes af den aktuelle bruger):
GET ████/dashboard/827371 HTTP/1.1
Host: ██████████████████
api-key: ██████████
…
Det indikerer, at /dashboard/DASHBOARD_ID slutpunkt tjekker ikke for autorisation for den anmodede ressource. En autentificeret angriber kunne skrabe hvert enkelt dashboard, som indeholder oplysninger om brugerens midler og tidligere transaktioner.
Mitigation
Der er flere måder at afbøde IDOR-sårbarheder på, i dette tilfælde ser det ud til, at løsningen kan være at tjekke for autorisation for hver eneste anmodning.
Det betyder, at hver anmodningsnøgle kun vil kunne hente sin kontos dashboards
Svagere autentificering i alternativ kanal
| ID | WSTG-ATHN-10 |
| Risiko | Høj |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | – ██████████████████ |
| Værktøjer | Google Chrome, DevTools, amass, ffuf |
Beskrivelse
Selvom de primære godkendelsesmekanismer ikke inkluderer nogen sårbarheder, kan det være, at der findes sårbarheder i alternative legitime godkendelsesbrugerkanaler for de samme brugerkonti.
Denne sårbarhed er en del af en kæde af 2 sårbarheder, der gjorde det muligt for os at overtage enhver konto med kun en e-mailadresse.
Som en del af vores rekognoseringsfase, hvor vi prøver at finde en bredere angrebsvektor ved at opregne de vigtigste målundersystemer, fandt vi en admin -grænseflade under underdomænet ██████████████████. Det er muligt at logge ind på admin-grænsefladen ved hjælp af en normal app-bruger, men for næsten alle de netværksanmodninger, vi inspicerede under indlæsningen af hovedsiden, returnerer serveren en 401-fejl.
[IMAGE_REDACTED]
Vi reverse-manipulerede main.js bundle-filen, som har front-end-koden til appen, og fandt alle de potentielle slutpunkter, en administrator kan interagere med.
Vi kunne kun udnytte endepunktet af api/updateUser. Slutpunktet gjorde det muligt for os at redigere enhver bruger-e-mail, og ved at gøre det var vi i stand til at nulstille ofrets adgangskode og overtage kontoen
[IMAGE_REDACTED]
Mitigation
Det anbefales stærkt at lave en godkendelsesmekanisme eller en VPN til debugging eller til de administrative tjenester i systemet for at forhindre tilstedeværelsen af usikrede offentlige applikationer, der kan udnyttes af en angriber.
Derudover er der en autorisationsmekanisme i admin-grænsefladen, men dette er uden for dette projekts rammer.
Gennemgå webservermetafiler for informationslækage
| ID | WSTG-INFO-03 |
| Risiko | Høj |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | – ████████████████
– █████████████████████████████ – ████████████ |
| Værktøjer | Chrome, fortsæt |
Beskrivelse
Som en del af vores forskning om målet og dets underdomæner fandt vi nogle metafiler, der ikke burde være offentlige, eller i det mindste ikke uden den rette autentificeringsmekanisme.
- ████████████████████████.gitignore
- ██████████████████████████████./docker-komponér
- ████████████████████████/swagger-ui.html
[IMAGE_REDACTED]
[IMAGE_REDACTED]
[IMAGE_REDACTED]
Vi fandt tre slags filer, der kan skade ████████ tjenester, .gitignore, swagger-ui og docker-compose.yml fil. Disse tre filer afslører følsomme data
om servicearkitekturen. En ondsindet aktør kan bruge denne information til at øge sin angrebsvektor på målet.
Mitigation
Hvis det er muligt, skal du fjerne disse filer fra den offentlige service eller implementere en autorisationsmekanisme, der kun giver adgang til privilegerede brugere.
Manglende overskrift for indholdssikkerhedspolitik
| ID | SAYFER-CONFIG-008 |
| Risiko | Medium |
| Påkrævet færdighed | Høj |
| OWASP Henvisning |
- |
| Lokation | - |
| Værktøjer | Bøvs, webbrowser |
Beskrivelse
Content Security Policy (CSP) er et ekstra lag af sikkerhed, der hjælper med at opdage og afbøde visse typer angreb, herunder Cross-Site Scripting (XSS) og datainjektionsangreb.
Vi fandt ikke en CSP-header i nogen af serverens svar.
[IMAGE_REDACTED]
Ved at bruge CSP-webstedsadministratorer tilføjer en anden forsvarslinje mod XSS eller clickjacking-angreb, ved at gøre det vil systemet være sikkert, selvom fremtidige usikrede ændringer foretages i kildekoden.
En grundlæggende CSP-politik bør i det mindste beskrive de standard-hvidlistede domæner for statiske filer (som scripts, billeder og CSS). Og frame-ancestors for at forhindre klik-jack-angreb.
Mere info:
Mitigation
Tilføjelse af Content-Security-Policy: [policy] på hvert svar, hvor det kan være farligt at indlæse eksterne ressourcer
Vi anbefaler stærkt, at du bruger den og tester den først med varianten "Kun rapportering" for at teste din politik, før du frigiver den til produktion:
Content-Security-Policy-Report-Only: [policy]
Test af sikkerhedsoverskrifter
| ID | SAYFER-CONFIG-009 |
| Risiko | Medium |
| Påkrævet færdighed | Høj |
| OWASP Henvisning |
- |
| Lokation | – ████████████ |
| Værktøjer | Bøvs, webbrowser |
Beskrivelse
- Browsere understøtter mange HTTP-headere, der kan forbedre applikationssikkerheden for at beskytte mod en række almindelige angreb, headerne udveksles mellem en webklient (normalt en browser) og en server for at specificere de sikkerhedsrelaterede detaljer for HTTP-kommunikation.
Når du ser på ████████ sikkerhedsheadere, mangler følgende:
- X-Content-Type-Options
Indstilling af denne header forhindrer browseren i at fortolke filer som noget andet end det, der er deklareret af indholdstypen i HTTP-headerne.
- Streng-Transport-Sikkerhed
HSTS er en websikkerhedspolitikmekanisme, der hjælper med at beskytte websteder mod protokolnedgraderingsangreb og cookiekapring. Det giver webservere mulighed for at erklære, at webbrowsere kun bør interagere med den ved hjælp af sikre HTTPS-forbindelser og aldrig via den usikre HTTP-protokol.
- Henvisningspolitik
Referer-headeren er en anmodningsheader, der angiver det sted, hvorfra trafikken stammer fra. Hvis der ikke er tilstrækkelig forebyggelse på plads, vil selve URL'en og endda følsomme oplysninger indeholdt i URL'en blive lækket til webstedet med krydsoprindelse.
- Access-Control-Allow-Origin
Overskriften har værdien "*", som afslører API'en for hvert websted, dette er muligvis ikke det ønskede resultat.
Mitigation
Tilføjelse af de nævnte overskrifter til alle back-end-tjenester.
Gennemgå webservermetafiler for informationslækage
| ID | WSTG-INFO-03 |
| Risiko | Lav |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | - |
| Værktøjer | DevTools |
Beskrivelse
Mens vi undersøgte målet med DevTool, var vi i stand til at se frontend-kildekoden uden nogen form for sløring. Denne sårbarhed opstår, fordi JS-pakkerne sendes med sourcemaps til produktion, som gør det muligt at læse den originale kildekode med kommentarer, der kan afsløre information, for eksempel følgende paths.ts-fil:
█████████████████████/paths.ts [IMAGE_REDACTED]
Ved at have kildekortet kan en angriber lære om kodebasen, læse kommentarer og finde forældede kodedele, som senere kan bruges til at finde sårbarheder.
Mitigation
Send ikke kildekort til produktion, de fleste log- og fejlsporingssystemer har en mening om at uploade kildekortene til et back-office-system. En anden tilgang ville være kun at servere kildekortene til autentificerede brugere via VPN eller andre mekanismer.
Fingeraftryk webserver
| ID | WSTG-INFO-002 |
| Risiko | Lav |
| Påkrævet færdighed | Medium |
| OWASP Henvisning |
- Link |
| Lokation | – ███████████████████████████ |
| Værktøjer | Bøvse |
Beskrivelse
Mens blotlagte serveroplysninger i sig selv ikke nødvendigvis er en sårbarhed, er det oplysninger, der kan hjælpe angribere med at udnytte andre sårbarheder, der måtte eksistere. De fleste af slutpunkterne afslører ikke nogen information om serveren gennem HTTP-headere eller fejlsider.
Ved at bruge følgende forkert udformet HTTP-anmodning var vi i stand til at fingeraftrykke en Nginx-server gennem et 400-svar
GET /v2 HTTPMALFORMED/1.1
Host: ██████████████████
Accept: */*
Svarlegemet er:
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx 1.14.0</center>
</body>
</html>
Mitigation
Der er forskellige måder at skjule webserverheadere på, de mest almindeligt anvendte metoder er:
- Reverse proxy-servere, der står mellem det globale internet og det interne
- Konfigurer hver webserver til at fjerne disse overskrifter.
Bilag A: Rettelser til sikkerhedsevaluering
Vil blive opdateret af Sayfer-teamet efter den første revision.




