{"id":13850,"date":"2020-01-08T19:39:48","date_gmt":"2020-01-08T22:39:48","guid":{"rendered":"https:\/\/www.kaspersky.com.br\/blog\/?p=13850"},"modified":"2020-01-08T19:39:48","modified_gmt":"2020-01-08T22:39:48","slug":"gemini-front-running","status":"publish","type":"post","link":"https:\/\/www.kaspersky.com.br\/blog\/gemini-front-running\/13850\/","title":{"rendered":"Contratos inteligentes em Gemini Dollar permitem o roubo de pagamentos anti-spam"},"content":{"rendered":"<p>Os <a href=\"https:\/\/en.wikipedia.org\/wiki\/Winklevoss_twins\" target=\"_blank\" rel=\"noopener nofollow\">irm\u00e3os Winklevoss<\/a> s\u00e3o mais conhecidos como supostos pais fundadores do Facebook \u2013\u00a0 e at\u00e9 receberam, como forma de compensa\u00e7\u00e3o, US$ 65 milh\u00f5es de Mark Zuckerberg, em 2008. Em 2013, eles investiram pesadamente em Bitcoins, comprando cerca de 1% de todas as moedas existentes pelo pre\u00e7o de US$ 120 cada.<\/p>\n<p>Um pouco mais tarde, os irm\u00e3os abriram a plataforma de trocas de criptomoedas <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gemini_(company)\" target=\"_blank\" rel=\"noopener nofollow\">Gemini<\/a>, e em 2018, <a href=\"https:\/\/medium.com\/gemini\/gemini-launches-the-gemini-dollar-62787f963fb4\" target=\"_blank\" rel=\"noopener nofollow\">lan\u00e7aram<\/a> uma stablecoin: a <a href=\"https:\/\/gemini.com\/dollar\/\" target=\"_blank\" rel=\"noopener nofollow\">Gemini Dollar<\/a> (GUSD). Stablecoin \u00e9 uma criptomoeda com taxa fixa \u2013 1 GUSD equivale sempre a US$ 1 d\u00f3lar. Stablecoins s\u00e3o \u00fateis para \u201cdigitalizar\u201d d\u00f3lares reais. E tornam a movimenta\u00e7\u00e3o de d\u00f3lares de blockchain uma tarefa r\u00e1pida e f\u00e1cil. O respons\u00e1vel pela convers\u00e3o reversa para d\u00f3lares \u00e9 a empresa que as emitiu e as vendeu para voc\u00ea.<\/p>\n<p>No servi\u00e7o <a href=\"https:\/\/www.kaspersky.com\/enterprise-security\/ico-sto-security\" target=\"_blank\" rel=\"noopener nofollow\">Kaspersky Smart Contract Source Code Review<\/a>, analisamos um contrato inteligente que fornece a funcionalidade GUSD e detectamos uma falha.<\/p>\n<h2>Aviso Legal<\/h2>\n<p>Observe que o contrato inteligente fornecido j\u00e1 havia sido <a href=\"https:\/\/gemini.com\/wp-content\/themes\/gemini\/assets\/img\/dollar\/gemini-dollar-trailofbits-audit.pdf\" target=\"_blank\" rel=\"noopener nofollow\">revisado<\/a>, embora n\u00e3o saibamos se alguma falha de c\u00f3digo foi descrita no relat\u00f3rio.<\/p>\n<p>De acordo com nossa Pol\u00edtica de Divulga\u00e7\u00e3o Respons\u00e1vel, contatamos a equipe de seguran\u00e7a da Gemini para relatar o problema. Eles nos informaram que o assunto foi considerado durante a fase de design do projeto, mas n\u00e3o apresentou riscos para a GUSD.<\/p>\n<p>Para uma explica\u00e7\u00e3o mais simples sobre como funcionam os contratos inteligentes, confira nosso post sobre <a href=\"https:\/\/www.kaspersky.com\/blog\/ethereum-ico\/19846\/\" target=\"_blank\" rel=\"noopener nofollow\">contratos inteligentes, Ethereum e ICOs<\/a>.<\/p>\n<h2>Contratos inteligentes na Gemini Dollar<\/h2>\n<p>De um modo geral, quando algu\u00e9m deseja criar novos tokens baseados na blockchain Ethereum, eles escrevem um contrato inteligente (um miniprograma) que especifica o seguinte:<\/p>\n<ol>\n<li>Dados (\u201cesses tokens est\u00e3o nestes endere\u00e7os\u201d),<\/li>\n<li>M\u00e9todos (\u201cpor favor transfira meus tokens para estes endere\u00e7os\u201d, al\u00e9m de outros comandos).<\/li>\n<\/ol>\n<p>Os criadores do sistema Gemini Dollar tamb\u00e9m <a href=\"https:\/\/gemini.com\/wp-content\/themes\/gemini\/assets\/img\/dollar\/gemini-dollar-whitepaper.pdf\" target=\"_blank\" rel=\"noopener nofollow\">implementaram<\/a> os seguintes aprimoramentos:<\/p>\n<ol>\n<li>Eles separaram o contrato em tr\u00eas componentes: Proxy (a interface permanente com a qual os titulares de tokens podem interagir e executar opera\u00e7\u00f5es), Store (o mapeamento dos titulares de tokens e seus saldos) e Impl (a l\u00f3gica subjacente);<\/li>\n<li>O componente que descreve a l\u00f3gica pode ser atualizado e complementado com novos recursos, como a capacidade de congelar fundos. Enquanto isso, os dados e a interface permaneceram inalterados; a atualiza\u00e7\u00e3o \u00e9 vis\u00edvel para todos;<\/li>\n<li>Para atualiza\u00e7\u00e3o e controle, \u00e9 usado um contrato inteligente \u201cde cust\u00f3dia\u201d separadamente, que \u00e9 gerenciado por v\u00e1rias pessoas (custodiantes) para prote\u00e7\u00e3o adicional. Se um custodiante prop\u00f5e uma a\u00e7\u00e3o, os outros devem confirmar antes que a a\u00e7\u00e3o possa ocorrer.<\/li>\n<\/ol>\n<p>Os aprimoramentos s\u00e3o s\u00f3lidos e aumentam a seguran\u00e7a e a flexibilidade gerais.<\/p>\n<h2>Pagamentos anti-spam<\/h2>\n<p>Se algu\u00e9m que n\u00e3o seja o custodiante principal fizer uma proposta em um contrato de cust\u00f3dia, dever\u00e1 pagar uma participa\u00e7\u00e3o de 1 ETH (cerca de US $ 200 na taxa de c\u00e2mbio atual). Conforme observado nos <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L151\" target=\"_blank\" rel=\"noopener nofollow\">coment\u00e1rios<\/a> do pr\u00f3prio contrato, essa medida anti-spam busca dissuadir os participantes de criar muitas solicita\u00e7\u00f5es.<\/p>\n<p>Os pagamentos anti-spam acabam <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L264\" target=\"_blank\" rel=\"noopener nofollow\">indo<\/a> para uma pessoa: a que anuncia a aprova\u00e7\u00e3o de uma proposta \/ solicita\u00e7\u00e3o espec\u00edfica. Essa implementa\u00e7\u00e3o pode n\u00e3o parecer muito justa, mas os coment\u00e1rios indicam claramente que seus criadores a conceberam dessa maneira.<\/p>\n<p><strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } 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 <\/strong><strong>\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>De nossa parte, recomendamos o uso da abordagem <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>Ataques de Front Running podem roubar todos os pagamentos anti-spam<\/h2>\n<p>A pessoa que determina a aprova\u00e7\u00e3o da solicita\u00e7\u00e3o tamb\u00e9m recebe todos os pagamentos anti-spam ETH. Para fazer isso, ele ou ela chama a fun\u00e7\u00e3o do contrato inteligente <strong>completeUnlock<\/strong> e passa as assinaturas de dois custodiantes nos par\u00e2metros.<\/p>\n<p>O problema \u00e9 que o Ethereum, como qualquer outra blockchain, executa solicita\u00e7\u00f5es com atraso. Uma transa\u00e7\u00e3o do cliente (transferindo dinheiro ou chamando uma fun\u00e7\u00e3o) espera na fila por algum tempo (geralmente 15 segundos ou mais). Durante esse per\u00edodo, qualquer pessoa pode visualizar as transfer\u00eancias planejadas de outros usu\u00e1rios do Ethereum, incluindo valores, destinat\u00e1rios e par\u00e2metros. E o espectador pode usar essas informa\u00e7\u00f5es para criar sua pr\u00f3pria transa\u00e7\u00e3o e empurr\u00e1-las para a frente, pagando uma comiss\u00e3o mais alta ao minerador.<\/p>\n<p>Qualquer vantagem obtida por meio dessa espiada \u00e9 considerado um ataque indevido (Conhe\u00e7a os ataques: <a href=\"https:\/\/consensys.github.io\/smart-contract-best-practices\/known_attacks\/#front-running-aka-transaction-ordering-dependence\" target=\"_blank\" rel=\"noopener nofollow\">Front-Running<\/a>)<\/p>\n<p><em>Da investopedia.com:<\/em><\/p>\n<p><em>O Fron- Running \u00e9 quando um corretor ou outra entidade entra em uma negocia\u00e7\u00e3o porque tem conhecimento pr\u00e9vio de uma grande transa\u00e7\u00e3o n\u00e3o publicada que influenciar\u00e1 o pre\u00e7o do ativo, resultando em um prov\u00e1vel ganho financeiro para o corretor. Tamb\u00e9m ocorre quando um corretor ou analista compra ou vende a\u00e7\u00f5es por sua conta antes da recomenda\u00e7\u00e3o de compra ou venda da empresa para os clientes.<\/em><\/p>\n<p>No nosso caso, uma pessoa de fora pode configurar um rob\u00f4 para monitorar o <a href=\"https:\/\/etherscan.io\/address\/0x9a7b5f6e453d0cda978163cb4a9a88367250a52d\" target=\"_blank\" rel=\"noopener nofollow\">contrato de<\/a> cust\u00f3dia. Se algu\u00e9m perceber que algu\u00e9m solicitou a fun\u00e7\u00e3o <strong>completeUnlock<\/strong> (isto \u00e9, um custodiante est\u00e1 interagindo com o Gemini Dollar), copia imediatamente todos os par\u00e2metros e chama a fun\u00e7\u00e3o para extrair o Ether acumulado.<\/p>\n<p>Para conter tal ataque, recomendamos novamente o uso da <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>Al\u00e9m disso, recomendamos bloquear <a href=\"https:\/\/github.com\/gemini\/dollar\/blob\/master\/Custodian.sol#L233\" target=\"_blank\" rel=\"noopener nofollow\">desconhecidos<\/a> para solicita\u00e7\u00e3o de fun\u00e7\u00e3o destinada a custodiantes.<\/p>\n<h2>Implementa\u00e7\u00e3o pr\u00e1tica de um ataque<\/h2>\n<p>Embora perigosa em teoria, a vulnerabilidade detectada \u00e9 bastante benigna na pr\u00e1tica. Explicamos:<\/p>\n<ol>\n<li>Os pagamentos anti-spam s\u00e3o de pouca preocupa\u00e7\u00e3o para os custodiantes de um empreendimento t\u00e3o importante como o Gemini Dollar. A capitaliza\u00e7\u00e3o GUSD (o volume total de tokens emitidos) chegou a US$ 100 milh\u00f5es. Mesmo agora excede US$ 5 milh\u00f5es.<\/li>\n<li>Os pagamentos anti-spam ainda n\u00e3o apareceram <a href=\"https:\/\/etherscan.io\/address\/0x9a7b5f6e453d0cda978163cb4a9a88367250a52d\" target=\"_blank\" rel=\"noopener nofollow\">neste contrato<\/a> e talvez nunca apare\u00e7am, porque o custodiante principal n\u00e3o \u00e9 de forma alguma obrigado a deposit\u00e1-las (todos os outros s\u00e3o).<\/li>\n<li>Conhecendo a vulnerabilidade, os usu\u00e1rios podem simplesmente evitar a fun\u00e7\u00e3o vulner\u00e1vel ou atualizar o contrato.<\/li>\n<li>Durante a revis\u00e3o, n\u00e3o encontramos vulnerabilidades que ameacem tokens GUSD.<\/li>\n<\/ol>\n<p>Segundo a Gemini, \u201cEscolhemos esse design porque o Gemini n\u00e3o pretende colocar o Ether em condi\u00e7\u00f5es normais e, como resultado, tomamos uma decis\u00e3o baseada no risco de n\u00e3o expandir materialmente a complexidade da nossa base de c\u00f3digo apenas para o benef\u00edcio imaterial de um mecanismo de recupera\u00e7\u00e3o mais robusto por uma participa\u00e7\u00e3o anti-spam te\u00f3rica e nominal. Priorizar o c\u00f3digo simples e seguro continua sendo a melhor solu\u00e7\u00e3o para o Gemini Dollar e seus usu\u00e1rios. No futuro, poderemos revisar essa decis\u00e3o se o risco mudar e um contrato mais caro e complexo se tornar apropriado.\u201d<\/p>\n<p>Decidimos publicar este post em coordena\u00e7\u00e3o com a Gemini, j\u00e1 que os riscos anti-spam est\u00e3o apenas em uma combina\u00e7\u00e3o de circunst\u00e2ncias espec\u00edficas e improv\u00e1veis, e o Gemini Dollar n\u00e3o est\u00e1 em risco.<\/p>\n<p>Mais uma vez, lembramos a todos da necessidade de uma abordagem hol\u00edstica de seguran\u00e7a para as ICOs e outras atividades relacionadas a <a href=\"https:\/\/www.kaspersky.com\/enterprise-security\/ico-sto-security\" target=\"_blank\" rel=\"noopener nofollow\">criptomoedas e blockchains<\/a>.<\/p>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Analisamos investimentos vantajosos para capturar a aposta anti-spam Gemini Dollar.<\/p>\n","protected":false},"author":61,"featured_media":13852,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1119,1655,14],"tags":[1185,1288,2107,1365,2108,1763],"class_list":{"0":"post-13850","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-business","8":"category-enterprise","9":"category-news","10":"tag-business","11":"tag-criptomoedas","12":"tag-ether","13":"tag-ethereum","14":"tag-stablecoins","15":"tag-tokens"},"hreflang":[{"hreflang":"pt-br","url":"https:\/\/www.kaspersky.com.br\/blog\/gemini-front-running\/13850\/"},{"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":"it","url":"https:\/\/www.kaspersky.it\/blog\/gemini-front-running\/19597\/"},{"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":"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.com.br\/blog\/tag\/business\/","name":"Business"},"_links":{"self":[{"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/posts\/13850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/users\/61"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/comments?post=13850"}],"version-history":[{"count":3,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/posts\/13850\/revisions"}],"predecessor-version":[{"id":13854,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/posts\/13850\/revisions\/13854"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/media\/13852"}],"wp:attachment":[{"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/media?parent=13850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/categories?post=13850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kaspersky.com.br\/blog\/wp-json\/wp\/v2\/tags?post=13850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}