Ini mungkin belum pernah terjadi di dunia nyata, dan mungkin tidak pernah terjadi, tetapi mari kita pertimbangkan ini: katakanlah Anda memiliki repositori git, buat komit, dan menjadi sangat sangat sial: salah satu gumpalan akhirnya memiliki SHA-1 yang sama sebagai yang lain yang sudah ada di repositori Anda. Pertanyaannya adalah, bagaimana Git akan menangani ini? Cukup gagal? Temukan cara untuk menghubungkan kedua gumpalan dan memeriksa mana yang diperlukan sesuai dengan konteksnya?
Lebih banyak penggila otak daripada masalah sebenarnya, tetapi saya menemukan masalah ini menarik.
git
hash-collision
Gnurou
sumber
sumber
Jawaban:
Saya melakukan percobaan untuk mengetahui bagaimana tepatnya Git akan berperilaku dalam kasus ini. Ini dengan versi 2.7.9 ~ rc0 + next.20151210 (versi Debian). Saya pada dasarnya hanya mengurangi ukuran hash dari 160-bit ke 4-bit dengan menerapkan diff dan pembangunan kembali git berikut:
Kemudian saya melakukan beberapa komitmen dan memperhatikan yang berikut ini.
Untuk # 2 Anda biasanya akan mendapatkan kesalahan seperti ini ketika Anda menjalankan "git push":
atau:
jika Anda menghapus file dan kemudian jalankan "git checkout file.txt".
Untuk # 4 dan # 6, Anda biasanya akan mendapatkan kesalahan seperti ini:
saat menjalankan "git commit". Dalam hal ini Anda biasanya dapat mengetik "git commit" lagi karena ini akan membuat hash baru (karena cap waktu yang diubah)
Untuk # 5 dan # 9, Anda biasanya akan mendapatkan kesalahan seperti ini:
saat menjalankan "git commit"
Jika seseorang mencoba mengkloning repositori Anda yang rusak, mereka biasanya akan melihat sesuatu seperti:
Yang "mengkhawatirkan" saya adalah bahwa dalam dua kasus (2,3) repositori menjadi korup tanpa peringatan, dan dalam 3 kasus (1,7,8), semuanya tampak baik-baik saja, tetapi konten repositori berbeda dari yang Anda harapkan menjadi. Orang yang mengkloning atau menarik akan memiliki konten yang berbeda dari yang Anda miliki. Kasing 4,5,6 dan 9 oke, karena akan berhenti dengan kesalahan. Saya kira akan lebih baik jika gagal dengan kesalahan setidaknya dalam semua kasus.
sumber
Jawaban asli (2012) (lihat
shattered.io
tabrakan SHA1 2017 di bawah)Yang lama (2006) jawaban dari Linus mungkin masih relevan:
The Pertanyaan tentang menggunakan SHA-256 secara teratur disebutkan, tetapi tidak bertindak atas untuk saat ini (2012).
Catatan: mulai 2018 dan Git 2.19 , kode sedang direactored untuk menggunakan SHA-256.
Catatan (Humor): Anda dapat memaksa komit ke awalan SHA1 tertentu , dengan gitbrute proyek dari Brad Fitzpatrick (
bradfitz
) .Contoh: https://github.com/bradfitz/deadbeef
Daniel Dinnyes menunjukkan dalam komentar untuk 7.1 Git Tools - Revisi Seleksi , yang meliputi:
Bahkan yang lebih baru (Februari 2017)
shattered.io
menunjukkan kemungkinan menempa tabrakan SHA1:(lihat lebih banyak di jawaban saya yang terpisah , termasuk posting Google+ Linus Torvalds ')
Lihat " Masa-masa fungsi hash kriptografis " dari Valerie Anita Aurora untuk lebih lanjut.
Di halaman itu, dia mencatat:
Lihat lebih banyak di jawaban terpisah saya di bawah ini .
sumber
/* This line added to avoid collision */
: D Anda bisa memenangkan lotre dua kali: P/* This line added to avoid collision of the avoid collision line */
Menurut Pro Git :
Jadi itu tidak akan gagal, tetapi juga tidak akan menyelamatkan objek baru Anda.
Saya tidak tahu bagaimana itu akan terlihat pada baris perintah, tapi itu pasti membingungkan.
Sedikit lebih jauh ke bawah, referensi yang sama mencoba untuk menggambarkan kemungkinan tabrakan tersebut:
sumber
Untuk menambah jawaban saya sebelumnya dari 2012 , sekarang ada (Februari 2017, lima tahun kemudian), contoh tabrakan SHA-1 aktual dengan shattered.io , di mana Anda dapat membuat dua file PDF bertabrakan: yaitu memperoleh SHA- 1 tanda tangan digital pada file PDF pertama yang juga dapat disalahgunakan sebagai tanda tangan yang valid pada file PDF kedua.
Lihat juga " Di ambang kematian selama bertahun-tahun, fungsi SHA1 yang banyak digunakan sekarang mati ", dan ilustrasi ini .
Pembaruan 26 Februari: Linus mengonfirmasi hal-hal berikut dalam pos Google+ :
Mengenai transisi itu, lihat Q1 2018 Git 2.16 menambahkan struktur yang mewakili algoritma hash. Implementasi transisi itu telah dimulai.
Mulai Git 2.19 (Q3 2018) , Git telah memilih SHA-256 sebagai NewHash , dan sedang dalam proses mengintegrasikannya ke kode (artinya SHA1 masih merupakan default (Q2 2019, Git 2.21), tetapi SHA2 akan menjadi penerusnya)
Jawaban asli (25 Februari) Tetapi:
Memang ada beberapa masalah untuk
git-svn
saat ini . Atau lebih tepatnya dengan svn itu sendiri , seperti yang terlihat di sini .git fsck
, seperti yang disebutkan oleh Linus Torvalds hari ini.git fsck
akan memperingatkan tentang pesan komit dengan data buram disembunyikan setelahNUL
(meskipunNUL
tidak selalu ada dalam file penipuan ).Tidak semua orang menyalakan
transfer.fsck
, tetapi GitHub melakukannya: setiap dorongan akan dibatalkan jika ada objek yang cacat atau tautan rusak. Meskipun ... ada alasannya ini tidak diaktifkan secara default .Masalah aktual dalam membuat dua repositori Git dengan head yang sama melakukan hash dan konten yang berbeda. Dan bahkan kemudian, serangan itu tetap berbelit-belit .
Joey Hess mencoba pdf tersebut dalam repo Git dan dia menemukan :
Jadi vektor utama serangan (menempa komit) adalah :
Plus, Anda sudah bisa dan mendeteksi serangan tabrakan kriptanalitik terhadap SHA-1 yang ada di setiap file
cr-marcstevens/sha1collisiondetection
Menambahkan cek serupa di Git itu sendiri akan memiliki beberapa biaya perhitungan .
Pada perubahan hash, komentar Linux :
Namun, rencana transisi (dari SHA1 ke fungsi hash lain) masih akan kompleks , tetapi dipelajari secara aktif.
Sebuah
convert-to-object_id
kampanye adalah berlangsung :Pembaruan 20 Maret: GitHub merinci kemungkinan serangan dan perlindungannya :
Perlindungan:
Lihat "
sha1collisiondetection
" oleh Marc StevensSekali lagi, dengan Q1 2018 Git 2.16 menambahkan struktur yang mewakili algoritma hash, implementasi transisi ke hash baru telah dimulai.
Seperti disebutkan di atas, Hash yang didukung baru akan SHA-256 .
sumber
git-svn
" merujuknya, meskipun secara tidak langsung)Saya pikir cryptographers akan merayakannya.
Kutipan dari artikel Wikipedia di SHA-1 :
sumber
y
bahwah(x) ==
h (y) `yang merupakan ancaman serius bagi data sewenang-wenang seperti sertifikat SSL namun ini tidak memengaruhi Git yang akan rentan terhadap serangan pra-gambar kedua yang berarti bahwa memiliki pesanx
Anda dapat mengubahnya ke pesanx'
ituh(x) == h(x')
. Jadi serangan ini tidak melemahkan Git. Juga Git belum memilih SHA-1 untuk alasan keamanan.Ada beberapa model serangan hash yang berbeda seperti SHA-1, tetapi yang biasanya dibahas adalah pencarian tabrakan, termasuk alat HashClash milik Marc Stevens .
Seperti yang ditunjukkan orang, Anda bisa memaksa tabrakan hash dengan git, tetapi hal itu tidak akan menimpa objek yang ada di repositori lain. Saya membayangkan bahkan
git push -f --no-thin
tidak akan menimpa objek yang ada, tetapi tidak 100% yakin.Yang mengatakan, jika Anda meretas ke repositori jarak jauh maka Anda dapat menjadikan objek palsu Anda yang lebih lama di sana , mungkin menanamkan kode yang diretas ke dalam proyek open source di github atau serupa. Jika Anda berhati-hati maka mungkin Anda bisa memperkenalkan versi diretas yang diunduh pengguna baru.
Namun saya curiga bahwa banyak hal yang mungkin dilakukan oleh pengembang proyek dapat mengekspos atau secara tidak sengaja menghancurkan hack jutaan dolar Anda. Secara khusus, itu banyak uang sia-sia jika beberapa pengembang, yang Anda tidak hack, pernah menjalankan yang disebutkan di atas
git push --no-thin
setelah memodifikasi file yang dilakukan, kadang-kadang bahkan tanpa--no-thin
tergantung.sumber