Αρχεία release: αναπαραγωγιμότητα, hashes και ασφαλής εξαγωγή — DedSec Project
Ένα ZIP που δημιουργήθηκε δεν είναι απαραίτητα σωστό release Καθόρισε ποια αρχεία αποτελούν την έκδοση Κράτησε ακριβές source revision, license, εκδόσεις dependencies…
Ένα ZIP που δημιουργήθηκε δεν είναι απαραίτητα σωστό release
Καθόρισε ποια αρχεία αποτελούν την έκδοση
Κράτησε ακριβές source revision, license, εκδόσεις dependencies, λειτουργικό/αρχιτεκτονική και τη διαδικασία packaging. Χρησιμοποίησε ρητή λίστα επιτρεπόμενων αρχείων αντί να συμπεριλάβεις ολόκληρους τοπικούς caches και κλειδιά πρόσβασης. Καθάρισε τις διαδρομές και βάλε σαφή κεντρικό φάκελο για να ανοίγει σε Windows, Linux και Android.
python -m compileall -q scripts
sha256sum release.zip
unzip -t release.zip
unzip -Z1 release.zip | head -30
Έλεγξε και το ZIP ως είσοδο
Αρχεία ZIP μπορεί να περιέχουν μέλη με ../, απόλυτες διαδρομές, symlinks, διπλά ονόματα ή πολύ μεγάλα αποσυμπιεσμένα δεδομένα. Έλεγξε τη λίστα πριν εξαγωγή άγνωστου αρχείου. Μην κάνεις unzip τυχαίο πακέτο κατευθείαν στον προσωπικό σου φάκελο ή σε web root. Ένα SHA-256 δείχνει ότι το περιεχόμενο δεν άλλαξε σε σχέση με έμπιστο checksum, δεν αποδεικνύει μόνο του την ταυτότητα του δημιουργού.
Αναπαραγώγιμη δημιουργία
Ώρες τροποποίησης, σειρά αρχείων και διαφορετικά path separators μπορεί να αλλάζουν το hash ανάμεσα σε δύο builds. Χρησιμοποίησε σταθερή ταξινόμηση και metadata όταν χρειάζεσαι byte-for-byte ίδιο αποτέλεσμα. Σύγκρινε το manifest με τα πραγματικά περιεχόμενα και κατάγραψε το εργαλείο δημιουργίας.
Άσκηση αποδοχής
Φτιάξε ZIP με δύο δικά σου μικρά αρχεία, υπολόγισε τα hashes και κάνε εξαγωγή σε νέο προσωρινό φάκελο. Έλεγξε ακριβές περιεχόμενο και φτιάξε δεύτερη φορά το πακέτο. Κατάγραψε τα δύο αποτελέσματα αντί να λες ότι είναι αναπαραγώγιμο χωρίς πραγματική σύγκριση.
Κανονικοποίηση μεταδεδομένων πριν σύγκριση hashes αρχείου
Δύο ZIP με ίδιο κείμενο μπορεί να έχουν διαφορετικό hash λόγω σειράς, χρόνων, αδειών ή συμπίεσης. Η αναπαραγωγιμότητα απαιτεί έλεγχο συσκευασίας μαζί με περιεχόμενο. Ταξινόμησε διαδρομές, διάλεξε χρόνο και τεκμηρίωσε αν αναμένεται ίδια συμπίεση σε διαφορετικές εκδόσεις εργαλείων.
Χρησιμοποίησε προσωρινό χώρο χωρίς αλλαγή χρόνων στα αρχεία εργασίας του χρήστη. Το δείγμα φτιάχνει δύο ντετερμινιστικά ασυμπίεστα αρχεία στη μνήμη. Αποδεικνύει αναπαραγωγή αυτής της συνταγής, όχι κάθε συμπιεστή ZIP.
import io, zipfile, hashlib
def release():
output=io.BytesIO()
with zipfile.ZipFile(output,"w",compression=zipfile.ZIP_STORED) as z:
for name,data in sorted({"b.txt":b"two", "a.txt":b"one"}.items()):
entry=zipfile.ZipInfo(name,date_time=(2020,1,1,0,0,0))
entry.create_system=3
entry.external_attr=0o100644 << 16
z.writestr(entry,data)
return output.getvalue()
a,b=release(),release()
assert a == b
print(hashlib.sha256(a).hexdigest())
Άλλαξε ένα byte εισόδου και έλεγξε αλλαγή hash. Κατάγραψε εργαλεία και ρυθμίσεις δίπλα στο manifest. Η αναπαραγώγιμη συσκευασία δεν αποδεικνύει ασφαλή εξαγωγή· διάσχιση διαδρομών και όρια αποσυμπίεσης ελέγχονται χωριστά.