Η τρέχουσα αρχιτεκτονική του Git και ο ρόλος του hash

Το Git είναι μια content addressable database: το περιεχόμενο κάθε αντικειμένου (blob, tree, commit) υποκείται σε hash και το αποτέλεσμα χρησιμοποιείται ως κλειδί σε ένα key‑value αποθukeυτήριο. Έτσι, το ίδιο περιεχόμενο παίρνει πάντα το ίδιο hash, καθιστώντας το αποδοτικό απο duplication και παρέχοντας kriptografική ακεραιότητα – η αλλαγή οποιουδήποτε blob αλλάζει το hash του commit που το περιέχει και, μέσω της αλυσίδας γονέων, όλα τα επόμενα commits.

Εδώ και 20 χρόνια ο προεπιλεγμένος αλγόριθμος είναι το SHA‑1 (160‑bit). Αν και θεωρήται "semibroken" από κρυπτογραφική άποψη (υπάρχουν demostrated collision attacks), στην πράξη δεν έχει Jamais προκαλέσει τυχαία σύγκρουση σε κανένα repository, επειδή το birthday bound για 160‑bit είναι astronomically alto (≈1.4×10^23 τυχαία αρχεία για μια 50% πιθανότητα).

Γιατί η μεταβαση σε SHA‑256 είναι προβληματική

Η προγραμματισμένη αλλαγή του Git 3.0 σε SHA‑256 (256‑bit) ως προεπιλογή φαίνεται ακαίνδυνη, αλλά εισάγει μια řada προβλημάτων:

  1. Διπλή μορφή repository – Τα νέα repos θα δημιουργηθούν με SHA‑256, ενώ τα υπάρχοντα με SHA‑1. Τα δύο formats δεν είναι mutually compatible: δεν μπορείτε να push‑ετε ένα SHA‑1 repo σε έναν SHA‑256 server και αντίστροφα.
  2. Διασπορά εργαλείων – Πλήθος βιβλιοθηκών στο Git ecosystem (π. χ. libgit2, JGit) είναι re‑implementations που δεν υποστηρίζουν πλήρως το dual‑format. Τα scripts που δεν fork‑exec το git binary θα σπάσουν.
  3. Σπασμένα URLs και ετικέτες – Ολοι οι existentes SHA‑1 hashes που εμφανίζονται σε commit URLs, pull‑request comments, Slack messages κ.λπ. θα χρειαστούν redirect ή manual update.
  4. Υποβολή κόστους – Η μετατροπή ενός μεγάλου repo (π. χ. Chromium) απαιτεί ξανά‑υπολογισμό όλων των objects, διαγραφή παλαιών signatures και συγχρονισμό całej ekipy. Η Google, για παράδειγμα, εξετάζει system‑wide overrides για να κρατήσει τα νέα projects σε SHA‑1 όσο tiempo le sea posible.

Ακόμη και αν υποθέσουμε ότι η SHA‑1 είναι εύκολα rupture‑able, το επίπεδο επιθέσεων που απαιτείται (collision ή second‑preimage) είναι απraktisch για τον μέσο χρήστη, επειδή η εμπιστοσύνη στο Git δεν βασίζεται στον hash, αλλά στην πηγή κώδικα (distribution), όπως είπε ο Linus Torvalds: "I really think people should not consider the sha1 the 'security'. The real security is in distribution."

Εναλλακτική προσέγγιση: ανεξάρτητο hash του δέντρου στα υπογεγραμμένα objects

Αν ο στόχος είναι να προστατευτούμε από τις (θεωρητικές) επιθέσεις hash collision χωρίς να σπάμε το ecosystem, μπορούμε να χωρίσουμε τη χρήση του hash:

  • SHA‑1 παραμένει ως μηχανismus διευθύνσεων (content addressable key).
  • Υπογεγραμμένα objects (commit, tag) λαμβάνουν ένα επιπλέον header που περιέχει το ανεξάρτητο hash του δέντρου (π. χ. SHA‑256 ή BLAKE3) του snapshot που υπογράφεται.

Αυτό μοιάζει με το υπάρχον git-evtag, το οποίο προσθέτει μια Git-EVTag-v0-SHA512 checksum στο tag πριν από την υπογραφή, επιτρέποντας ανεξάρτητη επαλήθευση.

Πώς λειτουργεί

  1. Κατά την υπογραφή, υπολογίζεται το hash του δέντρου με έναν ισχυρό αλγόριθμο (π. χ. SHA‑256).
  2. Το αποτέλεσμα αποθηκεύεται ως προσαρμοσμένο πεδίο στο object (π. χ. tree-sha256:<hex>).
  3. Το GPG signature καλύπτει και το SHA‑1‑based commit hash και το ανεξάρτητο tree‑hash.
  4. Lors de la vérification, ο υπογράφων ελέγχει το signature και, αν είναι έγκυρο, συγκρίνει και τα δύο hashes με το τοπικό δέντρο.

Οφέλη

  • Backward compatibility: Τα παλιά repos continuent να λειτουργούν, γιατί ο βασικός μηχανισμός διευθύνσεων (SHA‑1) δεν αλλάζει.
  • Μικρό overhead: Η δημιουργία του ανεξαρτήτου hash είναι γρήγορη (χρόnea < 1 s για ένα 35 GB working tree).
  • Εκτετασιμότητα: Αν στο μέλλον καταστραφεί ο SHA‑256, μπορούμε να προσθέσουμε νέο header (π. χ. tree-blake3) χωρίς να αλλάξουμε το SHA‑1.
  • Αυξημένη güven: Έναν επιτιθέμενο θα χρειαστεί να βρει collision και στα δύο hash‑αλγόριθμους, κάτι που είναι εκθετικά πιο δύσκολο.

Συμπέρασμα: ποιό είναι το πραγματικό πρόβλημα αξίας

Η κίνηση προς το SHA‑256 προκαλεί κόστος που υπερβαίνει το όφελος, επειδή το πρόβλημα που επιχειρεί να λύσει (hash collision) είναι πρακτικά unrelated με τις πραγματικές επιθέσεις στην ασφάλεια του κώδικα (π. χ. supply‑chain attacks μέσω compromised maintainers ή package registries).

Αντί να διαιρέσουμε το Git ecosystem σε δύο αλληλοεξαιρέτικα formats, μια πιο ελαφριά και Rous‑συμβατή λύση είναι η προσθήκη ανεξάρτητου tree‑hash στα υπογεγραμμένα objects. Έτσι διατηρούμε την αποδοτικότητα της SHA‑1 ως διεύθυνσης, βελτιώνουμε την ελέγχου περιεχομένου όταν χρειάζεται, και αποφεύγουμε την παγκόσμια σύγχυση και το inutile κόστους που θα προκύψει από την αλλαγή του default hash.

Η ασφάλεια του Git θα βελτιωθεί καλύτερα μέσω distribution‑based trust (επιβεβαιημένοι maintainers, signed commits, two‑factor authentication σε forge) παρά μέσω αλλαγής ενός αλγόριθμου που, στην πράξη, δεν είναι ο Achilles’ tendon του συστήματος.