como você já deve estar sabendo o nos últimos dias teve aí um dos maiores hacks da história e um cara sozinho conseguiu roubar basicamente aí mais de 1 bilhão de Dólares de uma Cold Wallet entre aspas Cold Wallet da By Beach e bom eu fiquei bastante interessado em entender como é que esse cara conseguiu fazer esse hack e eu fiquei aqui estudando na última hora para entender como é que ele fez e precisei fazer engenharia reversa de alguns dos contratos que ele colocou na rede e também da da cod Wallet né do Smart Contract que
é cod Wallet da da bybit e até entender como que foi feito e aqui nesse vídeo eu vou explicar para você o que que aconteceu esse vai ser um vídeo que vai ter uma pegada bastante técnica vai ser bastante pesada em termos técnicos e se você não eh não tem esse conhecimento de evm solidity e Smart contracts ethereum vai ser de difícil de acompanhar mas eu vou tentar fazer um melhor aqui para primeiro fazer uma explicação básica visual do que aconteceu e depois a gente vai partir para abrir os contratos e ver exatamente o que
que ele foi fazendo a bybit usa uma solução chamada gnom Safe tá o gnom Safe ele é um Smart Contract na rede do etério certo vou botar aqui gnom gnom não desculpa gnosis noses Safe e esse é um um projeto que você usa como uma uma espécie de carteira online que você consegue controlar ela externamente então basicamente ele funciona assim você tem lá o teu gnos Safe e você manda eh mensagens assinadas para essa GN Safe a partir de uma carteira code que você controla para poder fazer gestão de fundos mas aparentemente isso é simples
né O problema é que a forma como eles fizeram Esse Deploy como que eles têm esse hnos Safe o setup dele que foi feito ele permitiu o hacker fazer algumas maracutaias aí então o os Safe Na verdade ele é um proxy que que significa isso o código que tá aqui dentro na verdade ele é é um código muito pequeno que toda vez que chega uma transação para ele ele vai reencaminhar Listo para um outro contrato que está na rede que é a implementação isso é feito a partir de uma chamada de um de um opcode
que se chama deixa eu ver delegate Call delegate Call faz tempo que eu vi isso aqui então então eu tô um pouco destreinado com relação a evm mas quando chega uma chamada Aqui o proxy ele sabe que ele precisa enviar esta chamada agora para a implementação real e quando essa chamada é feita através de delegate call tudo que for executado aqui será afetado neste contrato aqui então o contrato ele tem várias variáveis dentro dele lá certo toda variável ela ganha um endereço Deixa eu ver se eu consigo aqui ela ganha um endereço e como se
fosse um ponteiro em si tá então a primeira variável do contrato ela vai ter um endereço 0x tá um é um k 256 aqui então são 256 bits e vai a primeira variável vai ter o endereço finalizando em zero certo quando você tá se tratando desse proxy aqui o que que é essa variável essa primeira variável que tá lá essa primeira variável não é nada mais nada menos que o endereço da implementação então quando chega uma mensagem aqui no gnom Safe ele vai ler lá desse endereço zero a primeira variável Qual que é o endereço
da implementação e vai fazer um delegate Call para aquele endereço certo isso aqui é muito importante para entender como é que o cara arquitetou o hack dentro desta implementação existe uma função que se chama eec transaction certo eh e ela recebe como argumentos e várias várias coisas né então então dentre elas há uma assinatura deixa eu assinatura ela recebe um nce recebe endereço recebe um dado qualquer tá tudo isso aqui ele é feito para que quando alguém de fora alguém que controla efetivamente a code Storage e do lá no caso da bybit quiser fazer alguma
coisa eh alguma movimentação onem ela vai mandar uma mensagem assinada pro GN Safe tá e basicamente ela assina um hash de todos esses argumentos aqui quando chega lá na implementação ele vai verificar para ver se e essa mensagem foi assinada pelo pela code Storage oficial que deve ser uma carteira que tá fora isso a gente não tem acesso mas a bybit deve ter aí uma eh uma hard Wallet alguma coisa assim uma multisig não sei eh que assina as transações e que esse esse contrato tem esse endereço lá dentro então ele sabe que ele só
pode executar transações que foram assinadas off chain e fora da rede por essa carteira de segurança uma carteira e de confiança da bybit tá Então qual que é o enrosco aqui o que que aconteceu bom o hacker né eh não sei se dá para chamar de hacker que hoje em dia tem outra conotação essa palavra mas enfim p pessoa que aplicou o golpe aqui que que ela fez ela ela eh fez um Deploy de um contrato externo que eu vou chamar de exploiter ou exploit e ela fez um também um Deploy de um outro contrato
que é uma nova implementação implementação tá f desalinhado o O que que tem dentro desse exploit dentro desse exploit só tem uma função chamada transfer que recebe um endereço e um U int 256 tá que na verdade não é usado esse wit 256 somente o endereço dentro da nova implementação aqui o cara tem tinha três eh três funções então [Música] transfer exatamente igual ao outro o in do ou melhor é acho que é in 256 ou address também que dá na mesma né porque é o mesmo tipo de endereço mesmo tipo de tamanho ele tinha
um sweep if que era um address um address eu acho Ou melhor não era só um address e ele tinha um sweep erc20 address certo no final das contas ele não usou essa transfer aqui para nada eu eu acho que a ideia dele é que ele só fizesse o Deploy de um contrato e por algum motivo ele resolveu mover essa transfer para esse exploit aqui e fazer um exploit separado mas enfim o que que aconteceu esse cara conseguiu mandar de alguma forma uma mensagem assinada pro gnos Safe que mandou lá pra implementação e executou essa
transação aqui passando uma assinatura válida o que indica que Muito provavelmente tenha sido eh um trabalho interno lá alguém de dentro que fez né supostamente o nouns estava correto ele era o próximo da lista e ele mandou aqui um data que fazia o quê ele chamava chamava o exploit nessa função transfer e essa função transfer ela na verdade transferia o quê não transferia saldo o que ela fazia ela era chamada com delegate Call e essa função transfer ela fazia com que esse endereço aqui que mudasse em vez de apontar para a implementação oficial ele fazia
uma transferência para a nova implementação que somente o atacante contratava eh controlava certo esse contrato aqui somente o atacante controla depois a gente vai abrir os contratos fazer Gia reversa dos bite codos para você ver a implementação efetiva mas o que que acontece após isso ter sido executado isso aqui não existia mais então o gnos Safe ele e recebia a partir desse momento depois do do exploit ter sido executado ele toda todas as transações que ele recebia Ele encaminhava diretamente para a nova implementação que já era controlada pelo hacker tá E aí o que que
ele fez ele chamou Primeiramente um sweep e rc20 aqui desculpa s rc20 com o endereço do contrato que seria qual token que ele tá querendo eh fazer o sweep essa implementação era esperta suficiente para e ir no contrato e descobrir quanto de saldo que tinha desse determinado token a primeira que ele fez foi usdt e só tinha 90 lá então ele fez swip de 90 e logo depois ele fez uma chamada para sweep e e passando aqui eu não lembro exatamente o que que ele passou aqui nesse address mas ele mandou todo o saldo para
o próprio a própria carteira certo então basicamente foi essa sequência foi isso que aconteceu e agora a gente vai abrir os contratos para ir acompanhando passo a passo certo essa aqui foi a sequência de passos que ele fez Então a partir desse exec transaction aqui é que foi feita a o hack Vamos abrir eu vou fechar os as minhas tabs aqui pra gente abrindo uma por uma e acompanhando então ele primeiramente fez esse ex transaction que eu falei para você se a gente abrir aqui o more details você vai ver e o exec transaction certo
então é uma função que ele chama ele passa vários parâmetros né e o destino Qual que é o o endereço de destino que ele vai vai Executar a transação então eh no caso ele apontou para aquele Smart Contract dele né deixa draw ele passou o endereço dele desse exploit aqui hã e eu vou eu vou pedir para ele fazer um Decode aqui que vai ficar mais fácil da gente entender ele vai decodificar tudo isso aí pra gente poder entender mais fácil tá ele mandou então pro para para esse endereço aqui executou para esse endereço e
passou ess esse esse data o que que é esse data esses quatro primeiros bytes aqui e eles são o selector da função e e ela é o selector da função deixa eu abrir aqui eh transfer tá então se a gente pegar isso aqui deixa eu ver se é isso mesmo e jogar num quec 256 ó lá a a905 eh 9cbb se a gente for lá a gente vai ver que é exatamente esse o selector Aí depois ele vai passar esses dados aqui é o endereço de destino e esse endereço destino nada mais é do que
o endereço Cadê o endereço desta nova implementação que também era um contrato que ele tinha criado e é isso os outros dados não importam muito pra gente o que importa é esse último que ele tinha uma assinatura válida ou seja ele conseguiu assinar essa mensagem de forma válida na com a carteira a a cod Storage do eh da bybit tá então isso aconteceu lá dentro da Exchange a gente não sabe como é que aconteceu provavelmente alguém foi enganado no processo aí a a assinar essa transação maliciosa então ele vai chamar a função transfer desse cara
aqui vamos abrir e esse cara para ver quem é ele tá eu vou eh o endereço do É esse aqui certo você vai ver que ele é um um contrato bem pequeno eu vou mandar ele fazer a descompilação desse a engenheiria reversa contrata você vai ver que é só isso aqui certo que que ele tá fazendo ele Define um Storage zero que é o endereço que eu falei para você ali tá deixa eu abrir aqui é esse endereço aqui ele tá vai fazer um override do do conteúdo desse endereço com Cadê com aquilo que vier
na função no da função transfer tá e o que que é o da função transfer vamos voltar lá é complicado tá é isso aqui é esse endereço aqui ou seja BBD tá tá certo o o segundo argumento seria esse monte de zero aqui eu não sei por que ele fez dessa forma mas é assim que ele que ele resolveu fazer então agora vamos abrir o contrato de implementação eh Vamos abrir o contrato de implementação você pode ver que tem uma transação para ele de quro dias atrás esse cara já estava fazendo testes com Esses contratos
tá E dá pra gente depois abrir as transações e ver mas a gente dá para dá para ver que é uns quatro C dias atrás ele já estava fazendo testes para tentar descobrir se o hack dele ia dar certo então foi tudo planejado não foi nada de última hora tá deixa eu descompilar aqui beleza esse aqui é o contrato do cara certo ele é um contrato que tem eh você pode ver aqui que ele tem o transfer tá tá E ele aqui dentro ele ele não usou essa função para nada tá ele usou a do
outro contrato mas Nessa versão aqui ele tinha um if a mais que fazia com que só pudesse executar Essas funções eh transações vindo da carteira dele tá então a carteira dele estava explícita aqui dentro a gente pode confirmar na lista que é exatamente a carteira dele né 0fa isso fa a0 tá aqui ó fa a0 que o zero a esquerdao não conta Beleza então essa função não foi utilizada Esta função aqui você pode ver que ele está com o nome de anon Por que não porque o o o descompilador aqui que faz engenharia reversa ele
não sabe qual que é o nome dessa função dentro dos contratos e no no bte code Você não tem o nome você tem somente o selector o selector dessas duas funções aqui a gente já sabe tá e a gente pode abrir aqui e fazer um kk que a gente vem aqui swip erc20 eu acho que é essa vamos ver e6d ou era dois endereços ver não e uma função começa com tá essa aqui ela recebe dois address então a gente tem que mudar aqui pronto 58 25 15 será que é isso vamos ver isso aí
58 25 15 17 essa função aqui é a função swip rc20 e o que que ela faz né primeiro ele testa para ver se tá vindo da carteira dele se não tiver ele ele joga uma exceção ele reverte a transação E se for que que ele faz ele vai ele pega o balance off né ele ele pergunta pro contrato do Token em questão tá sendo tentado fazer suip aqui quanto de saldo que tem E aí depois ele vai tentar fazer um transfer desse token todo para o endereço dele mesmo certo e essa outra função aqui
ela é similar Então essa aqui 1163 vamos lá vamos jogar no aqui S if E lá eu acho que deixa eu ver quantos argumentos é um argumento 11 É isso aí 1163 B2 b0 você entra aqui 1163 B2 b0 o selector dessa função essa aqui é a função que varre o o a o o saldo de etherium E foi exatamente o que ele usou para poder fazer aquela varredura de 400.000 eum lá da carteira então ele verifica para ver se tá vindo da carteira dele se não tiver ele reverte e daí depois ele faz o
quê ele faz um Call que é como você vai mandar saldo no eum tá pro parâmetro número um eu já vou mostrar essa transação sendo executada ali aí ele pega a quantidade total de que tem nesse endereço aqui e manda pra carteira dele beleza é isso aí que ele faz e essa aí basicamente a é é o resumo do que que foi esse esse hack então o ponto principal todo aqui é o seguinte né Vamos mostrar aqui aqui ele executando sweep rc20 aqui ele executando sweep e essa aqui foi exatamente a a transação como você
pode ver que transferiu 400.000 eum pra carteira do exploiter tá que é essa aqui dá para ver ele chamando a função aqui ele passa o endereço dele para receber E é isso que aconteceu beleza vamos só fazer então uma recapitulação o exploiter de alguma forma conseguiu chamar Esta função com uma assinatura válida ou seja aparentemente supostamente foi um trabalho interno alguém interno com acesso conseguiu convencer alguém a assinar essa transação maliciosa e ele depois que eh fez o broadcast dessa dessa transação ele modificou o endereço que era de implementação aqui do original do do Ginos
Safe para a nova implementação que ele que ele controlava e a partir daí ele fez o que ele bem quis como curiosidade a gente pode entrar aqui na implementação do gnos Safe essa aqui é o tal do exec transaction é uma coisa muito interessante que tem um nonce certo veja que o nonce ele é na verdade uma variável pública tá Global desse contrato então a gente pode ver que eh o non ele é passado aqui e depois é incrementado Então essa transação quando ela é assinada offline pelos detentores da da da Carteira de verdade cod
Wallet eh Ela já tem que conter esse nce aqui para que eh ela seja válida E se a gente for na lista de transações a gente vai ver que foi executado um exec transaction há 20 dias atrás Então essa assinatura ela foi feita entre o dia eh dia 3 e anteontem eh basicamente é isso que dá pra gente inferir pelo pelo histórico aqui senão não teriam assinado a transação com nce diferente do que do que deveria né e o atacante também se ele conseguisse uma transação com próximo nonce e a Exchange tivesse mandado um exec
transaction com uma com um nonce igual a assinatura que ele já tinha antes dele efetuar o hack eh a transação falharia a on chain então basicamente Esse é o resumo do do hack tá esse desenho Maravilhoso aqui que eu fiz para vocês espero que esse conteúdo tenha ajudado você aem entender o que que aconteceu aí e a gente se vê numa próxima