Kerentanan Putar Ulang Tanda Tangan dalam Kontrak Cerdas | BlockAudit

Nov 30 2022
Trik yang berguna adalah dengan menandatangani pesan secara off-chain dan memiliki kontrak yang menuntut tanda tangan tersebut sebelum melakukan suatu fungsi. Misalnya teknik ini digunakan untuk: -- mengurangi jumlah transaksi pada transaksi tanpa rantai gas, yang disebut transaksi meta Mari kita lihat apa yang sedang kita bicarakan Blockchain sangat bergantung pada tanda tangan kriptografi.

Trik yang berguna adalah dengan menandatangani pesan secara off-chain dan memiliki kontrak yang menuntut tanda tangan tersebut sebelum melakukan suatu fungsi.

Misalnya teknik ini digunakan untuk: -
- mengurangi jumlah transaksi pada rantai
- disebut transaksi tanpa gas
meta transaction

Mari kita lihat apa yang kita bicarakan

Blockchain sangat bergantung pada tanda tangan kriptografi. Transaksi ditandatangani dengan kunci privat yang sesuai, yang memungkinkan pengirim transaksi diasosiasikan dengan akun mereka. Pembukuan blockchain tidak akan dapat beroperasi tanpa fitur ini.

Tanda tangan digital juga sering divalidasi secara langsung dalam kontrak pintar Ethereum, memungkinkan satu atau lebih pemverifikasi untuk mengesahkan tindakan dengan mengirimkan tanda tangan off-chain ( atau bahkan tanda tangan yang dihasilkan oleh kontrak pintar lainnya ).

Ini sering digunakan dalam lemari besi multi-tanda tangan atau kontrak pemungutan suara untuk mengirimkan banyak tanda tangan pada saat yang sama atau untuk mendelegasikan otorisasi.
Serangan replay tanda tangan adalah kerentanan umum dalam implementasi semacam itu.

Verifikasi tanda tangan dalam kontrak pintar terkadang diperlukan untuk meningkatkan kegunaan atau menghemat biaya bahan bakar. Implementasi yang aman harus mencegah Signature replay Attacks .

Misalnya: -
Melacak semua hash pesan yang diproses dan hanya mengizinkan hash pesan baru untuk diproses. Pengguna jahat dapat menyerang kontrak yang tidak memiliki kontrol tersebut dan mendapatkan hash pesan yang dikirim oleh pengguna lain dan diproses berkali-kali.

Tanda Tangan Digital Kriptografis

Tanda tangan digital adalah primitif kunci publik dari otentikasi pesan. Di dunia fisik, tanda tangan tulisan tangan biasanya digunakan pada pesan tulisan tangan atau ketikan. Mereka digunakan untuk mengikat penandatangan pesan.

Tanda tangan digital adalah nilai kriptografi yang dihasilkan oleh data dan kunci rahasia yang hanya diketahui oleh penanda tangan.

Model Tanda Tangan Digital

Prosedur lengkap dijelaskan secara menyeluruh dalam poin-poin berikut:

Sumber Gambar : Wikipedia
  • Setiap pengguna skema ini memiliki satu set kunci publik dan pribadi.
  • Pasangan kunci yang digunakan untuk enkripsi/dekripsi dan penandatanganan/verifikasi seringkali berbeda satu sama lain. Kunci publik disebut sebagai kunci verifikasi dan kunci pribadi disebut sebagai kunci tanda tangan.
  • Data dikirim ke fungsi hash oleh penanda tangan, yang menghasilkan hash.
  • Algoritme tanda tangan kemudian menghasilkan tanda tangan digital pada hash yang disediakan menggunakan nilai hash dan kunci tanda tangan. Data tersebut diberi tanda tangan, dan keduanya selanjutnya diserahkan kepada verifikator.
  • Algoritme verifikasi dimasukkan oleh pemverifikasi bersama dengan tanda tangan digital dan kunci verifikasi. Hasil dari algoritma verifikasi adalah sesuatu yang bermanfaat. Pada data yang diterimanya, pemverifikasi juga menggunakan algoritma hash yang sama untuk menghasilkan nilai hash.
  • Nilai hash ini dan hasil proses verifikasi dibandingkan untuk verifikasi. Pemverifikasi menentukan apakah tanda tangan digital sah berdasarkan hasil perbandingan.
  • Tidak ada orang lain yang dapat menggunakan kunci "pribadi" penanda tangan untuk membuat tanda tangan digital, sehingga penanda tangan tidak dapat menarik kembali tanda tangannya atas data tersebut.

Lapisan Protokol

Hanya transaksi dengan tanda tangan yang valid yang disertakan dalam blok baru, berkat jaringan Ethereum . Untuk transaksi, ini menawarkan atribut keamanan berikut:

  • Otentikasi : Tanda tangan digunakan oleh node Ethereum untuk mengonfirmasi bahwa orang yang menandatangani transaksi adalah pemilik kunci privat yang terhubung ke alamat publik mereka. Oleh karena itu, pengembang dapat yakin bahwa msg.sender adalah asli.
  • Integritas : Integritas adalah kondisi bahwa transaksi tidak berubah setelah ditandatangani; jika tidak, tanda tangannya batal.
  • Non-repudiation: Tanda tangan transaksi dan setiap perubahan status yang dilakukan oleh pihak penandatangan yang memiliki kunci privat tidak dapat diganggu gugat. Kunci pribadi milik alamat publik yang tercantum di bidang dari .

Tanda tangan yang sama dapat digunakan berkali-kali untuk menjalankan suatu fungsi. Ini bisa berbahaya jika niat penanda tangan adalah untuk menyetujui transaksi satu kali.

Contoh Kode

Mari kita periksa bugnya.

function unlock(
  address _to,
  uint256 _amount,
  uint8[] _v,
  bytes32[] _r,
  bytes32[] _s
)
  external
{
  require(_v.length >= 20);
  bytes32 hashData = keccak256(_to, _amount);
  for (uint i = 0; i < _v.length; i++) {
    address recAddr = ecrecover(hashData, _v[i], _r[i], _s[i]);
    require(_isValidator(recAddr));
  }
  to.transfer(_amount);
}

Pesan yang ditandatangani oleh validator menggunakan teknik ECDSA adalah letak masalah dengan kode yang disebutkan di atas. Alamat penerima dan uang yang dibutuhkan adalah satu-satunya informasi dalam pesan. Tidak ada dalam pesan yang dapat digunakan untuk menghindari penggunaan tanda tangan yang sama lebih dari sekali. Pertimbangkan kasus berikut:

  • Sam mentransfer 2000 ETH dari jaringan tertaut kembali ke rantai Ethereum menggunakan jumlah mata uang yang sama.
  • Yang memproses transaksi cross-blockchain ini adalah Tom, seorang relayer. Untuk melepaskan 2000 ETH dari kontrak dan mengirimkannya ke Sam, dia mengumpulkan tanda tangan validator yang diperlukan, mengunci jumlah yang tepat pada rantai yang terhubung, dan kemudian menggunakan fungsi buka kunci.
  • Di blockchain, transaksi yang berisi susunan nilai tanda tangan dapat dilihat oleh semua orang.
  • Sekarang Sam telah menyalin larik tanda tangan, dia dapat mengirimkan panggilan buka kunci secara mandiri. Sekali lagi, proses membuka kunci akan berhasil, menghasilkan transfer 2000 ETH ke Sam.
  • Sam dapat melanjutkan dengan cara ini sampai kontraknya habis.

Serangan replay tanda tangan adalah apa yang dijelaskan dalam contoh di atas. Bisa dibayangkan karena tidak ada cara untuk menentukan apakah pesan bertanda khusus ini unik atau apakah sudah pernah digunakan sebelumnya.

Tandatangani pesan dengan noncedan alamat kontrak.

public uint256 nonce;
function unlock(
  address _to,
  uint256 _amount, 
  uint256 _nonce,
  uint8[] _v,
  bytes32[] _r,
  bytes32[] _s
)
  external
{
  require(_v.length >= 20);
  require(_nonce == nonce++);
  bytes32 hashData = keccak256(_to, _amount, _nonce);
  for (uint i = 0; i < _v.length; i++) {
    address recAddr = ecrecover(hashData, _v[i], _r[i], _s[i]);
    require(_isValidator(recAddr));
  }
  to.transfer(_amount);
}

Untuk melindungi dari serangan replay tanda tangan pertimbangkan rekomendasi berikut:

  • Simpan setiap hash pesan yang telah diproses oleh smart contract. Ketika pesan baru diterima periksa terhadap yang sudah ada dan hanya lanjutkan dengan logika bisnis jika itu adalah hash pesan baru.
  • Sertakan alamat kontrak yang memproses pesan. Ini memastikan bahwa pesan hanya dapat digunakan dalam satu kontrak.
  • Dalam keadaan apa pun tidak menghasilkan hash pesan termasuk tanda tangan. Fungsi ecrecoverini rentan terhadap kelenturan tanda tangan.

Tanda tangan non-unik dapat diputar ulang dalam berbagai situasi, seperti yang terlihat pada contoh di atas. Untuk menghindari serangan ulangan, sangat penting di sebagian besar situasi untuk memastikan tanda tangan dicocokkan secara khusus dengan setiap panggilan. Selain itu, untuk alasan ini, nonce disertakan dalam setiap transaksi Ethereum.

Referensi: -

https://solidity-by-example.org/hacks/signature-replay/
https://blog.finxter.com/smart-contract-replay-attack-solidity/
https://swcregistry.io/docs/SWC-121

Bergegas dengan Keamanan web3!!! Terhubung dengan kami!!!

BlockAudit :- Kenapa kita??
BlockAudit memiliki sumber daya dan pengetahuan untuk membuat solusi keamanan siber yang menghemat jutaan dolar.
Linkedin | Situs web | Twitter