{"id":19597,"date":"2020-01-07T17:28:11","date_gmt":"2020-01-07T15:28:11","guid":{"rendered":"https:\/\/www.kaspersky.it\/blog\/?p=19597"},"modified":"2020-01-07T17:28:11","modified_gmt":"2020-01-07T15:28:11","slug":"gemini-front-running","status":"publish","type":"post","link":"https:\/\/www.kaspersky.it\/blog\/gemini-front-running\/19597\/","title":{"rendered":"Lo smart contract di GUSD consente il furto dei pagamenti antispam"},"content":{"rendered":"<p>I <a href=\"https:\/\/it.wikipedia.org\/wiki\/Cameron_e_Tyler_Winklevoss\" target=\"_blank\" rel=\"noopener nofollow\">gemelli Winklevoss<\/a> sono famosi per aver fondato Facebook (e per questo nel 2008 hanno anche ottenuto <a href=\"https:\/\/www.law.com\/almID\/1202428141988\/\" target=\"_blank\" rel=\"noopener nofollow\">65 milioni di dollari <\/a>di risarcimento da Mark Zuckerberg). Nel 2013 hanno investito largamente in Bitcoin, acquistando circa l\u20191% delle monete esistenti di questa criptovaluta, a 120 dollari l\u2019una.<\/p>\n<p>Subito dopo, i fratelli hanno creato l\u2019exchange di criptomonete <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gemini_(company)\" target=\"_blank\" rel=\"noopener nofollow\">Gemini<\/a> e nel 2018 <a href=\"https:\/\/medium.com\/gemini\/gemini-launches-the-gemini-dollar-62787f963fb4\" target=\"_blank\" rel=\"noopener nofollow\">hanno lanciato<\/a> la stablecoin <a href=\"https:\/\/gemini.com\/dollar\/\" target=\"_blank\" rel=\"noopener nofollow\">Gemini dollar<\/a> (o GUSD). La stablecoin \u00e8 una criptomoneta a tasso fisso, ovvero 1 token GUSD equivale sempre a 1 dollaro statunitense. Le stablecoin sono comode per \u201cdigitalizzare\u201d i dollari veri e propri e consentono il movimento rapido e facile dei dollari blockchain tra i vari exchange. A garantire la conversione inversa in dollari \u00e8 la compagnia che ha emesso e venduto questa criptomoneta.<\/p>\n<p>Utilizzando il nostro Review, abbiamo analizzato uno <a href=\"https:\/\/etherscan.io\/token\/0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd\" target=\"_blank\" rel=\"noopener nofollow\">smart contract<\/a> che offre la funzionalit\u00e0 GUSD e abbiamo riscontrato una falla.<\/p>\n<h2>Nota<\/h2>\n<p>Lo smart contract in questione \u00e8 gi\u00e0 stato <a href=\"https:\/\/etherscan.io\/token\/0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd\" target=\"_blank\" rel=\"noopener nofollow\">esaminato<\/a>, anche se non sappiamo se nel report siano stati descritti dei difetti nel codice.<\/p>\n<p>Seguendo la nostra politica aziendale di Responsible Disclosure, ci siamo messi in contatto con il team di sicurezza di Gemini per informarli e ci hanno risposto che il problema in questione era gi\u00e0 stato preso in considerazione durante la fase di progettazione e che non costituisce un rischio per il GUSD.<\/p>\n<p>Se volete saperne di pi\u00f9 sul funzionamento degli smart contract, vi consigliamo di leggere il nostro <a href=\"https:\/\/www.kaspersky.it\/blog\/ethereum-ico\/14334\/\" target=\"_blank\" rel=\"noopener\">post su Ethereum e gli ICO<\/a>,<\/p>\n<h2>Gli smart contract di Gemini dollar<\/h2>\n<p>In generale, quando si vogliono creare nuovi token basandosi sulla blockchain Ethereum, si scrive uno smart contract (ovvero un miniprogramma) con le seguenti specifiche:<\/p>\n<p>\u00a0<\/p>\n<ol>\n<li>Dati (\u201cquesti token si trovano a questo indirizzo\u201d);<\/li>\n<li>Metodologie (\u201ctrasferisci i miei token a questo indirizzo\u201d e altro).<\/li>\n<\/ol>\n<p>Gli ideatori del sistema Gemini dollar <a href=\"https:\/\/gemini.com\/wp-content\/themes\/gemini\/assets\/img\/dollar\/gemini-dollar-whitepaper.pdf\" target=\"_blank\" rel=\"noopener nofollow\">hanno implementato <\/a>i seguenti miglioramenti:<\/p>\n<ol>\n<li>Hanno suddiviso il contratto in tre componenti: proxy (l\u2019interfaccia permanente con la quale si interagisce e si effettuano le operazioni), Store (la mappatura dei possessori di token con I loro bilanci) e Impl (la logica sottostante);<\/li>\n<li>Il componente che riguarda la logica pu\u00f2 essere aggiornato e vi si possono aggiungere nuove funzionalit\u00e0 come la possibilit\u00e0 di congelare i fondi. Nel frattempo, i dati e l\u2019interfaccia rimangono immutati e l\u2019aggiornamento \u00e8 trasparente per tutti;<\/li>\n<li>In caso di aggiornamento e controllo, viene impiegato uno smart contract custode (\u201cCustodian\u201d) gestito da diverse persone per una maggiore protezione (i custodi, per l\u2019appunto). Se un custode propone un\u2019azione, gli altri devono confermarla affinch\u00e9 possa avere luogo.<\/li>\n<\/ol>\n<p>Questi miglioramenti servono per aumentare la sicurezza generale del sistema e per incrementare la sua flessibilit\u00e0.<\/p>\n<h2>Pagamenti antispam<\/h2>\n<p>Se qualcun altro al di fuori dei custodi principali inoltra una proposta all\u2019interno del contratto custode, deve pagare una quota di 1 EHT (200 dollari circa secondo il tasso di cambio corrente). Come specificato nei <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L151\" target=\"_blank\" rel=\"noopener nofollow\">commenti <\/a>al contratto, la misura antispam serve per dissuadere i partecipanti in modo tale che non inoltrino troppe richieste.<\/p>\n<p>I pagamenti antispam <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L264\" target=\"_blank\" rel=\"noopener nofollow\">sono rivolti<\/a> a una persona, colei che conferma l\u2019approvazione di quella proposta\/richiesta in particolare. L\u2019implementazione non \u00e8 l\u2019ideale, ma dai commenti si evince chiaramente che i suoi creatori l\u2019hanno concepita proprio in questo modo:<\/p>\n<p><strong> } else {<\/strong><\/p>\n<p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (address(this).balance &gt; 0) {<\/strong><\/p>\n<p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ reward sender with anti-spam payments<\/strong><\/p>\n<p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ignore send success (assign to \u02b9success\u02b9 but this will be overwritten)<\/strong><\/p>\n<p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 success = msg.sender.send(address(this).balance);<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Per quanto ci riguarda, consigliamo l\u2019uso del <a href=\"https:\/\/solidity.readthedocs.io\/en\/v0.5.10\/common-patterns.html\" target=\"_blank\" rel=\"noopener nofollow\">Solidity Withdrawal Pattern<\/a>.<\/p>\n<h2>Cybercriminali utilizzano il front-running per appropriarsi di tutti i pagamenti antispam<\/h2>\n<p>La persona che approva la richiesta riceve anche tutti i pagamenti antispam in ETH.\u00a0 Per fare ci\u00f2, utilizza la funzionalit\u00e0 <strong>completeUnlock <\/strong>e passa nei parametri le firme dei due custodi.<\/p>\n<p>Il problema \u00e8 che Ethereum, come qualsiasi blockchain, esegue le richieste con un certo ritardo. Una transazione di un cliente (come il trasferimento di denaro o l\u2019uso di una funzionalit\u00e0) restano in coda per un certo tempo (di solito durante una quindicina di secondi o anche pi\u00f9). Durante questo lasso di tempo, chiunque pu\u00f2 visualizzare i trasferimenti di denaro previsti da parte di altri utenti Ethereum, comprese informazioni importanti come somme, destinatari e parametri. I cybercriminali possono utilizzare queste informazioni per creare le proprie transazioni e spingerle in cima alla coda pagando una commissione pi\u00f9 alta al miner.<\/p>\n<p>Qualsiasi vantaggio ottenuto sbirciando le operazioni degli altri viene considerata come front-running, una particolare forma di attacco.(<a href=\"https:\/\/consensys.github.io\/smart-contract-best-practices\/known_attacks\/#front-running-aka-transaction-ordering-dependence\" target=\"_blank\" rel=\"noopener nofollow\">Attacchi conosciuti: Front-running<\/a>).<\/p>\n<p>Traduzione estatto da <a href=\"https:\/\/www.investopedia.com\/terms\/f\/frontrunning.asp\" target=\"_blank\" rel=\"noopener nofollow\">investopedia.com<\/a>:<\/p>\n<p><em>Il front-running avviene quando un broker o un\u2019altra entit\u00e0 accede a un affare perch\u00e9 \u00e8 venuto a conoscenza previamente di una grande transazione non pubblicizzata e che influir\u00e0 sul prezzo dell\u2019asset, il che probabilmente porter\u00e0 a un guadagno per il broker. Ci\u00f2 avviene anche quando un broker o un analista acquistano o vendono azioni per se stessi prima di consigliare la compravendita ai propri clienti a nome dell\u2019azienda.<\/em><\/p>\n<p>Nel nostro caso, una persona dall\u2019esterno pu\u00f2 configurare un robot affinch\u00e9 vigili il <a href=\"https:\/\/etherscan.io\/address\/0x9a7b5f6e453d0cda978163cb4a9a88367250a52d\" target=\"_blank\" rel=\"noopener nofollow\">contratto custode<\/a>. Se rileva che qualcuno richiede la funzionalit\u00e0 <strong>completeUnlock <\/strong>(il che vuol dire che un custode sta interagendo con Gemini dollar), il robot copia immediatamente tutti i parametri e richiede la funzionalit\u00e0 per estrarre l\u2019Ether accumulatosi.<\/p>\n<p>Per contrastare un attacco di questo tipo, ancora una volta consigliamo il popolare metodo <a href=\"https:\/\/solidity.readthedocs.io\/en\/v0.5.10\/common-patterns.html\" target=\"_blank\" rel=\"noopener nofollow\">Solidity Withdrawal Pattern<\/a>.<\/p>\n<p>E al di l\u00e0 di tutto, consigliamo anche di bloccare la possibilit\u00e0 a <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L233\" target=\"_blank\" rel=\"noopener nofollow\">sconosciuti <\/a>di richiedere una funzionalit\u00e0 rivolta ai custodi.<\/p>\n<h2>Implementazione pratica dell\u2019attacco<\/h2>\n<p>Se in teoria appare come pericolosa, nella pratica questa vulnerabilit\u00e0 riscontrata non \u00e8 poi cos\u00ec drammatica. Ecco perch\u00e9:<\/p>\n<ol>\n<li>I pagamenti antispam non sono una grande preoccupazione per i custodi di grandi venure come Gemini dollar. La capitalizzazione dei GUSD (ovvero il volume totale di token emessi) ha raggiunto i 100 milioni di dollari come apice e anche adesso supera i 5 milioni di dollari;<\/li>\n<li>I pagamenti antispam non sono ancora apparsi <a href=\"https:\/\/etherscan.io\/address\/0x9a7b5f6e453d0cda978163cb4a9a88367250a52d\" target=\"_blank\" rel=\"noopener nofollow\">in questo contratto <\/a>e potrebbero non comparire mai in quanto il custode principale non \u00e8 obbligato in alcun modo a depositari (tutti gli altri invece s\u00ec);<\/li>\n<li>Dopo essere venuti a conoscenza della vulnerabilit\u00e0, gli utenti possono semplicemente evitare la funzionalit\u00e0 vulnerabile o aggiornare il contratto;<\/li>\n<li>Durante l\u2019analisi, non abbiamo riscontrato vulnerabilit\u00e0 che minaccino i token GUSD.<\/li>\n<\/ol>\n<p>A tal proposito, Gemini afferma: \u201cAbbiamo scelto questa struttura perch\u00e9 Gemini non ha intenzione di beneficiare Ether in condizioni normali e, di conseguenza, abbiamo preso la decisione (con un certo rischio) di non estendere materialmente la complessit\u00e0 del nostro codice solamente per il beneficio non materiale di un meccanismo di ripristino pi\u00f9 robusto, riguardante un\u2019ipotetica quota antispam nominale. La miglior soluzione per Gemini dollar e per i suoi utenti \u00e8 dare la priorit\u00e0 a un codice semplice e sicuro. In futuro, se ci fossero cambiamenti che portino alla necessit\u00e0 di creare un contratto pi\u00f9 complesso e costoso, potremmo rivedere questa decisione\u201d.<\/p>\n<p>Abbiamo deciso di pubblicare questo post coordinandoci con Gemini, poich\u00e9 le somme antispam sono a rischio solo se si verificano una serie di circostanze specifiche e non cos\u00ec probabili, e perch\u00e9 GUSD non \u00e8 in pericolo.<\/p>\n<p>Ancora una volta, reiteriamo la necessit\u00e0 di adottare un approccio di sicurezza olistico nei confronti degli ICO e delle altre attivit\u00e0 relazionate alle <a href=\"https:\/\/www.kaspersky.it\/enterprise-security\/ico-sto-security\" target=\"_blank\" rel=\"noopener\">criptomonete e alle blockchain<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Front-running per ottenere le quote antispam di Gemini dollar.<\/p>\n","protected":false},"author":669,"featured_media":19599,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[12],"tags":[2556,3242,2608,3243,2719],"class_list":{"0":"post-19597","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-news","8":"tag-criptomonete","9":"tag-ether","10":"tag-ethereum","11":"tag-stablecoin","12":"tag-token"},"hreflang":[{"hreflang":"it","url":"https:\/\/www.kaspersky.it\/blog\/gemini-front-running\/19597\/"},{"hreflang":"en-in","url":"https:\/\/www.kaspersky.co.in\/blog\/gemini-front-running\/18359\/"},{"hreflang":"en-ae","url":"https:\/\/me-en.kaspersky.com\/blog\/gemini-front-running\/15236\/"},{"hreflang":"en-us","url":"https:\/\/usa.kaspersky.com\/blog\/gemini-front-running\/20065\/"},{"hreflang":"en-gb","url":"https:\/\/www.kaspersky.co.uk\/blog\/gemini-front-running\/18423\/"},{"hreflang":"es-mx","url":"https:\/\/latam.kaspersky.com\/blog\/gemini-front-running\/16832\/"},{"hreflang":"es","url":"https:\/\/www.kaspersky.es\/blog\/gemini-front-running\/20830\/"},{"hreflang":"ru","url":"https:\/\/www.kaspersky.ru\/blog\/gemini-front-running\/26060\/"},{"hreflang":"x-default","url":"https:\/\/www.kaspersky.com\/blog\/gemini-front-running\/31924\/"},{"hreflang":"pt-br","url":"https:\/\/www.kaspersky.com.br\/blog\/gemini-front-running\/13850\/"},{"hreflang":"de","url":"https:\/\/www.kaspersky.de\/blog\/gemini-front-running\/21847\/"},{"hreflang":"nl","url":"https:\/\/www.kaspersky.nl\/blog\/gemini-front-running\/24769\/"},{"hreflang":"en-au","url":"https:\/\/www.kaspersky.com.au\/blog\/gemini-front-running\/25647\/"},{"hreflang":"en-za","url":"https:\/\/www.kaspersky.co.za\/blog\/gemini-front-running\/25478\/"}],"acf":[],"banners":"","maintag":{"url":"https:\/\/www.kaspersky.it\/blog\/tag\/criptomonete\/","name":"criptomonete"},"_links":{"self":[{"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/posts\/19597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/users\/669"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/comments?post=19597"}],"version-history":[{"count":3,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/posts\/19597\/revisions"}],"predecessor-version":[{"id":19601,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/posts\/19597\/revisions\/19601"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/media\/19599"}],"wp:attachment":[{"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/media?parent=19597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/categories?post=19597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kaspersky.it\/blog\/wp-json\/wp\/v2\/tags?post=19597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}