Lompat ke konten

Perlindungan replay pesan lintas chain

Perlindungan replay mengikat pesan sumber terautentikasi pada satu versi protokol dan domain tujuan, lalu mengizinkan percobaan ulang tanpa membolehkan lebih dari satu dampak ekonomi yang berhasil.

Diperbarui

Hanya untuk tujuan edukasi; bukan merupakan nasihat investasi atau rekomendasi investasi. Investasi dapat mengakibatkan kerugian.

Jawaban langsung

Perlindungan replay pesan lintas chain memastikan satu pesan sumber terautentikasi menghasilkan paling banyak satu dampak ekonomi yang berhasil pada domain tujuan yang dimaksud. Relayer boleh mengirimkan bukti yang sama berulang kali dan percobaan yang gagal boleh dicoba ulang, tetapi pesan yang sudah selesai tidak boleh mencetak, membuka aset, atau memanggil penerima lagi.

Autentisitas, finalitas, dan perlindungan replay adalah pemeriksaan terpisah. Tanda tangan valid, atestasi validator, atau bukti penyimpanan dapat mengautentikasi data tanpa membuktikan bahwa peristiwa sumber sudah final, tujuan dan penerima yang dimaksud sudah terikat, atau tujuan belum pernah memprosesnya. Relayer berizin pun hanya jalur pengiriman; identitas relayer tidak boleh menggantikan autentikasi pesan.

Tidak ada messageId lintas chain yang universal. Spesifikasi protokol menentukan serialisasi dan identitas secara tepat. Envelope yang kuat biasanya mengikat protokol dan versi, domain sumber dan messenger atau emitter, pengirim sumber, nonce atau identitas transaksi/log sumber, domain tujuan dan penerima, nilai, payload, serta kedaluwarsa. Wormhole, CCTP, Optimism, dan ERC-5164 memakai field dan state machine berbeda, sehingga pengidentifikasinya tidak dapat dipertukarkan.

Cara kerjanya

Tindakan sumber memancarkan atau menyimpan pesan. Setelah kebijakan konfirmasi atau finalitas yang disyaratkan terpenuhi, validator, guardian, atau sistem bukti mengautentikasinya. Di tujuan, verifier memeriksa root atau kumpulan tanda tangan terkait, versi protokol, pengirim remote tepercaya, tujuan, penerima, payload, dan batas waktu. Penerima menurunkan identitas sesuai protokol dan membaca state processed permanen sebelum menciptakan dampak eksternal.

Pengiriman sering bersifat setidaknya sekali, sedangkan dampak bisnis yang diinginkan secara efektif hanya sekali. State machine yang berguna membedakan belum pernah dicoba, sedang diproses, gagal atau dapat dicoba ulang, serta berhasil atau sudah dikonsumsi. Panggilan tujuan yang gagal tidak otomatis merupakan serangan replay. ERC-5164, misalnya, mewajibkan pesan berhasil dieksekusi paling banyak sekali, tetapi membolehkan percobaan lain setelah kegagalan. Aturan retry, penanganan gas, dan pencatatan nilai khusus produk tetap berlaku.

Flag replay atau guard pemrosesan harus ditetapkan sebelum panggilan eksternal yang tidak tepercaya, dengan reentrancy dikendalikan. Jika seluruh transaksi revert, perubahan state itu biasanya ikut revert sehingga jalur retry tetap terdefinisi; jika protokol sengaja menangkap kegagalan downstream, protokol harus mencatat state gagal yang terpisah tanpa tanpa sengaja mempertahankan nilai atau dampak parsial. Penerima juga sebaiknya idempoten bila sistem downstream dapat dipanggil melalui jalur lain.

Lingkup nonce penting. Nonce berurutan menegakkan urutan, tetapi dapat menahan pesan berikutnya di belakang pesan yang hilang. Nonce tak berurutan atau bitmap membolehkan pengiriman independen, tetapi memerlukan perhitungan word dan bit yang tepat. Desain batch harus menyatakan apakah seluruh batch atomik atau setiap leaf mempunyai bukti dan state processed sendiri. Hanya menandai root batch sebagai dikonsumsi setelah eksekusi parsial dapat mengulangi leaf yang berhasil atau membuat leaf yang gagal terkatung.

Kebijakan reorganisasi sumber merupakan bagian dari keamanan replay. Observasi yang ditandatangani sebelum finalitas memadai dapat tetap valid secara kriptografis walau peristiwa sumber kemudian tidak lagi kanonis. Upgrade adalah batas lain: layout penyimpanan proxy, mapping processed, domain versi, entry point lama, rotasi peer, fork, atau penggunaan ulang chain ID harus mempertahankan atau sengaja membatalkan identitas lama tanpa membuka kembali pesan yang telah dikonsumsi.

Gunakan alur kerja berikut:

  1. Sematkan protokol, versi deployment, domain sumber dan tujuan, messenger atau emitter tepercaya, pengirim, penerima, nilai, payload, nonce atau identitas peristiwa, serta semantik kedaluwarsa.
  2. Reproduksi encoding kanonis dan vektor uji messageId dari spesifikasi; tolak konkatenasi ambigu, field yang dihilangkan, dan asumsi pinjaman dari bridge lain.
  3. Verifikasi inclusion sumber serta kebijakan finalitas atau konfirmasi yang disyaratkan, kemudian root bukti, kuorum tanda tangan, set validator atau guardian, dan versi yang benar.
  4. Verifikasi tujuan, penerima, pengirim lintas domain, nilai, payload, dan kedaluwarsa secara independen; perlakukan relayer pengirim sebagai transportasi, bukan otoritas.
  5. Baca state pesan permanen dan masuk ke state processing atau consumed sebelum panggilan eksternal tidak tepercaya, disertai proteksi reentrancy dan pengujian eksplisit atas perilaku revert transaksi.
  6. Definisikan transisi berhasil, gagal, dan dapat dicoba ulang; perilaku nonce berurutan atau bitmap; atomisitas batch; serta pencatatan nilai. Buktikan pengiriman berulang tidak mengulangi leaf yang berhasil.
  7. Uji upgrade, migrasi penyimpanan, penonaktifan entry point lama, rotasi peer, fork, dan pemulihan darurat, lalu rekonsiliasi receipt, peristiwa, state processed, serta saldo tujuan.

Contoh

  • Pengikatan domain tujuan. Dua instruksi sama-sama membawa nonce 42 dan nilai 1,000, tetapi satu menargetkan chain 10 dan lainnya chain 8453. Pengidentifikasi yang menghilangkan tujuan memperlakukan 2 messages sebagai satu kandidat collision; encoding kanonis yang mengikat tujuan menghasilkan 2 distinct IDs. Fungsi hash dan representasi domain aktual harus berasal dari protokol.
  • Bitmap tak berurutan. Untuk nonce 513, word = floor(513 / 256) = 2, bit = 513 mod 256 = 1, dan mask = 1 << 1 = 2. Keberhasilan pertama mengubah word bitmap 2 dari 0 menjadi 2. Duplikat menemukan 2 & 2 = 2 dan ditolak, sementara nonce 512 memakai bit 0 secara independen.
  • Retry bukan dampak kedua. Pesan terautentikasi yang sama dikirimkan 3 kali. Panggilan tujuan yang memakai gas 110,000 dan 125,000 gagal dan revert; panggilan ketiga memakai 140,000 gas dan berhasil sekali. Total gas 110,000 + 125,000 + 140,000 = 375,000; pada 20 gwei, nilainya 0.0075 ETH. Jumlah pengiriman 3, tetapi dampak bisnis yang berhasil 1.
  • Pencatatan batch parsial. Empat leaf yang dapat dieksekusi independen membawa 25 + 40 + 15 + 20 = 100 unit. Leaf 0, 1, dan 3 berhasil sebesar 25 + 40 + 20 = 85; leaf 2 gagal dan menyisakan 15 pending. Hanya mengonsumsi root batch akan membuat 15 terkatung; mengulangi seluruh batch tanpa state per leaf dapat mengulangi 85. Gunakan rollback atomik atau state processed per leaf sesuai spesifikasi.

Risiko

  • Pengidentifikasi menghilangkan chain atau domain tujuan.
  • Pengidentifikasi menghilangkan messenger atau emitter sumber.
  • Versi protokol atau pesan tidak ada dalam domain.
  • Namespace nonce collision antar pengirim atau deployment.
  • Packed encoding ambigu menciptakan collision antar field berbeda.
  • Fork atau chain ID yang digunakan ulang membuat domain lama valid lagi.
  • Peristiwa sumber diterima sebelum finalitas memadai lalu hilang karena reorganisasi.
  • Root bukti, set validator, atau set guardian yang salah diterima.
  • Domain tanda tangan lama tetap valid setelah upgrade.
  • Kerusakan penyimpanan proxy mereset atau menumpangtindihkan state processed.
  • Migrasi menghilangkan pesan consumed atau membiarkan entry point lama aktif.
  • State baru ditandai setelah panggilan eksternal sehingga memungkinkan reentrancy.
  • Panggilan gagal ditandai berhasil dan tidak pernah dapat dicoba ulang.
  • Panggilan berhasil tidak disimpan dan mengulangi dampak ekonominya.
  • Nonce berurutan yang hilang memblokir semua pesan berikutnya.
  • Aritmetika word, bit, atau invalidasi bitmap salah.
  • State root batch bertentangan dengan eksekusi parsial per leaf.
  • Retry mengulangi leaf yang telah berhasil.
  • Unit tenggat, kedaluwarsa, atau jam tujuan salah dibaca.
  • Allowlist relayer disalahartikan sebagai otorisasi pesan.

Kesalahpahaman umum

  • Nonce saja unik secara global. Pengirim, protokol, deployment, serta domain sumber dan tujuan menentukan namespace-nya.
  • Hanya relayer berizin yang dapat mencegah replay. Relayer menyediakan pengiriman; verifikasi tujuan dan state consumed permanen menegakkan otoritas dan kendali replay.
  • Setiap pengiriman berulang adalah serangan. Jaringan setidaknya-sekali dapat mencoba ulang pesan gagal; invariannya adalah paling banyak satu dampak berhasil.
  • Bukti atau tanda tangan valid membuktikan finalitas dan maksud. Bukti dapat tidak mengikat target yang dimaksud, mengikat versi salah, atau mengatestasi state sumber yang kemudian direorganisasi.
  • Transaksi bridge berhasil membuktikan penyelesaian tepat sekali. Verifikasi status receipt, penyimpanan processed, peristiwa penerima, dan saldo aktual, termasuk setiap leaf batch.

Topik terkait

Sumber

Navigasi

Cari di wiki...