Maleabilitatea tranzacțiilor Bitcoin

31 iulie 2014 bitcoin

Articol scris de David Mitran

Rețeaua Bitcoin este o rețea distribuită de noduri controlate de o multitudine de proprietari. Aceștia implementează în mod colectiv un registru ce urmărește soldul adreselor tuturor utilizatorilor. Fiecare utilizator poate crea un număr arbitrar de adrese care pot fi folosite pentru a trimite sau primi Bitcoini. O adresă este derivată dintr-o pereche de chei ECDSA care este mai târziu folosită pentru a dovedi statutul de proprietar asupra Bitcoinilor asociați cu adresa respectivă.

Singura operație permisă pentru modificarea soldurilor adreselor este tranzacția. O tranzacție este o structură semnată de informații care pe de-o parte revendică Bitcoinii asociați cu o adresă de trimitere și pe de altă parte îi conectează pe aceștia cu adresa de primire. Tranzacțiile pot fi identificate cu codul SHA256, iar o tranzacție este compusă din una sau mai multe intrări și o listă ordinată din una sau mai multe ieșiri. Intrarea este folosită pentru a specifica ce Bitcoini vor fi transferați, în timp ce o ieșire specifică adresa care ar trebui să fie creditată cu Bitcoinii ce urmează să fie transferați.

bitcoin_3

Scripturi Bitcoin

Limbajul de scriptare este folosit pentru crearea de scenarii complexe pentru transferurile de Bitcoini. De exemplu, este posibil să fie creată o adresă multi-semnată ce necesită m din n semnături pentru ca asociații Bitcoini să fie cheltuiți pentru scopuri arbitrare. Cu toate acestea, marea majoritate a tranzacțiilor folosesc scripturi standard care setează o condiție de revendicare ce necesită o cheie publică care să se potrivească. Din acest motiv, scriptul standard este adesea cunoscut precum scriptSig ( un script ce conectează o semnătură ), unde condiția standard de revendicare este cunoscută ca scriptPubKey ( un script ce necesită o cheie publică și o semnătură ).

Interesul particular în această muncă sunt operațiile OP_PUSHDATA ce specifică un număr de biți care urmează să fie împinși către o „grămadă”. În funcție de durata procesului, una din posibilele alternative poate fi folosită. Cea mai simplă este un singur bit cu valoare între 0x00 și 0x4b, de asemenea denumit OP_0.

Cu toate că scriptSig sunt atașate de intrarea tranzacției, acestea nu sunt cunoscute la timpul la care tranzacția a fost creată. De fapt, o semnătură nu poate semna nicio informație care o conține pe ea însăși, iar acest lucru ar putea crea o dependență circulară. Pentru acest motiv, revendicarea scripturilor este în mod consistent un singur OP_0 care împinge un element gol către respectiva grămadă.

Pe lângă toate acestea, există foarte multe surse de maleabilitate în scriptul de revendicare. În „A Bitcoin Improvement Proposal” de Wuille sunt identificate următoarele posibilități pentru a modifica semnătura și astfel să fie exploatată maleabilitatea.

  1. Maleabilitatea semnăturii ECDS: semnătura descrie puncte asupra unei curbe eliptice. Începând de la o semnătură ce este trivială pentru o derivare matematică, un al doilea set de parametri conectează același punct la curba eliptică;
  2. Semnăturile ECDSA codificate Non-DER: librăria criptografică folosită de clienții nucleului Bitcoin acceptă o multitudine de formaturi pe lângă cele standardizate DER ( Distinguished Encoding Rules );
  3. Forțări suplimentare de date: un scriptPubKey poate forța informații adiționale la începutul scriptului. Acestea nu sunt consumate de condiția de revendicare corespondentă și sunt pur și simplu uitate acolo după ce scriptul este finalizat.
  4. Semnătura și cheile publice pot rezulta dintr-un script mai complex care de fapt nu împinge informația către grămada respectivă, însă le calculează ca și cum acestea ar fi divizate în două sau mai multe bucăți de aceeași dimensiune.
  5. Codificarea non-minimală ale operațiunilor de „forțare”: așa cum a fost menționat mai devreme, există câteva operațiuni pentru a specifica operațiunile identice;
  6. Numerele folosite fără spațiere: șirurile de numere care sunt folosite fără spațiere sunt considerate numere;
  7. Datele ignorate de scripturi: dacă o informație este ignorată de scriptPubKey – dacă acesta conține OP_DROP, respectiva operație în scriptSig este ignorată;
  8. Steagul sighash poate fi utilizat pentru a ignora anumită părți ale unui script atunci când procesul semnăturii se derulează;
  9. Orice utilizator cu acces la cheia privată poate genera un număr arbitrar de semnături valide precum procesul de semnare ECDSA ce folosește un generator aleatoriu de numere pentru a crea semnături.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *