গিট কীভাবে কোনও ব্লাবের উপর একটি SHA-1 সংঘর্ষ পরিচালনা করবে?


543

এটি সম্ভবত বাস্তব-জগতে এখনও কখনও ঘটেনি, এবং এটি কখনও ঘটতেও পারে না তবে আসুন এটি বিবেচনা করুন: বলুন আপনার কাছে একটি গিট রিপোজিটরি আছে, একটি অঙ্গীকার করুন এবং খুব দুর্ভাগ্য হোন: ব্লবগুলির মধ্যে একটিতে একই SHA-1 থাকা শেষ হবে অন্য হিসাবে এটি ইতিমধ্যে আপনার ভাণ্ডারে রয়েছে। প্রশ্ন, গিট কীভাবে এটি পরিচালনা করবে? কেবল ব্যর্থ? দুটি ব্লবকে সংযুক্ত করার জন্য কোনও উপায় সন্ধান করুন এবং প্রসঙ্গ অনুযায়ী কোনটি প্রয়োজন তা পরীক্ষা করুন?

আসল সমস্যাটির চেয়ে আরও বেশি মস্তিষ্কের টিজার, তবে আমি বিষয়টি আকর্ষণীয় বলে মনে করেছি।


76
একবার মস্তিষ্কের টিজার, এখন সম্ভবত সম্ভাব্য একটি আসল সমস্যা
টবি

11
@ টবি এই প্রশ্নটি প্রাক-চিত্র আক্রমণ সম্পর্কে ছিল ; গুগল যা দেখিয়েছিল তা সংঘর্ষের আক্রমণ - অনুরূপ তবে কিছুটা আলাদা। পার্থক্য সম্পর্কে আপনি এখানে আরও পড়তে পারেন ।
সাহেদ

@Saheed আমি দেখতে পাচ্ছি না কি এই প্রশ্নের অংশ, বিশেষভাবে একটি প্রি-ইমেজ আক্রমণ সম্পর্কে হিসাবে প্রশ্ন রেখে প্রায় হয় একটি একটি Git সংগ্রহস্থলের মধ্যে সংঘর্ষের না এটা শোষণ সম্পর্কে।
টবি

3
@ টবি আসল মস্তিষ্কের টিজারটি আক্রমণ সম্পর্কিত নয় (প্রাক চিত্র বা সংঘর্ষের কথা নয়) বরং একটি দুর্ঘটনাজনিত সংঘর্ষের বিষয়ে ছিল যা এতটা অস্বাচ্ছন্দ্য যে এটি বিবেচনা করার মতো নয় is আমি মনে করি সাহেদ যা সঠিকভাবে বলতে চেয়েছিলেন যে এটি এখনও একটি আসল সমস্যা নয়। তবে, আপনি ঠিক বলেছেন যে গিট কীভাবে ব্যবহৃত হবে তার উপর নির্ভর করে গুগল সংঘর্ষ আক্রমণ সম্ভবত একটি সুরক্ষা সমস্যা তৈরি করেছে।
অ্যান্ড্রু ডব্লিউ ফিলিপস

এখানে দ্বিতীয় সংঘর্ষ যা কেবলমাত্র 320 বাইট প্রাইভেসিওল.ব্লগস্পট.কম
উইলিয়াম এন্টারিকেন

উত্তর:


735

এই ক্ষেত্রে গিট কীভাবে আচরণ করবে তা জানার জন্য আমি একটি পরীক্ষা করেছি did এটি সংস্করণ 2.7.9 is rc0 + পরের.2015121210 (দেবিয়ান সংস্করণ) সহ। আমি নীচের ডিফের প্রয়োগ করে এবং গিটটি পুনর্নির্মাণের মাধ্যমে মূলত হ্যাশের আকার 160-বিট থেকে 4-বিট এ কমিয়েছি:

--- git-2.7.0~rc0+next.20151210.orig/block-sha1/sha1.c
+++ git-2.7.0~rc0+next.20151210/block-sha1/sha1.c
@@ -246,6 +246,8 @@ void blk_SHA1_Final(unsigned char hashou
    blk_SHA1_Update(ctx, padlen, 8);

    /* Output hash */
-   for (i = 0; i < 5; i++)
-       put_be32(hashout + i * 4, ctx->H[i]);
+   for (i = 0; i < 1; i++)
+       put_be32(hashout + i * 4, (ctx->H[i] & 0xf000000));
+   for (i = 1; i < 5; i++)
+       put_be32(hashout + i * 4, 0);
 }

তারপরে আমি কয়েকটি কমিট করেছি এবং নিম্নলিখিতটি লক্ষ্য করেছি।

  1. যদি একটি ব্লব ইতিমধ্যে একই হ্যাশ সহ উপস্থিত থাকে তবে আপনি কোনও সতর্কতা পাবেন না। সবকিছু ঠিক আছে বলে মনে হচ্ছে, তবে আপনি যখন চাপ দিবেন তখন কেউ ক্লোন করে, বা আপনি প্রত্যাবর্তন করলে আপনি সর্বশেষতম সংস্করণটি হারাবেন (উপরে বর্ণিত বর্ণনার সাথে মিল রেখে)।
  2. যদি কোনও গাছের বস্তু ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি অঙ্কুর তৈরি করেন: যতক্ষণ না আপনি ধাক্কা দেওয়ার চেষ্টা করেন বা কেউ আপনার ভান্ডারটিকে ক্লোন করে না ফেলে যতক্ষণ না সমস্ত কিছু স্বাভাবিক মনে হবে। তারপরে আপনি দেখতে পাবেন যে রেপোটি দুর্নীতিগ্রস্থ।
  3. যদি কোনও প্রতিশ্রুতিবদ্ধ বস্তু ইতিমধ্যে বিদ্যমান থাকে এবং আপনি একই হ্যাশ দিয়ে ব্লব তৈরি করেন: # 2 এর মতো - দুর্নীতিগ্রস্থ
  4. যদি কোনও ব্লব ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি প্রতিশ্রুতিবদ্ধ অবজেক্ট তৈরি করেন তবে "রেফ" আপডেট করার সময় এটি ব্যর্থ হবে।
  5. যদি কোনও ব্লব ইতিমধ্যে বিদ্যমান থাকে এবং আপনি একই হ্যাশ দিয়ে একটি গাছের বস্তু তৈরি করেন। প্রতিশ্রুতি তৈরি করার সময় এটি ব্যর্থ হবে।
  6. যদি কোনও গাছের বস্তু ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি প্রতিশ্রুতিবদ্ধ বস্তু তৈরি করেন তবে "রেফ" আপডেট করার সময় এটি ব্যর্থ হবে।
  7. যদি কোনও গাছের বস্তু ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি ট্রি অবজেক্ট তৈরি করেন তবে সবকিছু ঠিক আছে বলে মনে হবে। আপনি যখন প্রতিশ্রুতিবদ্ধ হন, সমস্ত সংগ্রহস্থল ভুল গাছটিকে উল্লেখ করবে।
  8. যদি কোনও প্রতিশ্রুতিবদ্ধ বস্তু ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি প্রতিশ্রুতিবদ্ধ বস্তু তৈরি করেন তবে সবকিছু ঠিক আছে বলে মনে হবে। কিন্তু আপনি যখন প্রতিশ্রুতিবদ্ধ হন, তখন কমিট কখনই তৈরি হবে না এবং হেড পয়েন্টারটি পুরানো কমিটে সরানো হবে।
  9. যদি কোন কমিট অবজেক্টটি ইতিমধ্যে উপস্থিত থাকে এবং আপনি একই হ্যাশ দিয়ে একটি ট্রি অবজেক্ট তৈরি করেন, কমিট তৈরি করার সময় এটি ব্যর্থ হবে।

# 2 এর জন্য আপনি "গিট পুশ" চালানোর সময় আপনি সাধারণত এ জাতীয় ত্রুটি পাবেন:

error: object 0400000000000000000000000000000000000000 is a tree, not a blob
fatal: bad blob object
error: failed to push some refs to origin

বা:

error: unable to read sha1 file of file.txt (0400000000000000000000000000000000000000)

আপনি যদি ফাইলটি মুছে ফেলেন এবং তারপরে "গিট চেকআউট ফাইল.txt" চালান।

# 4 এবং # 6 এর জন্য আপনি সাধারণত এর মতো একটি ত্রুটি পাবেন:

error: Trying to write non-commit object
f000000000000000000000000000000000000000 to branch refs/heads/master
fatal: cannot update HEAD ref

"গিট কমিট" চালানোর সময়। এই ক্ষেত্রে আপনি সাধারণত "গিট কমিট" টাইপ করতে পারেন কারণ এটি একটি নতুন হ্যাশ তৈরি করবে (পরিবর্তিত টাইমস্ট্যাম্পের কারণে)

# 5 এবং # 9 এর জন্য আপনি সাধারণত এর মতো একটি ত্রুটি পাবেন:

fatal: 1000000000000000000000000000000000000000 is not a valid 'tree' object

"গিট কমিট" চালানোর সময়

যদি কেউ আপনার দুর্নীতিগ্রস্থ সংগ্রহস্থলটিকে ক্লোন করার চেষ্টা করে তবে তারা সাধারণত এমন কিছু দেখতে পাবে:

git clone (one repo with collided blob,
d000000000000000000000000000000000000000 is commit,
f000000000000000000000000000000000000000 is tree)

Cloning into 'clonedversion'...
done.
error: unable to read sha1 file of s (d000000000000000000000000000000000000000)
error: unable to read sha1 file of tullebukk
(f000000000000000000000000000000000000000)
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

আমাকে "উদ্বেগজনক" বিষয়টি হ'ল দুটি ক্ষেত্রে (২,৩) কোনও ধরণের সতর্কতা ছাড়াই ভান্ডারটি দুর্নীতিগ্রস্থ হয়ে যায় এবং ৩ টি ক্ষেত্রে (১,7,৮) সমস্ত কিছু ঠিক আছে বলে মনে হয়, তবে সংগ্রহস্থলের সামগ্রীটি আপনি যা আশা করেন তার থেকে আলাদা হতে। লোকেরা ক্লোনিং বা টানছেন আপনার কাছে যা আছে তার চেয়ে আলাদা সামগ্রী রয়েছে। 4,5,6 এবং 9 টি কেস ঠিক আছে, কারণ এটি একটি ত্রুটি সহ বন্ধ হবে stop আমি মনে করি এটি যদি কমপক্ষে সমস্ত ক্ষেত্রে ত্রুটিযুক্ত হয়ে ব্যর্থ হয় তবে ভাল হয়।


156
দুর্দান্ত উত্তর - হ্যাশের আকার হ্রাস করা এটি আসলে কীভাবে আচরণ করে তা দেখতে একটি দুর্দান্ত ধারণা।
Gnurou

4
@ জেনুরো আমি সম্মত হয়েছি এবং সেই উত্তরটিকে উক্ত সময়ে উড়িয়ে দিয়েছি। এই মামলাগুলি কি গিট মেলিং তালিকায় উল্লেখ করা হয়েছিল?
ভোনসি

1
হ্যাশের আকার হ্রাস না করে বাস্তবে এটি কতটা সম্ভব?
ম্যাথিয়াস Bader

4
এছাড়াও, অন্য কোনও হ্যাশিং অ্যালগরিদমে চলে যাওয়ার পরিকল্পনা থাকলে কী আছে।
পিট

9
পড়তে হবে - লিনাস Torval এর ব্যাখ্যা: plus.google.com/+LinusTorvalds/posts/7tp2gYWQugL
phil_lgr

238

আসল উত্তর (২০১২) ( shattered.ioনীচে 2017 SHA1 সংঘর্ষ দেখুন)

লিনাসের সেই পুরানো (2006) উত্তরটি এখনও প্রাসঙ্গিক হতে পারে:

নাঃ। যদি এটির মতো একই SHA1 থাকে তবে এর অর্থ হ'ল আমরা যখন অন্য প্রান্ত থেকে অবজেক্টটি পাই তখন আমরা ইতিমধ্যে থাকা অবজেক্টটি ওভাররাইট করব না

সুতরাং যা হয় তা হ'ল আমরা যদি কখনও সংঘর্ষ দেখতে পাই তবে কোনও বিশেষ সংগ্রহস্থলের "পূর্ববর্তী" অবজেক্টটি সর্বদা ওভাররাইডিংয়ের সমাপ্ত হয়। তবে মনে রাখবেন যে "পূর্ববর্তী" স্পষ্টতই প্রতি-সংগ্রহস্থল, গিট অবজেক্ট নেটওয়ার্ক এমন একটি ডিএজি উত্পন্ন করে যা পুরোপুরি অর্ডার হয় না, তাই সরাসরি বিভিন্ন বংশের ক্ষেত্রে "পূর্বে" কী তা সম্পর্কে বিভিন্ন সংগ্রহস্থল সম্মত হবে, যদি অবজেক্টটি পৃথকভাবে এবং সরাসরি সম্পর্কিত শাখাগুলির মধ্য দিয়ে এসেছিল, দুটি পৃথক রেপো স্পষ্টতই দুটি বস্তুকে ভিন্ন ক্রমে অর্জিত হতে পারে।

যাইহোক, "পূর্বে ওভাররাইড হবে" আপনি সুরক্ষা দৃষ্টিকোণ থেকে যা চান তা হ'ল: মনে রাখবেন গিট মডেলটি হ'ল আপনার প্রাথমিকভাবে কেবল নিজের সংগ্রহস্থলকে বিশ্বাস করা উচিত ।
সুতরাং আপনি যদি " git pull" করেন তবে নতুন আগত অবজেক্টগুলি আপনার কাছে ইতিমধ্যে থাকা বস্তুর তুলনায় কম বিশ্বাসযোগ্য এবং এরূপে কোনও নতুন অবজেক্টটিকে কোনও পুরানোটিকে প্রতিস্থাপনের অনুমতি দেওয়া ভুল হবে।

সুতরাং আপনার দুটি সংঘর্ষের ঘটনা রয়েছে:

  • অসাবধানী ধরনের , যেখানে আপনি একরকম খুব খুব হতভাগ্য, এবং দুটি ফাইল একই SHA1 এ থাকার শেষ।
    এই মুহুর্তে, যা ঘটে তা হ'ল আপনি যখন সেই ফাইলটি প্রতিশ্রুতিবদ্ধ হন (বা git-update-indexএটিকে সূচকে সরানোর জন্য " " করেন তবে এখনও প্রতিশ্রুতিবদ্ধ হন না), নতুন বিষয়বস্তুর SHA1 গণনা করা হবে তবে যেহেতু এটি একটি পুরানো অবজেক্টের সাথে মেলে, একটি নতুন অবজেক্ট তৈরি করা হবে না, এবং কমিট-বা সূচকটি পুরানো অবজেক্টের দিকে নির্দেশ করে শেষ হবে
    আপনি তাত্ক্ষণিকভাবে লক্ষ্য করবেন না (যেহেতু সূচকটি পুরানো বস্তু SHA1 এর সাথে মিলবে, এবং এর অর্থ " git diff" এর মতো কিছু চেক-আউট অনুলিপি ব্যবহার করবে) তবে আপনি যদি কখনও গাছের স্তরের পার্থক্য করেন (বা আপনি একটি ক্লোন করেন) বা টানুন, বা জোর করে একটি চেকআউট) আপনি হঠাৎ লক্ষ্য করবেন যে ফাইলটি কিছুতে পরিবর্তিত হয়েছেআপনি যা আশা করেছিলেন তার চেয়ে সম্পূর্ণ আলাদা different
    সুতরাং আপনি সাধারনত এই ধরণের সংঘর্ষটি লক্ষ্য করবেন notice
    সম্পর্কিত খবরে, প্রশ্নটি হচ্ছে অজান্তেই সংঘর্ষের বিষয়ে কী করা উচিত ..
    প্রথমে, আমাকে লোকজনকে মনে করিয়ে দেওয়া যাক যে অজান্তে ধরণের সংঘর্ষ সত্যিই সত্যিই খুব খারাপ সম্ভাবনা, তাই আমরা সম্ভবত পুরো ইতিহাসে এটি কখনই দেখব না মহাবিশ্বের।
    তবে যদি এটি ঘটে তবে এটি বিশ্বের শেষ নয়: আপনি যা করতে পারেন তা হল সামান্য সংঘর্ষের ফাইলটি পরিবর্তন করা এবং পরিবর্তিত সামগ্রীগুলির সাথে একটি নতুন প্রতিশ্রুতিবদ্ধকরণ বাধ্য করুন (" /* This line added to avoid collision */" মন্তব্য করে একটি মন্তব্য যুক্ত করুন ) এবং তারপরে ম্যাজিক SHA1 সম্পর্কে গিট শিখুন যা বিপজ্জনক বলে দেখানো হয়েছে।
    সুতরাং কয়েক মিলিয়ন বছর ধরে, সম্ভবত আমাদের গিটে এক বা দুটি "বিষযুক্ত" SHA1 মান যুক্ত করতে হবে। এটি রক্ষণাবেক্ষণের সমস্যা হতে পারে না;)

  • সংঘর্ষের আক্রমণকারী ধরনের কারণ কোনো ব্যক্তি কপর্দকশূন্য (অথবা নরপশু-বাধ্য) SHA1 এ।
    এটি অজ্ঞাতসারে ধরণের চেয়ে স্পষ্টতই অনেক বেশি, তবে সংজ্ঞা অনুসারে এটি সর্বদা একটি "দূরবর্তী" সংগ্রহস্থল। যদি আক্রমণকারীটির স্থানীয় ভান্ডারগুলিতে অ্যাক্সেস থাকে, তবে তিনি আপনাকে ফাঁকি দেওয়ার জন্য আরও সহজ উপায় থাকতে পারতেন।
    সুতরাং এই ক্ষেত্রে, সংঘর্ষ সম্পূর্ণরূপে একটি ইস্যু নয় : আপনি একটি "খারাপ" ভান্ডার পাবেন যা আক্রমণকারীর উদ্দেশ্য থেকে পৃথক, তবে যেহেতু আপনি আসলে তার সংঘর্ষক বস্তুটি কখনই ব্যবহার করবেন না, এটি আক্ষরিক থেকে আলাদা নয় the আক্রমণকারী মোটেই সংঘর্ষের মুখোমুখি হয় নি, কিন্তু কেবল আপনার ইতিমধ্যে উপস্থিত বস্তুটি ব্যবহার করে (অর্থাত্ এটি একই SHA1 উত্পন্ন ফাইলের "তুচ্ছ" সংঘর্ষের 100% সমতুল্য)।

রয়েছে SHA-256 ব্যবহার প্রশ্নে নিয়মিতভাবে উল্লেখ করা হয়, কিন্তু এখন (2012) জন্য উপর আমল।
দ্রষ্টব্য: 2018 এবং গিট 2.19 থেকে শুরু করে কোডটি SHA-256 ব্যবহারের জন্য পুনঃসমাচারিত হচ্ছে।


নোট (হাস্যরস): আপনি যদি একটি একটি নির্দিষ্ট SHA1 এ কমিট জোর করতে পারেন উপসর্গ , প্রকল্পের সঙ্গে gitbrute থেকে ব্র্যাড ফিত্জপ্যাট্রিক ( bradfitz)

গিটব্রুট ব্রুট এক জোড়া লেখককে বাধ্য করে + কমিটর টাইমস্ট্যাম্পগুলি এমন করে যে ফলস্বরূপ গিট কমিট আপনার পছন্দসই উপসর্গ রাখে।

উদাহরণ: https://github.com/bradfitz/deadbeef


ড্যানিয়েল Dinnyes তুলে ধরে মন্তব্য করার জন্য 7.1 গীত সরঞ্জামগুলি - পরিবর্ধন ও পরিবর্তন তালিকা নির্বাচন , যা রয়েছে:

একটি উচ্চ সম্ভাবনা বিদ্যমান যে আপনার প্রোগ্রামিং দলের প্রতিটি সদস্য একই রাতে সম্পর্কযুক্ত ঘটনায় নেকড়েদের দ্বারা আক্রমণ ও হত্যা করা হবে।


এমনকি অতি সাম্প্রতিক (ফেব্রুয়ারী 2017) shattered.ioএকটি SHA1 সংঘর্ষ জালিয়াতির সম্ভাবনা প্রদর্শন করেছিল:
( লিনাস টোরভাল্ডসের Google+ পোস্ট সহ আমার পৃথক উত্তরে আরও দেখুন )

আরও জন্য ভ্যালারি আনিতা অরোরার " লাইফটাইমস ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন " দেখুন। সেই পৃষ্ঠাতে, তিনি নোট করেছেন:

সুরক্ষা সমালোচনামূলক অ্যাপ্লিকেশনগুলির জন্য SHA-1 ব্যবহার বন্ধ করা আমাদের প্রত্যেককে বোঝাতে গুগল 6500 সিপিইউ বছর এবং 110 জিপিইউ বছর অতিবাহিত করেছে।
কারণ এটি দুর্দান্ত ছিল

নীচে আমার পৃথক উত্তর আরও দেখুন


25
মোচড়: এখনও যোগ করার পরেও একই হ্যাশ /* This line added to avoid collision */: ডি আপনি দুবার লটারি জিততে পারেন: পি
জানুস ট্রয়লসন

4
@ জনুস ট্রেলসন নিশ্চিত, তবে এটি এখনও লটারি, তাই না? ;) ( SHA1 সম্পর্কে এই সংক্ষিপ্ত নোটে উল্লিখিত হিসাবে )
ভোনসি

6
@ ভনসি সেই রেফারেন্স সম্পর্কিত : একটি বিশ্বব্যাপী ওয়েয়ারল্ফ মহামারীর এক বিস্ফোরণ - সমস্ত মানবতাকে নিশ্চিহ্ন করে দিয়েছে এবং একই রাতে আমার সমস্ত বিকাশকারীকে ভৌগোলিকভাবে বিতরণ করা সত্ত্বেও - ভৌগোলিকভাবে বিতরণ করা হয়েছিল - এটি একটি সম্পর্কহীন ঘটনা হিসাবে বিবেচনা করা হয়েছিল ?? অবশ্যই, ধরে নিলাম এটি একটি পূর্ণিমাতে হয়েছে, স্পষ্টতই। এখন, এই জাতীয় পরিস্থিতি বদলে দেবে। এমনকি এ নিয়ে ভাবনাও উন্মাদনা! এটি সম্ভাবনার সম্পূর্ণ ভিন্ন স্কেল! এর অর্থ হ'ল
ড্যানিয়েল ডিনিজ

2
নোট করুন যে গিটব্রুট নির্দিষ্ট SHA1 কে জোর করে না তবে কেবলমাত্র একটি উপসর্গ (অর্থাত্ পুরো SHA1 এর একটি উপ-বিভাগ)। একটি সম্পূর্ণ SHA1 (অর্থাত্ কীটির সম্পূর্ণ দৈর্ঘ্যের একটি উপসর্গ সহ) জোর করাতে সম্ভবত "খুব দীর্ঘ" লাগবে।
এমবি 14

2
@ জানুস ট্রেলসন তারপরে আপনি যুক্ত করুন:/* This line added to avoid collision of the avoid collision line */
স্মাগ

42

প্রো গিট অনুসারে :

যদি আপনি কোনও ভাণ্ডার আপনার পূর্ববর্তী অবজেক্টের মতো একই SHA-1 মানের সাথে সংঘটিত করতে প্রতিশ্রুতিবদ্ধ হন তবে গিটটি ইতিমধ্যে আপনার গিট ডাটাবেসে আগের বস্তুটি দেখতে পাবে এবং ধরে নেবে যে এটি ইতিমধ্যে লিখিত ছিল। আপনি যদি কোনও সময়ে সেই অবজেক্টটি আবার চেষ্টা করার চেষ্টা করেন, আপনি সর্বদা প্রথম অবজেক্টের ডেটা পাবেন।

সুতরাং এটি ব্যর্থ হবে না, তবে এটি আপনার নতুন বস্তুকেও সংরক্ষণ করবে না।
কমান্ড লাইনে এটি কীভাবে দেখবে আমি জানি না, তবে এটি অবশ্যই বিভ্রান্তিকর হবে।

আরও কিছুটা নিচে, একই উল্লেখটি এ জাতীয় সংঘর্ষের সম্ভাবনাময় চিত্রটি দেখানোর চেষ্টা করেছে:

SHA-1 সংঘর্ষ পেতে এটি কী গ্রহণ করবে সে সম্পর্কে আপনাকে ধারণা দেওয়ার জন্য এখানে একটি উদাহরণ রয়েছে। পৃথিবীর সমস্ত .5.৫ বিলিয়ন মানুষ যদি প্রোগ্রামিং করে থাকেন এবং প্রতি সেকেন্ডে, প্রত্যেকে এমন একটি কোড তৈরি করে যা পুরো লিনাক্স কার্নেল ইতিহাসের (1 মিলিয়ন গিট অবজেক্ট) সমতুল্য ছিল এবং এটিকে একটি বিশাল গিট সংগ্রহস্থলে ঠেলাঠেলি করতে 5 বছর সময় লাগবে সেই সংগ্রহস্থলে একক SHA-1 অবজেক্টের সংঘর্ষের 50% সম্ভাবনা থাকার জন্য পর্যাপ্ত অবজেক্ট রয়েছে। একটি উচ্চ সম্ভাবনা বিদ্যমান যে আপনার প্রোগ্রামিং দলের প্রতিটি সদস্য একই রাতে সম্পর্কযুক্ত ঘটনায় নেকড়েদের দ্বারা আক্রমণ ও হত্যা করা হবে।


44
আমি শেষ বাক্যটিতে সংখ্যাগুলির উত্সটি দেখতে চাই ;-)
জোচিম সৌর

17
@Jasper: যে লিঙ্ক ভাল ডকুমেন্টেশন, কিন্তু এটা করে না একটি দল প্রতিটি সদস্য সম্ভাবনা পরিসংখ্যান ধারণ একই রাতে সম্পর্কহীন ঘটনায় হামলা ও নেকড়ে হত্যা করা হচ্ছে।
জোছিম সৌর

5
@ জ্যাস্পার: আচ্ছা, আমি এটি যেভাবে পড়েছি, পাঠ্যটি আক্ষরিকভাবে দাবি করেছে যে একই রাতে নেকড়েদের দ্বারা killed.৫ বিলিয়ন দলের সদস্য নিহত হওয়ার সম্ভাবনা ৫০% এর চেয়ে বেশি is কিন্তু আমার তার বক্তব্য প্রধান আপত্তি যে এই ধরনের একটি ঘটনা হবে আছে করার একটি বিশ্বব্যাপী প্রপঞ্চ হতে; এটা ধারণাতীত যে এই কারণে ঘটতে পারে সম্পর্কহীন ঘটনা। ;)
কিথ রবার্টসন

5
@ কিথরবার্টসন আমি নিশ্চিত যে পোস্টটি আপনার সমস্ত প্রকৃত দলের সদস্যদের হ্যাশের সংঘর্ষের সম্ভাবনার তুলনায় খাওয়ার সম্ভাবনা নিয়ে কথা বলছে যদি বিশ্বের সবাই যদি এই পরিস্থিতিতে যে সময় লাগে তার সাথে সাথে পাগল পরিমাণে কোড তৈরি করে থাকে একটি সংঘর্ষের 50% সুযোগে পৌঁছান (যেমন নেকড়েদের ঘটনা পুরো বিশ্বকে জড়িত না এবং 50% নেকড়ে থেকে পৃথক ছিল)। আপনি পয়েন্টটি পেয়েছেন যদিও, যদি এই জাতীয় ঘটনাটি অকল্পনীয় হয়, তবে গিট হ্যাশের সংঘর্ষ হওয়া উচিত। (অবশ্যই, এর মধ্যে একটি (প্রায়) নিখুঁতভাবে সুযোগ ভিত্তিক এবং অন্যটি তা নয়, তবে এখনও))
জ্যাস্পার


23

২০১২ সাল থেকে আমার পূর্ববর্তী উত্তরটি যুক্ত করার জন্য , এখন রয়েছে (ফেব্রুয়ারী 2017, পাঁচ বছর পরে) বিপর্যস্ত.ওর সাথে প্রকৃত SHA-1 সংঘর্ষের একটি উদাহরণ , যেখানে আপনি দুটি সংঘর্ষ পিডিএফ ফাইল নকল করতে পারেন: এটি একটি SHA- প্রথম পিডিএফ ফাইলে 1 ডিজিটাল স্বাক্ষর যা দ্বিতীয় পিডিএফ ফাইলটিতে বৈধ স্বাক্ষর হিসাবেও আপত্তিজনক হতে পারে।
এছাড়াও " বছরের পর বছর মৃত্যুর দ্বারে, বহুল ব্যবহৃত SHA1 ফাংশনটি এখন মারা গেছে " এবং এই চিত্রণটিও দেখুন

ফেব্রুয়ারির 26 তারিখ আপডেট করুন: লিনাস একটি Google+ পোস্টে নিম্নলিখিত বিষয়গুলি নিশ্চিত করেছেন :

(1) প্রথম বন্ধ - আকাশ পড়ছে না। সুরক্ষা স্বাক্ষর করার মতো জিনিসের জন্য ক্রিপ্টোগ্রাফিক হ্যাশ ব্যবহার করা এবং গিটের মতো বিষয়বস্তু-ঠিকানাযোগ্য সিস্টেমের জন্য একটি "সামগ্রী সনাক্তকারী" তৈরি করার জন্য একটি ব্যবহার করার মধ্যে একটি বড় পার্থক্য রয়েছে।

(২) দ্বিতীয়ত, এই বিশেষ SHA1 আক্রমণটির প্রকৃতির অর্থ হ'ল এটির বিরুদ্ধে প্রশমন করা খুব সহজ এবং ইতিমধ্যে দু'দিক প্যাচগুলি এই প্রশমনের জন্য পোস্ট করা হয়েছে।

(3) এবং অবশেষে, আসলে অন্য কিছু হ্যাশগুলিতে যুক্তিসঙ্গতভাবে সরল রূপান্তর রয়েছে যা বিশ্বকে ভাঙবে না - এমনকি পুরাতন গিট সংগ্রহস্থলগুলি it

এই রূপান্তরটি সম্পর্কে, Q1 2018 গিট 2.16 দেখুন হ্যাশ অ্যালগরিদমের প্রতিনিধিত্বকারী একটি কাঠামো যুক্ত করে। সেই রূপান্তরটির বাস্তবায়ন শুরু হয়েছে।

গিট 2.19 (Q3 2018) শুরু করে , গিট SHA-256 কে নিউহ্যাশ হিসাবে বেছে নিয়েছে এবং কোডে এটি সংহত করার প্রক্রিয়াতে রয়েছে (যার অর্থ SHA1 এখনও ডিফল্ট (Q2 2019, গিট 2.21) তবে SHA2 এর উত্তরসূরি হবে)


আসল উত্তর (25 ফেব্রুয়ারী) তবে:

জোয়ি হেস ঐ পিডিএফ চেষ্টা করে একটি গীত রেপো এবং তিনি দেখেন :

এতে একই SHA এবং আকার সহ দুটি ফাইল অন্তর্ভুক্ত রয়েছে, যা গিটটি যেভাবে শিরোনামটিকে সামগ্রীতে প্রেরণ করে তা বিভিন্ন ব্লবকে ধন্যবাদ জানায়।

joey@darkstar:~/tmp/supercollider>sha1sum  bad.pdf good.pdf 
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a  bad.pdf
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a  good.pdf
joey@darkstar:~/tmp/supercollider>git ls-tree HEAD
100644 blob ca44e9913faf08d625346205e228e2265dd12b65    bad.pdf
100644 blob 5f90b67523865ad5b1391cb4a1c010d541c816c1    good.pdf

এই সংঘর্ষকারী ফাইলগুলিতে অভিন্ন তথ্য সংযোজন করা অন্যান্য সংঘর্ষগুলি উত্পন্ন করে, প্রিপেন্ডিং ডেটা দেয় না।

সুতরাং আক্রমণটির প্রধান ভেক্টর (প্রতিশ্রুতি জাল করে) হ'ল :

  • একটি নিয়মিত কমিট অবজেক্ট তৈরি করুন;
  • পুরো কমিট অবজেক্ট + NUL বেছে নেওয়া উপসর্গ হিসাবে ব্যবহার করুন এবং
  • সংঘর্ষকারী ভাল / খারাপ বস্তু উত্পন্ন করতে অভিন্ন-উপসর্গের সংঘর্ষ আক্রমণ ব্যবহার করুন।
  • ... এবং এটি অকেজো কারণ ভাল এবং খারাপ প্রতিশ্রুতিবদ্ধ বস্তুগুলি এখনও একই গাছের দিকে নির্দেশ করে!

এছাড়াও, আপনি ইতিমধ্যে প্রতিটি ফাইলের সাথে থাকা SHA-1 এর সাথে ক্রিপটানালেটিসের সংঘর্ষের আক্রমণগুলি সনাক্ত করতে পারেন cr-marcstevens/sha1collisiondetection

গিটে নিজেই অনুরূপ চেক যুক্ত করার জন্য কিছু গণনা ব্যয় হবে

হ্যাশ পরিবর্তন করার বিষয়ে, লিনাক্স মন্তব্য করেছে :

হ্যাশের আকার এবং হ্যাশ অ্যালগরিদমের পছন্দ স্বাধীন সমস্যা।
আপনি সম্ভবত যা করতে চান তা হ'ল 256-বিট হ্যাশে স্যুইচ করুন, এটি অভ্যন্তরীণভাবে এবং নেটিভ গিট ডাটাবেসে ব্যবহার করুন এবং তারপরে ডিফল্টরূপে কেবল হ্যাশটিকে 40-অক্ষরের হেক্স স্ট্রিং হিসাবে দেখান (এ জাতীয় ধরণের কীভাবে আমরা ইতিমধ্যে সংক্ষিপ্ত বিবরণ দিই অনেক পরিস্থিতিতে)।
কিছু বিশেষ --full-hashআর্গুমেন্ট (বা " --abbrev=64" বা যাই হোক না কেন - পূর্বনির্ধারিতটি যা আমরা সংক্ষিপ্তসার হিসাবে সংক্ষিপ্ত করি) গিটের চারপাশের সরঞ্জামগুলি এমনকি পরিবর্তনটি দেখতে পায় না ।

তবুও, একটি রূপান্তর পরিকল্পনা (এসএইএ 1 থেকে অন্য হ্যাশ ফাংশনে) এখনও জটিল হতে পারে তবে সক্রিয়ভাবে অধ্যয়ন করা হয়েছে।
একটি convert-to-object_idপ্রচারণা হয় প্রগতিতে :


20 শে মার্চ আপডেট করুন: গিটহাব একটি সম্ভাব্য আক্রমণ এবং এর সুরক্ষা সম্পর্কে বিস্তারিত জানায় :

SHA-1 নামগুলি বিভিন্ন প্রক্রিয়াটির মাধ্যমে বিশ্বাস অর্পণ করা যায়। উদাহরণস্বরূপ, গিট আপনাকে ক্রিপ্টোগ্রাফিকভাবে একটি কমিট বা ট্যাগ সাইন করতে দেয়। এটি করার ফলে কেবল প্রতিশ্রুতিবদ্ধ বা ট্যাগ অবজেক্টটিই স্বাক্ষর করে, যা তাদের SHA-1 নাম ব্যবহার করে প্রকৃত ফাইল ডেটা সম্বলিত অন্যান্য বস্তুগুলিকে নির্দেশ করে। এই অবজেক্টগুলির মধ্যে একটি সংঘর্ষ এমন একটি স্বাক্ষর তৈরি করতে পারে যা বৈধ বলে মনে হয়, তবে যা স্বাক্ষরকারীর ইচ্ছার চেয়ে আলাদা ডেটাতে নির্দেশ করে। এই ধরনের আক্রমণে স্বাক্ষরকারী কেবলমাত্র অর্ধেক সংঘর্ষ দেখেন এবং শিকারটি অন্য অর্ধেকটি দেখেন।

সুরক্ষা:

সাম্প্রতিক আক্রমণটি SHA-1 অ্যালগরিদমের দুর্বলতাগুলি কাজে লাগাতে বিশেষ কৌশলগুলি ব্যবহার করে যা খুব কম সময়ে সংঘর্ষের সন্ধান করে। এই কৌশলগুলি বাইটগুলিতে একটি প্যাটার্ন রেখে দেয় যা কোনও সংঘর্ষের জুটির অর্ধেকের মধ্যে SHA-1 গণনা করার সময় সনাক্ত করা যায়।

গিটহাব ডট কম এখন প্রতিটি এসএএএএ -১ এটি গণনা করে এটি সনাক্ত করে এবং যদি বস্তুটি একটি সংঘটিত জোড়ের অর্ধেক প্রমাণ থাকে তবে তার প্রমাণ পাওয়া গেলে অপারেশনটি বাতিল করে দেয়। এটি আক্রমণকারীদের গিটহাব ব্যবহার করে কোনও প্রকল্পকে তাদের "নিরপরাধ" অর্ধেক সংঘর্ষের স্বীকার করার জন্য, পাশাপাশি তাদের দূষিত অর্ধেকের হোস্টিং থেকে বাধা দেওয়ার প্রতিরোধ করতে বাধা দেয়।

মার্ক স্টিভেন্সsha1collisiondetection দ্বারা " " দেখুন


আবার, Q1 2018 গিট 2.16 হ্যাশ অ্যালগরিদমকে উপস্থাপন করে এমন একটি কাঠামো যুক্ত করে, একটি নতুন হ্যাশে স্থানান্তরিতকরণের কাজ শুরু হয়েছে।
উপরে উল্লিখিত হিসাবে, নতুন সমর্থিত হ্যাশ SHA-256 হবে


সংঘর্ষ: ১. চেষ্টা ছিল একটি সংঘর্ষ তৈরি করার, কোনওটি কাকতালীয়ভাবে ঘটেনি। ২. পিডিএফ প্রতিবেদন থেকে: মোট ব্যয় করা গণনার প্রচেষ্টা 2 ^ 63.1 SHA-1 সংকোচনের সমান এবং প্রায় 6,500 সিপিইউ বছর এবং 100 জিপিইউ বছর সময় নিয়েছে৩. যদিও আমাদের MD5 এবং SHA-1 থেকে অগ্রসর হওয়া উচিত ফাইল অনন্য ব্যবহারের জন্য সাধারণত জরিমানা।
zaph

এটি লক্ষণীয় যে ওয়েবকিট একটি পরীক্ষার জন্য সংঘর্ষকৃত পিডিএফগুলিতে চেক করেছে। এটি তাদের গিট- এসএনএন
শো_বগ.সি

1
@ ডাহলবিইক এটি সত্যই লক্ষ করার মতো ... এটি আমি উত্তরে উল্লেখ করেছি ( git-svnপরোক্ষভাবে যদিও "এটির কিছু সমস্যা আছে" এর পিছনে লিঙ্কটি উল্লেখ করেছে)
ভনসি

1
@ Mr_and_Mrs_D না এটি কোনও ত্রুটি দিয়ে এখনও ব্যর্থ হয় না। একটি বড় প্যাচ চলছে যা এরপরে সেই সংঘর্ষ সনাক্তকরণের সুবিধার্থে সহায়তা করবে: marc.info/?l=git&m=148987267504882&w=2
ভোনসি

1
মধ্যে @Mr_and_Mrs_D দেখতে সম্পাদন করা 4 stackoverflow.com/posts/42450327/revisions : এটা এখন অন্তত যখন GitHub থেকে upshed ব্যর্থ হয় তা।
ভোনসি

6

আমি মনে করি ক্রিপ্টোগ্রাফাররা উদযাপন করবে।

SHA-1-তে উইকিপিডিয়া নিবন্ধের উদ্ধৃতি :

ফেব্রুয়ারী 2005 সালে, জিয়াওউন ওয়াং, ইয়েকুন লিসা ইয়িন এবং হংকবো ইউ দ্বারা আক্রমণ চালানোর ঘোষণা দেওয়া হয়েছিল। আক্রমণগুলি SHA-1 এর সম্পূর্ণ সংস্করণে সংঘর্ষের সন্ধান করতে পারে, যার জন্য 2 ^ 69 এরও কম অপারেশন প্রয়োজন। (একটি নিষ্ঠুর বাহিনীর অনুসন্ধানে 2 ^ 80 অপারেশন প্রয়োজন হবে))


7
মুল বক্তব্যটি হ'ল এসএএএএ 1 তে একটি ত্রুটি পাওয়া গেছে এবং এটি সেই সময়ের কথা ছিল যখন গিট পরিচয় করানো হচ্ছিল। এছাড়াও, সম্ভাবনা অ-রৈখিক। পঞ্চাশ বছর ধরে আপনি লটারি খেলার অর্থ এই নয় যে আপনার জয়ের উচ্চতর সুযোগ রয়েছে। আপনার প্রতি একক সময় একই সুযোগ রয়েছে। প্রথমবারের মতো খেলতে আসা ব্যক্তিটি এখনও জিততে পারে।
0xC0000022L

এটি কেবলমাত্র আক্রমণই যা সংঘর্ষের সন্ধান করে, যার অর্থ আপনি yযে h(x) == এইচ (ওয়াই) খুঁজে পেতে পারেন SSL যা এসএসএল শংসাপত্রের মতো স্বেচ্ছাসেবী তথ্যের জন্য মারাত্মক হুমকি তবে এটি গিটকে প্রভাবিত করে না যা দ্বিতীয় প্রাক-চিত্র আক্রমণে ঝুঁকিপূর্ণ হবে যার অর্থ বার্তা থাকার xআপনি বার্তা করার জন্য প্রয়োজনীয় পরিবর্তনগুলি x'যে h(x) == h(x')। সুতরাং এই আক্রমণ গিটকে দুর্বল করে না। সুরক্ষার কারণে গিট SHA-1 পছন্দ করেন নি।
হাউলেথ

এখন একটি সংঘর্ষের সন্ধান পাওয়া গেছে - সরাসরি এখনও গিটকে বিরক্ত করে এমন একটি নয়। স্ট্যাকওভারফ্লো.com
উইলেম হেনজেভেল্ড

2 ^ 69 প্রায় 600 এক্স-অপারেশন। আট বছর পরে, এনভিডিয়া'র শ্যাটার্নভি সুপার কম্পিউটারগুলি তাদের এ 100 এর সাথে আপগ্রেড করা 4.6 এক্সোপিএস করতে পারে, সুতরাং এটি সম্ভবত 2 মিনিটের বেশি সময় এটি সমাধান করতে পারে, বা কয়েক দিনের মধ্যে একটি জবরদস্তি আক্রমণ করতে পারে।
কিডিন

6

এসএএএএ -১ এর মতো হ্যাশগুলির জন্য বিভিন্ন পৃথক আক্রমণ মডেল রয়েছে, তবে সাধারণত আলোচিত একটি হ'ল মার্ক স্টিভেন্সের হ্যাশক্ল্যাশ সরঞ্জাম সহ সংঘর্ষ অনুসন্ধান ।

"২০১২ সাল অবধি, এসএএএ -১-এর বিরুদ্ধে সর্বাধিক দক্ষ আক্রমণাকে মার্ক স্টিভেনস [৩৪] দ্বারা একটি হিসাবে বিবেচনা করা হয়েছে, যেখানে ক্লাউড সার্ভার থেকে সিপিইউ পাওয়ার ভাড়া দিয়ে একক হ্যাশ মান ভাঙতে আনুমানিক $ 2.77M ব্যয় হয়েছে।"

ভাবী যেমন উল্লেখ করেছেন, আপনি গিটের সাথে হ্যাশের সংঘর্ষকে জোর করতে পারেন, তবে এটি করার ফলে বিদ্যমান বস্তুগুলিকে অন্য কোনও সংগ্রহস্থলে ওভাররাইট করা যাবে না। আমি কল্পনাও করতে পারি git push -f --no-thinযে বিদ্যমান বস্তুগুলি ওভাররাইট করা হবে না তবে 100% নিশ্চিত নয়।

তাই বলা হয়, যদি আপনি দূরবর্তী কোন সংগ্রহস্থলের মধ্যে হ্যাক তারপর আপনি আপনার মিথ্যা বস্তুর পুরোনো এক বানাতে পারে সেখানে সম্ভবত GitHub বা অনুরূপ উপর একটি ওপেন সোর্স প্রকল্প হ্যাক কোডটিকে এম্বেড করার। আপনি যদি সাবধান হন তবে সম্ভবত আপনি নতুন ব্যবহারকারীরা ডাউনলোড করা একটি হ্যাক সংস্করণ প্রবর্তন করতে পারেন।

তবে আমি সন্দেহ করি যে প্রকল্পের বিকাশকারীরা করতে পারে এমন অনেকগুলি কাজই বহুমূলকভাবে আপনার মাল্টি-মিলিয়ন ডলার হ্যাকটিকে প্রকাশ বা ধ্বংস করতে পারে। বিশেষত, ড্রেনের নিচে এটি প্রচুর পরিমাণে অর্থ যদি কোনও বিকাশকারী, যাকে আপনি হ্যাক করেননি git push --no-thin, কখনও কখনও প্রভাবিত ফাইলগুলিকে সংশোধন করার পরে উপরে বর্ণিতভাবে চালিত করে , এমনকি কখনও কখনও --no-thinনির্ভর করেও ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.