Zip bomb πώς λειτουργεί. Τι είναι οι βόμβες ZIP ή πώς ένα μικρό αρχείο μπορεί εύκολα να καταστρέψει τον υπολογιστή σας

Ένα πολύ ενδιαφέρον και σημαντικό γεγονός συνέβη, επιθετικά αθόρυβα και απαρατήρητα. Ο Ρώσος πρόεδρος Βλαντιμίρ Πούτιν συναντήθηκε και μίλησε με έναν από τους επικεφαλής της δημόσιας υπηρεσίας, το όνομα του οποίου δεν εμφανίζεται συχνά στον Τύπο. Όχι, αυτό το άτομο δεν είναι μυστικός πράκτορας, αν και λόγω της φύσης της δραστηριότητάς του έχει πρόσβαση σε μυστικές πληροφορίες και μπορεί να θεωρηθεί ακόμη και ένα είδος «μαχητή του αόρατου μετώπου». Σε γενικές γραμμές, ο Πούτιν μίλησε με τον επικεφαλής της Ομοσπονδιακής Αρχειακής Υπηρεσίας Αντρέι Αρτίζοφ.

Η συνομιλία μεταξύ του αρχηγού του κράτους και του αρχηγού της υπηρεσίας ήταν επιχειρηματικού χαρακτήρα, οι πιθανές συνέπειες της οποίας θα μπορούσαν σε ορισμένα σημεία να προκαλέσουν το αποτέλεσμα μιας έκρηξης βόμβας και σε ορισμένα άτομα ακόμη και την έκρηξη ενός προσωπικού ακροφυσίου.

Ο Πρόεδρος έκανε μια σιωπηλή δήλωση ότι αποφάσισε να αποχαρακτηρίσει πολλά αρχειακά έγγραφα και το διάταγμα θα υπογραφεί την ίδια μέρα. Επιπλέον, ο Πούτιν ανακοίνωσε τη μεταφορά του Rosarkhiv σε άμεση υποταγή στον Πρόεδρο της Ρωσίας, καθώς πολλά από τα υλικά του τμήματος «έχουν ιδιαίτερη αξία και έχουν παγκόσμια σημασία».

Ο επικεφαλής του πρακτορείου, με τη σειρά του, ενημέρωσε τον πρόεδρο ότι το ρωσικό αρχειακό ταμείο αποθηκεύει 500 εκατομμύρια αρχεία και ότι «ποτέ τις τελευταίες δεκαετίες δεν είχε προγραμματιστεί, οργανωμένη εργασία αποχαρακτηρισμού με τον τρόπο που εκτελείται τώρα».

Το βασικό σημείο είναι ότι αμέσως μετά τον αποχαρακτηρισμό, αρχειακά έγγραφα θα είναι διαθέσιμα στον επίσημο ιστότοπο του Ρωσικού Αρχείου, για το οποίο έχει ήδη δημιουργηθεί ειδική βάση δεδομένων.

Μεταξύ των ήδη αποχαρακτηρισμένων αρχείων υπάρχουν υλικά που εγχώριοι και ξένοι ιστορικοί γλείφουν εδώ και καιρό τα χείλη τους: 1.400 μοναδικές οδηγίες του Στάλιν, εντολές από το Αρχηγείο, εντολές πρώτης γραμμής, επιχειρησιακοί χάρτες, ψηφίσματα και φωτογραφίες εκείνης της εποχής, που μέχρι πρόσφατα αποθηκεύονταν στα αρχεία υπό τον τίτλο «άκρως απόρρητο».

Μπορεί κανείς μόνο να χαρεί ειλικρινά για τους ιστορικούς, να τους ευχηθεί φρέσκα και ενδιαφέροντα έργα, τα οποία θα βασίζονται στα προαναφερθέντα έγγραφα, αλλά μόνο ο αποχαρακτηρισμός θα επηρεάσει περισσότερα από ένα στρατιωτικά-ιστορικά θέματα.

Μια πηγή κοντά στο Rosarkhiv παρέχει ενδιαφέρουσες λεπτομέρειες: «Από όσο γνωρίζω από πληροφορίες από το τμήμα αρχείων, μιλάμε για την περίοδο από το 1930 έως το 1989. Υπάρχουν περιπτώσεις, με συγχωρείτε, πληροφοριοδοτών – καθώς και αθώων απωθημένων, με πολύ ενδιαφέροντα επώνυμα. Θα υπάρξουν στοιχεία για διαστημικές και στρατιωτικές εξελίξεις που μπορούν ήδη να αναφερθούν. Επιπλέον, αποχαρακτηρίζονται δεδομένα για την πορεία των μαχών, τις διαταγές και τις πληροφορίες που ελήφθησαν κατά τη διάρκεια του Μεγάλου Πατριωτικού Πολέμου, καθώς και για τις διακρατικές σχέσεις κατά τη διάρκεια του Ψυχρού Πολέμου».

Και προσθέτει πολύ έντονα: «Κάποια έγγραφα θα εκπλήξουν την κοινωνία. Πρέπει να γνωρίζετε τη δική σας ιστορία, όποια κι αν είναι αυτή».

Τα αρχεία έχουν μεγάλη μνήμη και φέρουν δυνητικό φορτίο όχι χειρότερο από μια βόμβα υδρογόνου. Δεν είναι τυχαίο ότι στη χώρα μας η «υπόθεση των στρατιωτών» και η «υπόθεση των γιατρών» συνεχίζουν να παραμένουν διαβαθμισμένες, δημιουργώντας τη βάση για κάθε είδους εικασίες για μεγάλο χρονικό διάστημα. Όχι πολύ καιρό πριν στη Μεγάλη Βρετανία, μια ειδική επιτροπή ασχολήθηκε με αρχειακά έγγραφα των οποίων η περίοδος μυστικότητας πλησίαζε στο τέλος της, αλλά με βάση δεδομένα για προπολεμικές επαφές μεταξύ των βρετανικών πληροφοριών και της ναζιστικής SD, αποφασίστηκε να παραταθεί το καθεστώς μυστικότητας για άλλα 50 χρόνια.

Η επιφύλαξη για «κάποια έγγραφα θα εκπλήξουν την κοινωνία» δεν έγινε τυχαία. Στα τέλη της δεκαετίας του 1980, τόσο στη Ρωσία όσο και στις δημοκρατίες της πρώην ΕΣΣΔ, πολλοί άνθρωποι ήρθαν στην εξουσία στο κύμα του «εκδημοκρατισμού».

Πολλοί επιδεικνύουν εκπληκτική πολιτική ζωτικότητα, παρά τη σαφή έλλειψη διευθυντικού ταλέντου και την τάση να διδάσκουν τον λαό για τη δημοκρατία από τη δική του οπτική γωνία.

Στο κοντινό εξωτερικό, πρώην ηγέτες των «λαϊκών μετώπων», που άλλαξαν την κοσμοθεωρία τους από αντισοβιετική σε αντιρωσική, είναι σταθερά προσκολλημένοι στην εξουσία και ασκούν εχθρικές πολιτικές προς τη Ρωσία από την επικράτειά τους - από τη διοργάνωση συνεδρίων κάθε είδους αποστερήθηκε από την «Ανοιχτή Ρωσία» για την εκπαίδευση φιλοφασιστών αγωνιστών και την παροχή στρατιωτικής βοήθειας Μπαντεραϊτών.

Η ευρωπαϊκή κοινότητα, καθώς και οι πολίτες αυτών των limittrophes, θα ενδιαφέρονται να μάθουν από τα αποχαρακτηρισμένα έγγραφα του Ομοσπονδιακού Αρχείου - ποιοι από τους εγγεγραμμένους «ευρωδημοκράτες» ήταν πληροφοριοδότες της KGB. Η γη είναι γεμάτη φήμες ότι στα ομιχλώδη νιάτα τους ο πρώην αρχηγός του Λιθουανικού Εθνικού Μετώπου Landsbergis και η σημερινή κυρία Πρόεδρος Dalia Grybauskaite «χτύπησαν» στην KGB. Τώρα, πιστεύω, θα είναι δυνατό να μάθουμε για αυτήν την πλευρά της βιογραφίας τους από την κύρια πηγή.

Μπορείτε να κουτσομπολεύετε για «ήταν πολύ καιρό πριν και δεν είναι αλήθεια», «είναι κατάφυτο από την πραγματικότητα», όσο θέλετε, αλλά δεν πρέπει να υποτιμάτε την καταστροφική δύναμη τέτοιων αποκαλύψεων.

Κάποιος μπορεί να θυμηθεί πώς πέρυσι κυκλοφόρησε θεαματικά ένα πακέτο εγγράφων, που ανακαλύφθηκε από το Ινστιτούτο Εθνικής Μνήμης, σχετικά με τη συνεργασία του Λεχ Βαλέσα (υπό το επιχειρησιακό πρόσχημα του «Bolek») εν μέσω των δραστηριοτήτων του στο Ναυπηγείο του Γκντανσκ. τον πολωνικό Τύπο. Η έκρηξη της πληροφορίας δεν άφησε κανένα πέτρα στην εικόνα της εικόνας, του «Πόλου Νο. 1», ηγέτη της Αλληλεγγύης, βραβευμένου με Νόμπελ Ειρήνης και πρώτου προέδρου της αντισοβιετικής Πολωνίας. Από εδώ και στο εξής, ο Walesa είναι απλώς ένας μουστακαλής χοντρός γέρος, ένα ερείπιο μιας περασμένης εποχής, του οποίου η ντροπή φαίνεται με τα μάτια σας με τη μορφή 17 αποδείξεων που εκτίθενται στο ίδιο Ινστιτούτο Εθνικής Μνήμης για τη λήψη χρημάτων για το μεταφερόμενες πληροφορίες στις ειδικές υπηρεσίες.

Δεν μπορεί παρά να λυπηθεί που η αρχειακή «βόμβα» δεν εξερράγη υπό τον πράκτορα «Μπόλεκ» τη δεκαετία του 1980, όταν αυτός και η «Αλληλεγγύη» του, συνεργαζόμενοι με δυτικές υπηρεσίες πληροφοριών, τίναζαν τη σοσιαλιστική Πολωνία.

Πολλές ενδιαφέρουσες εκπλήξεις μπορεί να περιμένουν αφοσιωμένους εγχώριους φιλελεύθερους. Η ελικοειδής πορεία της ζωής τους είναι από πολλές απόψεις παρόμοια με την πορεία του Walesa προς τα ύψη της εξουσίας. Δυστυχώς, η KGB δεν βιαζόταν να εκθέσει τους μεταρρυθμισμένους πληροφοριοδότες για πολλούς λόγους, μεταξύ των οποίων οι ηθικοί δεν ήταν το λιγότερο σημαντικό. Άλλωστε, αν αποκαλύψεις έναν πράκτορα, ειδικά έναν εθελοντικό, τότε ποιος θα συνεργαστεί; Οι πράκτορες που πιάνονται να διαπράττουν ανάρμοστες πράξεις και στρατολογούνται σε αυτή τη βάση δεν θα σας πάνε πολύ μακριά.

Ανεπίσημες πληροφορίες διαρρέουν στα μέσα ενημέρωσης ότι «εξέχουσες προσωπικότητες του φιλελεύθερου-δημοκρατικού κινήματος στη Ρωσία» συνεργάστηκαν με τις σοβιετικές υπηρεσίες πληροφοριών οικειοθελώς, για ιδιοτελείς λόγους: ενδιαφέροντα επαγγελματικά ταξίδια, εξέλιξη σταδιοδρομίας, έργο κύρους κ.λπ.

Μπορούμε μόνο να φανταστούμε τι είδους οχιές ήταν οι διάφορες δημιουργικές ενώσεις συγγραφέων, εργαζομένων στο θέατρο και κινηματογραφιστών.

Πολλοί επικριτές της ΕΣΣΔ και του σοβιετικού συστήματος είχαν γονείς που δεν ήταν απλώς εξέχουσες κομματικές ή οικονομικές προσωπικότητες, αλλά υπηρέτησαν επίσης στο NKVD-MGB-KGB, και μάλιστα συμμετείχαν προσωπικά σε καταστολές.

Φυσικά, τα παιδιά δεν ευθύνονται για τους πατέρες τους, αλλά γίνεται αηδιαστικό στην ψυχή όταν βάφονται ξανά απόγονοι, που δεν θέλουν να θυμούνται το παρελθόν των γονιών τους, αλλά κάποτε, χωρίς καμία τύψη, χρησιμοποίησαν την υψηλή θέση τους ως εφαλτήριο για προσωπικό λαμπρό μέλλον, αρχίστε να αποκαλύπτετε και να σκίζετε τα εξώφυλλα.

Τα αποχαρακτηρισμένα αρχεία μπορούν να επηρεάσουν την ισορροπία δυνάμεων στην εμπόλεμη Ουκρανία. Κάποιος μπορεί να θυμηθεί πώς μια σειρά από έγγραφα που δημοσιεύθηκαν στα κοινωνικά δίκτυα από τη Miroslava Berdnik, ακόμη και πριν από το πραξικόπημα του Μαϊντάν, σχετικά με τη συνεργασία των ηγετών του OUN με το MGB και το Υπουργείο Εσωτερικών, προκάλεσαν κρίσεις σύγχυσης και διάρροια από το λαιμό στους οπαδούς του Bandera. πτώματα. Οι Svidomites έβριζαν και αποκαλούσαν φωτοαντίγραφα εγγράφων «πλαστές της FSB», αλλά δεν μπορούσαν να διαφωνήσουν με κανένα επιχείρημα.

Γιατί είναι σημαντικό? Ο ουκρανικός ριζοσπαστικός εθνικισμός είναι κακός χωρίς καμία επιφύλαξη. Αλλά το δηλώνουν πολλοί άνθρωποι. Μεταξύ των σύγχρονων μελών του OUN υπάρχουν οι ιδεαλιστές τους που θέλουν να καθαρίσουν τον ουκρανικό εθνικισμό από τις πιο απεχθή φιγούρες του Μπαντέρα και του Σούκεβιτς, αφού εδώ και πολύ καιρό έχουν συμβιβαστεί αμετάκλητα ως μαριονέτες και δυνάμεις τιμωρίας του Χίτλερ. Όπως και να έχει, η μεταπολεμική σοβιετική υπηρεσία πληροφοριών είχε καλή κατανόηση των συναισθημάτων των Γερμανών εθνικιστών, οι οποίοι ξεχώριζαν σαφώς από τους Ναζί και τους υποστηρικτές του στρατηγού Gehlen, ο οποίος έπεσε κάτω από τους Αμερικανούς. Οι Γερμανοί εθνικιστές, που θεωρούσαν τον Μπίσμαρκ το είδωλό τους, έχοντας επιζήσει από τη φρίκη του πολέμου και βλέποντας πώς οι Αμερικανοί ωθούσαν τη Γερμανία σε νέο πόλεμο με την ΕΣΣΔ, επέλεξαν να εργαστούν για τη σοβιετική και την ανατολικογερμανική υπηρεσία πληροφοριών. Αυτό το σημείο σίγουρα αξίζει να ληφθεί υπόψη.

Από την άλλη πλευρά, η Ουκρανία είναι γεμάτη από ένθερμους νεομπαντεριστές που δεν υποφέρουν από υπερβολική αηδία, που δεν φοβούνται κανένα τεκμηριωμένο στοιχείο της συνεργασίας των ειδώλων τους με τις ειδικές υπηρεσίες του Χίτλερ. Τι θα συμβεί αν δημοσιευθούν αποχαρακτηρισμένα έγγραφα που λένε ότι τα είδωλά τους, όπως ο Vasil Kuk, διέρρευσαν πληροφορίες στο MGB για «αδέρφια» που κάθονταν σε κρυφά;

Αν ξαφνικά αποδειχθεί ότι κάθε είδους «ακτιβιστές για τα δικαιώματα» και «ανεξάρτητοι» της ύστερης σοβιετικής περιόδου χτύπησαν την KGB για να αμβλύνουν το καθεστώς των φυλακών, για ένα επιπλέον δέμα με λαρδί από το σπίτι ή ένα τσούρμο από έναν πάγκο κατασκήνωσης; Θα αντέξει η «σπιλνότα» του Μπαντέρα, που βλέπει παντού το μακρύ χέρι της Μόσχας, του FSB και του Πούτιν προσωπικά, σε μια τέτοια δοκιμασία της δύναμης των πεποιθήσεων;

Πληροφορίες αυτού του είδους μπορούν να προκαλέσουν μια ισχυρή απελευθέρωση θερμοπυρηνικού πλάσματος από το Svidomo doupas, οι ιδιοκτήτες του οποίου καυχώνται για «εθνική καθαρότητα» και «Svidomo». Για κάποιους, οι αποκαλύψεις ειδώλων μπορεί να τους κάνουν να οπισθοχωρήσουν και να συνέλθουν.

Θα ήταν ενδιαφέρον να μάθουμε για τη διπλή ζωή των ηγετών του αυτοαποκαλούμενου «Ματζλίς», καθώς και άλλων αποκρουστικών μορφών που μαραζώνουν κάτω από το αυτοεπιβαλλόμενο βάρος της «συνείδησης του έθνους».

Λοιπόν, κάτω από ποιανού προσωπική πίσω πλευρά θα σκάσει η πρώτη αρχειακή «βόμβα»; Ποιος θα είναι η «ατμομηχανή» που θα ξετυλίξει μια μακρά αλυσίδα αποκαλύψεων;

[Ενημέρωση] Τώρα είμαι σε κάποιο είδος λίστας υπηρεσιών πληροφοριών επειδή έγραψα ένα άρθρο για κάποιο είδος «βόμβας», σωστά;

Εάν έχετε φιλοξενήσει ποτέ έναν ιστότοπο ή έχετε διαχειριστεί έναν διακομιστή, πιθανότατα γνωρίζετε καλά τους κακούς ανθρώπους που προσπαθούν να κάνουν κάθε είδους κακό στην ιδιοκτησία σας.

Όταν πρωτοφιλοξένησα το μικρό μου Linux box με πρόσβαση SSH σε ηλικία 13 ετών, κοιτούσα τα αρχεία καταγραφής και κάθε μέρα έβλεπα διευθύνσεις IP (κυρίως από την Κίνα και τη Ρωσία) να προσπαθούν να συνδεθούν στο γλυκό μου κουτί (που είναι στην πραγματικότητα Ήταν στην πραγματικότητα ένας παλιός φορητός υπολογιστής ThinkPad T21 με σπασμένη οθόνη, που βουίζει κάτω από το κρεβάτι). Ανέφεραν αυτές τις IP στους παρόχους τους.

Στην πραγματικότητα, εάν έχετε διακομιστή Linux με ανοιχτό SSH, μπορείτε να δείτε μόνοι σας πόσες προσπάθειες σύνδεσης πραγματοποιούνται καθημερινά:

Grep "αποτυχίες ελέγχου ταυτότητας" /var/log/auth.log


Εκατοντάδες ανεπιτυχείς προσπάθειες εξουσιοδότησης, αν και ο διακομιστής έχει απενεργοποιήσει τον έλεγχο ταυτότητας με κωδικό πρόσβασης και εκτελείται σε μια μη τυπική θύρα

Το Wordpress μας καταδίκασε

Εντάξει, ας το παραδεχτούμε, σαρωτές ευπάθειας ιστού υπήρχαν πριν από το Wordpress, αλλά αφού η πλατφόρμα έγινε τόσο δημοφιλής, οι περισσότεροι σαρωτές άρχισαν να ελέγχουν για λάθος διαμορφωμένους φακέλους wp-admin και μη επιδιορθωμένα πρόσθετα.

Έτσι, αν μια μικρή εκκολαπτόμενη συμμορία χάκερ θέλει να αποκτήσει νέους λογαριασμούς, θα κατεβάσει ένα από αυτά τα εργαλεία σαρωτή και θα το τοποθετήσει σε ένα σωρό ιστοσελίδες με την ελπίδα να αποκτήσει πρόσβαση σε κάποιο ιστότοπο και να το παραποιήσει.


Δείγμα αρχείων καταγραφής κατά τη σάρωση με το εργαλείο Nikto

Αυτός είναι ο λόγος για τον οποίο όλοι οι διακομιστές και οι διαχειριστές ιστότοπων ασχολούνται με gigabyte αρχείων καταγραφής γεμάτα προσπάθειες σάρωσης. Ετσι σκέφτηκα...

Είναι δυνατόν να αντεπιτεθεί;

Αφού πειραματίστηκα με την πιθανή χρήση του IDS ή του Fail2ban, μου υπενθύμισαν τις παλιές καλές βόμβες ZIP από το παρελθόν.

Τι είδους πράγμα είναι μια βόμβα ZIP;

Όπως αποδεικνύεται, η συμπίεση ZIP είναι εξαιρετική στην αντιμετώπιση επαναλαμβανόμενων δεδομένων, οπότε αν έχετε ένα τεράστιο αρχείο κειμένου γεμάτο με επαναλαμβανόμενα δεδομένα όπως όλα τα μηδενικά, θα συμπιεστεί πολύ καλά. Δηλαδή ΠΟΛΥ καλό.

Όπως έδειξε το 42.zip, είναι δυνατή η συμπίεση 4,5 petabyte (4.500.000 gigabyte) σε 42 kilobyte. Όταν προσπαθείτε να προβάλετε τα περιεχόμενα του αρχείου (εξαγωγή ή αποσυμπίεση του), πιθανότατα θα εξαντληθεί ο χώρος στο δίσκο ή η μνήμη RAM.

Πώς να ρίξετε μια βόμβα ZIP σε έναν σαρωτή ευπάθειας;

Δυστυχώς, τα προγράμματα περιήγησης ιστού δεν καταλαβαίνουν το ZIP, αλλά καταλαβαίνουν το GZIP.

Έτσι το πρώτο πράγμα που θα κάνουμε είναι να δημιουργήσουμε ένα αρχείο GZIP 10 GB γεμάτο με μηδενικά. Υπάρχουν πολλές ένθετες συμπιέσεις που μπορείτε να κάνετε, αλλά ας ξεκινήσουμε απλά.

Dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip


Φτιάχνοντας μια βόμβα και ελέγχοντας το μέγεθός της

Όπως μπορείτε να δείτε, το μέγεθός του είναι 10 MB. Θα μπορούσε να είχε συμπιεστεί καλύτερα, αλλά αυτό αρκεί προς το παρόν.

Τώρα ας εγκαταστήσουμε ένα σενάριο PHP που θα το παραδώσει στον πελάτη.

Ετοιμος!

Τώρα μπορούμε να το χρησιμοποιήσουμε ως απλή άμυνα:

Προφανώς, αυτό το σενάριο δεν είναι η επιτομή της κομψότητας, αλλά μπορεί να μας προστατεύσει από τα παιδιά του σεναρίου που αναφέρθηκαν προηγουμένως, που δεν έχουν ιδέα ότι ο χρήστης-agent μπορεί να αλλάξει σε σαρωτές.

Λοιπόν... Τι θα συμβεί αν εκτελέσετε αυτό το σενάριο;


(εάν δοκιμάσατε τη βόμβα σε άλλες συσκευές/προγράμματα περιήγησης/σενάρια, παρακαλώ

Το άρθρο αναφέρει 9 επίπεδα αρχείων zip, επομένως δεν πρόκειται για μια απλή περίπτωση να κολλήσετε μαζί ένα σωρό μηδενικά. Γιατί 9, γιατί 10 αρχεία στο καθένα;

Πρώτον, το άρθρο της Wikipedia αυτή τη στιγμή μιλά για 5 επίπεδα 16 αρχείων. Δεν ξέρω πού συμβαίνει η ασυμφωνία, αλλά δεν είναι μόνο αυτό που είναι σχετικό. Το πραγματικό ερώτημα είναι γιατί να χρησιμοποιήσετε αρχικά το nesting.

Το DEFLATE, η μόνη υποστηριζόμενη μέθοδος συμπίεσης για αρχεία zip*, έχει μέγιστο λόγο συμπίεσης 1032. Αυτό μπορεί να επιτευχθεί ασυμπτωτικά για οποιαδήποτε επαναλαμβανόμενη ακολουθία 1-3 byte. Ανεξάρτητα από το τι κάνετε με το αρχείο zip, εφόσον χρησιμοποιείται μόνο με το DEFLATE, το μέγεθος του αποσυμπιεσμένου αρχείου δεν θα είναι μεγαλύτερο από 1032 φορές το μέγεθος του αρχικού αρχείου zip.

Επομένως, για να επιτύχετε πραγματικά εξωφρενικές αναλογίες συμπίεσης, πρέπει να χρησιμοποιήσετε ένθετα αρχεία zip. Εάν έχετε 2 επίπεδα συμπίεσης, η μέγιστη αναλογία είναι 1032^2 = 1065024. Για 3, είναι 1099104768 και ούτω καθεξής. Για τα 5 επίπεδα που χρησιμοποιούνται στο 42.zip, η θεωρητική μέγιστη αναλογία συμπίεσης είναι 1170572956434432. Όπως μπορείτε να δείτε, το πραγματικό μέγεθος του 42.zip δεν είναι πουθενά κοντά σε αυτό το επίπεδο. Μέρος αυτού είναι το γενικό κόστος της μορφής zip και μέρος του είναι ότι απλά δεν τους νοιάζει.

Αν έπρεπε να μαντέψω, θα έλεγα ότι το 42.zip δημιουργήθηκε δημιουργώντας ένα μεγάλο κενό αρχείο και αντιγράφοντας και αντιγράφοντας ξανά και ξανά. Δεν υπάρχει τρόπος να ωθήσετε τα όρια μορφής ή να μεγιστοποιήσετε τη συμπίεση ή οτιδήποτε άλλο - απλώς επέλεξαν αυθαίρετα 16 αντίγραφα ανά επίπεδο. Η ιδέα ήταν να δημιουργηθεί ένα μεγάλο ωφέλιμο φορτίο χωρίς μεγάλη προσπάθεια.

Σημείωση. Άλλες μορφές συμπίεσης, όπως το bzip2, προσφέρουν πολύ, πολύ, πολύ υψηλότερους μέγιστους λόγους συμπίεσης. Ωστόσο, οι περισσότεροι αναλυτές zip δεν τα δέχονται.

ΥΣΤΕΡΟΓΡΑΦΟ. Μπορείτε να δημιουργήσετε ένα αρχείο zip που θα εξαγάγει ένα αντίγραφο του εαυτού του (quine). Μπορείτε επίσης να δημιουργήσετε ένα που αποσυσκευάζει πολλά αντίγραφα. Έτσι, εάν αποσυμπιέσετε το αρχείο για πάντα, το μέγιστο δυνατό μέγεθος είναι άπειρο. Ο μόνος περιορισμός είναι ότι μπορεί να αυξηθεί όχι περισσότερο από 1032 σε κάθε επανάληψη.

Π.Π.Σ. Η τιμή 1032 προϋποθέτει ότι τα δεδομένα αρχείου στο zip δεν επικαλύπτονται. Ένα από τα χαρακτηριστικά της μορφής αρχείου zip είναι ότι διαθέτει έναν κεντρικό κατάλογο που παραθέτει τα αρχεία στο αρχείο και τις μετατοπίσεις δεδομένων αρχείων. Εάν δημιουργήσετε πολλές καταχωρήσεις σε αρχεία που δείχνουν τα ίδια δεδομένα, μπορείτε να επιτύχετε πολύ υψηλότερους λόγους συμπίεσης ακόμη και χωρίς ένθεση, αλλά το αρχείο zip πιθανότατα θα απορριφθεί από τους αναλυτές.

Δοκιμή βόμβας αποσυμπίεσης

Μια βόμβα αποσυμπίεσης είναι ένα αρχείο που έχει σχεδιαστεί για να καταρρίψει ή να αφαιρέσει ένα άχρηστο πρόγραμμα ή σύστημα που το διαβάζει, π.χ. υπηρεσία απορριμμάτων. Τα αρχεία σε αυτό το έργο μπορούν να χρησιμοποιηθούν για τον έλεγχο της ευπάθειας μιας εφαρμογής σε έναν δεδομένο τύπο επίθεσης.

Κατεβάστε τις βόμβες

Το zip bomb, γνωστό και ως zip of death ή decompression bomb, είναι ένα κακόβουλο αρχείο αρχειοθέτησης που έχει σχεδιαστεί για να διακοπεί ή να αφαιρέσει ένα άχρηστο πρόγραμμα ή σύστημα που το διαβάζει. Συχνά χρησιμοποιείται για την απενεργοποίηση του λογισμικού προστασίας από ιούς για τη δημιουργία ενός ανοίγματος για πιο παραδοσιακούς ιούς. Αντί να παραβιάζεται η κανονική λειτουργία ενός προγράμματος, μια βόμβα zip επιτρέπει στο πρόγραμμα να εκτελείται όπως αναμένεται, αλλά το αρχείο υποβάλλεται σε προσεκτική επεξεργασία έτσι ώστε η αποσυσκευασία του (για παράδειγμα, η χρήση ενός σαρωτή ιών για την αναζήτηση ιών) απαιτεί πολύ χρόνο, δίσκος χώρο ή μνήμη.

Το Zip bomb είναι ένα μικρό αρχείο για την απλοποίηση της μεταφοράς του και την αποφυγή υποψιών. Ωστόσο, όταν προσπαθείτε να αποσυσκευάσετε αυτό το αρχείο, τα περιεχόμενά του ζητούν περισσότερα από αυτά που μπορεί να επεξεργαστεί το σύστημα. Ένα άλλο παράδειγμα zip bomb είναι το αρχείο 42.zip, το οποίο είναι ένα αρχείο zip που περιέχει 42 kilobytes συμπιεσμένων δεδομένων, που περιέχουν πέντε επίπεδα ένθετων αρχείων zip σε σύνολα 16, κάθε αρχείο κάτω επιπέδου που περιέχει 4.3 gigabytes (4.294.967.295 bytes, ~ 3,99 Gib), σε συνολικά 4,5 petabytes (4,503,59,626,321,920 byte, ~3,99 PiB) ασυμπίεστων δεδομένων. Τέτοια αρχεία μπορούν ακόμα να ληφθούν από διάφορους ιστότοπους στο Διαδίκτυο. Πολλοί σαρωτές ιών εκτελούν μόνο μερικά επίπεδα αναδρομής σε αρχεία για να αποτρέψουν επιθέσεις που θα προκαλούσαν υπερχείλιση του buffer, μια κατάσταση εκτός μνήμης ή θα υπερέβαιναν τον αποδεκτό χρόνο εκτέλεσης του προγράμματος. Οι βόμβες zip συχνά (αν όχι πάντα) βασίζονται στην επανάληψη πανομοιότυπων αρχείων για να επιτύχουν την τελική αναλογία συμπίεσης. Οι τεχνικές δυναμικού προγραμματισμού μπορούν να χρησιμοποιηθούν για τον περιορισμό της διέλευσης τέτοιων αρχείων, έτσι ώστε μόνο ένα αρχείο να εκτελείται αναδρομικά σε κάθε επίπεδο, μετατρέποντας αποτελεσματικά την εκθετική τους ανάπτυξη σε γραμμική ανάπτυξη.

Όταν δοκιμάζετε, είναι πάντα καλύτερο να ξεκινάτε από μικρά και να προχωράτε προς τα πάνω. Η έναρξη της εργασίας με το μεγαλύτερο αρχείο μπορεί να βλάψει σοβαρά την εφαρμογή ή το σύστημα - χρησιμοποιήστε αυτές τις βόμβες με μεγάλη προσοχή.

Όλα τα αρχεία έχουν γίνει bzip για να παρακαμφθεί το όριο μεταφόρτωσης αρχείων των 50 MB του GitMub. Ομάδες αρχείων συμπιέστηκαν και στη συνέχεια αποτυπώθηκαν ξανά. Αφαιρέστε αυτές τις πρόσθετες προ-κωδικοποιήσεις πριν από τη σάρωση.

Πρόσθετες πηγές

  • HTTP/2: Σε βάθος ανάλυση των τεσσάρων κορυφαίων ελαττωμάτων του πρωτοκόλλου ιστού επόμενης γενιάς
  • Δεν κοιτάς τη μεγάλη εικόνα
  • In the Compression Hornet's Nest: A Security Study of Data Compression in Network Services
  • Διαβολική συμπίεση HTTP - βόμβες συμπίεσης (

*Υπάρχουν δύο εκδόσεις του 42.zip: η παλιά είναι 42.374 byte και η νεότερη είναι 42.838 byte. Η διαφορά είναι ότι το νέο απαιτεί κωδικό πρόσβασης πριν από την αποσυσκευασία. Συγκρίνουμε μόνο με την παλιά έκδοση. Ακολουθεί ένα αντίγραφο του αρχείου εάν το χρειάζεστε: 42.zip.

Οι βόμβες zip πρέπει να ξεπεράσουν το γεγονός ότι ο πιο συχνά υποστηριζόμενος αλγόριθμος συμπίεσης από τους αναλυτές, το DEFLATE, δεν μπορεί να υπερβαίνει μια αναλογία συμπίεσης 1032 προς 1. Για αυτόν τον λόγο, οι βόμβες zip βασίζονται συνήθως στην αναδρομική αποσυμπίεση, ενθέτοντας αρχεία zip μέσα σε αρχεία zip για να αποκτήσουν επιπλέον συντελεστής 1032 με κάθε στρώμα. Αλλά το κόλπο λειτουργεί μόνο σε υλοποιήσεις που αποσυσκευάζουν αναδρομικά, και οι περισσότερες δεν το κάνουν. Η πιο διάσημη βόμβα 42.zip επεκτείνεται σε ένα τρομερό 4,5 PB εάν και τα έξι επίπεδα αποσυμπιεστούν αναδρομικά, αλλά στο επάνω στρώμα έχει ένα ασήμαντο 0,6 MB. Τα zip quines, όπως αυτά των Cox και Ellingsen, παράγουν ένα αντίγραφο του εαυτού τους και έτσι επεκτείνονται απεριόριστα όταν αποσυμπιέζονται αναδρομικά. Αλλά είναι επίσης απολύτως ασφαλή όταν αποσυσκευαστούν.

Αυτό το άρθρο δείχνει πώς να δημιουργήσετε μια μη επαναλαμβανόμενη zip bomb της οποίας η αναλογία συμπίεσης υπερβαίνει το όριο DEFLATE των 1032. Λειτουργεί με την επικάλυψη αρχείων μέσα σε ένα κοντέινερ zip για να παραπέμπει σε έναν "πυρήνα" εξαιρετικά συμπιεσμένων δεδομένων σε πολλά αρχεία χωρίς να δημιουργεί πολλά αντίγραφα. Το μέγεθος εξόδου μιας βόμβας φερμουάρ αυξάνεται τετραγωνικά με το μέγεθος εισόδου. δηλαδή, η αναλογία συμπίεσης βελτιώνεται όσο αυξάνεται το μέγεθος της βόμβας. Ο σχεδιασμός εξαρτάται από τα χαρακτηριστικά του zip και του DEFLATE: δεν μεταφέρεται απευθείας σε άλλες μορφές αρχείων ή αλγόριθμους συμπίεσης. Η βόμβα είναι συμβατή με τους περισσότερους αναλυτές zip, εκτός από αυτούς που κάνουν ροή, οι οποίοι αναλύουν αρχεία με ένα πέρασμα χωρίς να ελέγχουν τον κεντρικό κατάλογο του αρχείου zip. Προσπαθούμε να εξισορροπήσουμε δύο αντικρουόμενους στόχους:

  • Αύξηση του λόγου συμπίεσης. Ορίζουμε τον λόγο συμπίεσης ως το άθροισμα των μεγεθών όλων των αρχείων στο αρχείο διαιρεμένο με το μέγεθος του ίδιου του αρχείου zip. Αυτό δεν λαμβάνει υπόψη τα ονόματα αρχείων ή άλλα μεταδεδομένα του συστήματος αρχείων, αλλά μόνο το περιεχόμενο.
  • Διατηρήστε τη συμβατότητα. Το Zip είναι μια πολύπλοκη μορφή και οι αναλυτές διαφέρουν, ειδικά σε καταστάσεις ακμών και σε πρόσθετες δυνατότητες. Μην χρησιμοποιείτε τεχνικές που λειτουργούν μόνο με συγκεκριμένους αναλυτές. Θα επισημάνουμε μερικούς τρόπους για να κάνουμε το zip bomb πιο αποτελεσματικό με κάποια απώλεια συμβατότητας.

Δομή αρχείου zip

Το αρχείο zip αποτελείται από κεντρικός κατάλογοςσυνδέσμους προς αρχεία.

Ο κεντρικός κατάλογος βρίσκεται στο τέλος του αρχείου zip. Αυτή είναι η λίστα κεφαλίδες κεντρικού καταλόγου. Κάθε κεφαλίδα κεντρικού καταλόγου περιέχει μεταδεδομένα για ένα αρχείο, όπως το όνομα του αρχείου και το άθροισμα ελέγχου CRC-32, καθώς και έναν πίσω δείκτη στην κεφαλίδα του τοπικού αρχείου. Η κεφαλίδα του κεντρικού καταλόγου έχει μήκος 46 byte συν το μήκος του ονόματος αρχείου.

Το αρχείο αποτελείται από μια τοπική κεφαλίδα αρχείου ακολουθούμενη από συμπιεσμένα δεδομένα αρχείου. Το μήκος της κεφαλίδας του τοπικού αρχείου είναι 30 byte συν το μήκος του ονόματος αρχείου. Περιέχει ένα περιττό αντίγραφο των μεταδεδομένων από την κεφαλίδα του κεντρικού καταλόγου, καθώς και τα μεγέθη των συμπιεσμένων και ασυμπίεστων αρχείων δεδομένων πίσω από αυτό. Το Zip είναι μια μορφή κοντέινερ, όχι ένας αλγόριθμος συμπίεσης. Τα δεδομένα κάθε αρχείου συμπιέζονται χρησιμοποιώντας έναν αλγόριθμο που καθορίζεται στα μεταδεδομένα - συνήθως DEFLATE.

Αυτή η περιγραφή της μορφής zip παραλείπει πολλές λεπτομέρειες που δεν χρειάζονται για να κατανοήσουμε το zip bomb. Για πλήρεις πληροφορίες, ανατρέξτε στην ενότητα 4.3 APPNOTE.TXT ή "Δομή αρχείου PKZip" του Florian Buchholz ή δείτε .

Ο σημαντικός πλεονασμός και οι πολλές ασάφειες στη μορφή zip ανοίγουν ευκαιρίες για κάθε είδους κακοτοπιές. Η βόμβα με φερμουάρ είναι μόνο η κορυφή του παγόβουνου. Σύνδεσμοι για περαιτέρω ανάγνωση:

$ python3 -m zipfile -e overlap.zip . Ανίχνευση (πιο πρόσφατη τελευταία κλήση): ... __main__.BadZipFile: Το όνομα αρχείου στον κατάλογο "B" και η κεφαλίδα b"A" διαφέρουν.
Στη συνέχεια, θα εξετάσουμε πώς να αλλάξουμε τη σχεδίαση για συνοχή του ονόματος αρχείου, διατηρώντας παράλληλα τα περισσότερα από τα πλεονεκτήματα των επικαλυπτόμενων αρχείων.

Δεύτερη ανακάλυψη: παράθεση τοπικών κεφαλίδων αρχείων

Πρέπει να χωρίσουμε τις τοπικές κεφαλίδες αρχείων για κάθε αρχείο ενώ επαναχρησιμοποιούμε έναν πυρήνα. Η απλή σύνδεση όλων των κεφαλίδων δεν λειτουργεί, επειδή ο αναλυτής zip θα βρει την κεφαλίδα του τοπικού αρχείου εκεί που αναμένει να ξεκινήσει η ροή DEFLATE. Αλλά η ιδέα θα λειτουργήσει, με μικρές αλλαγές. Θα χρησιμοποιήσουμε τη συνάρτηση DEFLATE των ασυμπίεστων μπλοκ για να "αναφέρουμε" τις τοπικές κεφαλίδες αρχείων έτσι ώστε να φαίνεται ότι αποτελούν μέρος της ίδιας ροής DEFLATE που καταλήγει στον πυρήνα. Κάθε τοπική κεφαλίδα αρχείου (εκτός από το πρώτο) θα ερμηνεύεται με δύο τρόπους: ως κώδικας (μέρος της δομής του αρχείου zip) και ως δεδομένα (μέρος του περιεχομένου του αρχείου).

Μια ροή DEFLATE είναι μια ακολουθία μπλοκ, όπου κάθε μπλοκ μπορεί να συμπιεστεί ή να μη συμπιεστεί. Συνήθως σκεφτόμαστε μόνο συμπιεσμένα μπλοκ, για παράδειγμα ο πυρήνας είναι ένα μεγάλο συμπιεσμένο μπλοκ. Υπάρχουν όμως και ασυμπίεστα, τα οποία ξεκινούν με μια κεφαλίδα 5 byte με ένα πεδίο μήκους, που σημαίνει απλά: "εκτυπώστε τα παρακάτω n bytes αυτολεξεί." Η αποσυμπίεση ενός ασυμπίεστου μπλοκ σημαίνει μόνο την αφαίρεση της κεφαλίδας των 5 byte. Τα συμπιεσμένα και τα ασυμπίεστα μπλοκ μπορούν να αναμειχθούν ελεύθερα στη ροή DEFLATE. Η έξοδος είναι μια συνένωση των αποτελεσμάτων της αποσυσκευασίας όλων των μπλοκ με τη σειρά. Ο όρος "ασυμπίεστο" έχει σημασία μόνο στο επίπεδο DEFLATE. τα δεδομένα του αρχείου εξακολουθούν να θεωρούνται "συμπιεσμένα" σε επίπεδο zip, ανεξάρτητα από τα μπλοκ που χρησιμοποιούνται.

Ο ευκολότερος τρόπος για να σκεφτείτε αυτήν τη δομή είναι ως εσωτερική επικάλυψη, από το τελευταίο αρχείο στο πρώτο. Ξεκινάμε εισάγοντας έναν πυρήνα που θα αποτελεί το τέλος του αρχείου δεδομένων για κάθε αρχείο. Προσθήκη κεφαλίδας στο τοπικό αρχείο LFH Νκαι κεφαλίδα του κεντρικού καταλόγου CDH Ν, που το δείχνει. Ορίστε το πεδίο μεταδεδομένων "συμπιεσμένου μεγέθους" σε LFH Νκαι C.D.H. Νανά συμπιεσμένο μέγεθος πυρήνα. Τώρα προσθέτουμε μια μη συμπιεσμένη κεφαλίδα μπλοκ 5 byte (με πράσινο στο διάγραμμα), το πεδίο μήκους της οποίας είναι ίσο με το μέγεθος LFH Ν. Προσθέστε μια δεύτερη κεφαλίδα στο τοπικό αρχείο LFH Ν−1 και την κεφαλίδα του κεντρικού καταλόγου CDH Ν−1 που το δείχνει. Ορίστε το πεδίο μεταδεδομένων "συμπιεσμένο μέγεθος" ως τη νέα κεφαλίδα μεγέθους συμπιεσμένου πυρήνα συνΜέγεθος κεφαλίδας ασυμπίεστου μπλοκ (5 byte) συνμέγεθος LFH Ν .

Προς το παρόν, το αρχείο zip περιέχει δύο αρχεία με τα ονόματα Y και Z. Ας δούμε τι θα δει ο αναλυτής κατά την ανάλυση. Ας υποθέσουμε ότι το μέγεθος του συμπιεσμένου πυρήνα είναι 1000 byte και το μέγεθος LFH είναι Ν- 31 byte. Ας ξεκινήσουμε με το CDH Ν−1 και ακολουθήστε τον δείκτη στο LFH Ν−1. Το πρώτο όνομα αρχείου είναι Y και το μέγεθος του αρχείου συμπιεσμένων δεδομένων είναι 1036 byte. Ερμηνεύοντας τα επόμενα 1036 byte ως ροή DEFLATE, συναντάμε πρώτα μια μη συμπιεσμένη κεφαλίδα μπλοκ 5 byte που μας λέει να αντιγράψουμε τα επόμενα 31 byte. Γράψτε τα επόμενα 31 byte, τα οποία είναι LFH Ν, το οποίο αποσυμπιέζουμε και προσθέτουμε στο αρχείο Y. Προχωρώντας περαιτέρω στη ροή DEFLATE, βρίσκουμε ένα συμπιεσμένο μπλοκ (πυρήνα) το οποίο αποσυμπιέζουμε σε αρχείο Y. Έχουμε πλέον φτάσει στο τέλος των συμπιεσμένων δεδομένων και έχουμε τελειώσει με το αρχείο Y.

Προχωρώντας στο επόμενο αρχείο, ακολουθούμε τον δείκτη από το CDH Νστο LFH Νκαι βρείτε ένα αρχείο με το όνομα Z, το συμπιεσμένο μέγεθος του οποίου είναι 1000 byte. Ερμηνεύοντας αυτά τα 1000 byte ως ροή DEFLATE, αμέσως συναντάμε το συμπιεσμένο μπλοκ (ξανά τον πυρήνα) και το αποσυμπιέζουμε στο αρχείο Z. Φτάσαμε τώρα στο τέλος του τελικού αρχείου και τελειώσαμε. Το αρχείο εξόδου Z περιέχει τον μη συσκευασμένο πυρήνα. Το αρχείο εξόδου Y είναι το ίδιο, αλλά επιπλέον έχει το πρόθεμα 31 byte LFH Ν .

Ολοκληρώνουμε το σχέδιο επαναλαμβάνοντας τη διαδικασία της προσφοράς μέχρι το αρχείο zip να περιλαμβάνει τον απαιτούμενο αριθμό αρχείων. Κάθε νέο αρχείο προσθέτει μια κεφαλίδα κεντρικού καταλόγου, μια κεφαλίδα τοπικού αρχείου και ένα ασυμπίεστο μπλοκ για να αναφέρει την αμέσως επόμενη κεφαλίδα τοπικού αρχείου. Τα δεδομένα συμπιεσμένου αρχείου είναι συνήθως μια αλυσίδα από μη συμπιεσμένα μπλοκ DEFLATE (αναφερόμενες κεφαλίδες τοπικού αρχείου) ακολουθούμενα από έναν συμπιεσμένο πυρήνα. Κάθε byte στον πυρήνα συνεισφέρει περίπου 1032 Νστο μέγεθος εξόδου επειδή κάθε byte είναι μέρος όλων Ναρχεία. Τα αρχεία εξόδου έχουν επίσης διαφορετικά μεγέθη: τα προηγούμενα είναι μεγαλύτερα από τα νεότερα επειδή αναφέρουν περισσότερες κεφαλίδες τοπικών αρχείων. Τα περιεχόμενα των αρχείων εξόδου δεν έχουν πολύ νόημα, αλλά κανείς δεν είπε ότι έπρεπε να έχουν νόημα.

Αυτή η κατασκευή αναφοράς επικάλυψης έχει καλύτερη συμβατότητα από την κατασκευή πλήρους επικάλυψης από την προηγούμενη ενότητα, αλλά η συμβατότητα έχει το κόστος της συμπίεσης. Εκεί, κάθε προστιθέμενο αρχείο κοστίζει μόνο την κεφαλίδα του κεντρικού καταλόγου, εδώ κοστίζει την κεφαλίδα του κεντρικού καταλόγου, την κεφαλίδα του τοπικού αρχείου και άλλα 5 byte για την κεφαλίδα παραπομπής.

Βελτιστοποίηση

Έχοντας λάβει το βασικό σχέδιο μιας βόμβας με φερμουάρ, θα προσπαθήσουμε να το κάνουμε όσο το δυνατόν πιο αποτελεσματικό. Θέλουμε να απαντήσουμε σε δύο ερωτήσεις:
  • Ποια είναι η μέγιστη αναλογία συμπίεσης για ένα δεδομένο μέγεθος αρχείου zip;
  • Ποια είναι η μέγιστη αναλογία συμπίεσης δεδομένων των περιορισμών της μορφής zip;

Συμπίεση πυρήνα

Είναι ωφέλιμο για εμάς να συμπιέσουμε τον πυρήνα όσο το δυνατόν περισσότερο, επειδή κάθε byte που δεν έχει συσκευαστεί πολλαπλασιάζεται επί Ν. Για το σκοπό αυτό, χρησιμοποιούμε έναν προσαρμοσμένο συμπιεστή DEFLATE που ονομάζεται bulk_deflate, που ειδικεύεται στη συμπίεση μιας σειράς επαναλαμβανόμενων byte.

Όλοι οι αξιοπρεπείς αρχειοθέτες DEFLATE πλησιάζουν σε αναλογία συμπίεσης 1032 σε μια ατελείωτη ροή επαναλαμβανόμενων byte, αλλά μας ενδιαφέρει το συγκεκριμένο μέγεθος. Στο μέγεθος του αρχείου μας, το bulk_deflate χωράει περισσότερα δεδομένα από τα αρχεία αρχειοθέτησης γενικής χρήσης: περίπου 26 KB περισσότερα από τα zlib και Info-ZIP και περίπου 15 KB περισσότερα από το Zopfli, γεγονός που θυσιάζει την ταχύτητα για την ποιότητα συμπίεσης.

Η τιμή της υψηλής συμπίεσης bulk_deflate είναι η έλλειψη ευελιξίας. Μπορεί να συμπιέσει μόνο σειρές επαναλαμβανόμενων byte και μόνο ένα συγκεκριμένο μήκος, δηλαδή 517 + 258 κγια ακέραιο κ≥ 0. Εκτός από την καλή συμπίεση, το bulk_deflate είναι γρήγορο, ολοκληρώνοντας την εργασία ουσιαστικά στον ίδιο χρόνο, ανεξάρτητα από το μέγεθος των δεδομένων εισόδου, χωρίς να υπολογίζεται η εργασία της πραγματικής εγγραφής της συμπιεσμένης συμβολοσειράς.

Ονόματα αρχείων

Για τους σκοπούς μας, τα ονόματα αρχείων έχουν πρακτικά νεκρό βάρος. Παρόλο που συνεισφέρουν στο μέγεθος της εξόδου αποτελώντας μέρος των εισαγωγικών κεφαλίδων των τοπικών αρχείων, ένα byte στο όνομα αρχείου συνεισφέρει πολύ λιγότερο από ένα byte στον πυρήνα. Θέλουμε τα ονόματα αρχείων να είναι όσο το δυνατόν πιο σύντομα, αλλά διαφορετικά, χωρίς να ξεχνάμε τη συμβατότητα.

Κάθε byte που δαπανάται σε ένα όνομα αρχείου σημαίνει δύο byte που δεν ξοδεύονται στον πυρήνα (δύο επειδή κάθε όνομα αρχείου εμφανίζεται δύο φορές: στην κεφαλίδα του κεντρικού καταλόγου και στην κεφαλίδα του τοπικού αρχείου). Ένα byte ονόματος αρχείου καταλήγει σε μέσο όρο μόνο ( Ν+ 1) / 4 byte εξόδου, ενώ ένα byte στον πυρήνα μετράται ως 1032 Ν. Παραδείγματα: , , .

Το πρώτο ζήτημα συμβατότητας είναι η κωδικοποίηση. Η προδιαγραφή μορφής zip αναφέρει ότι τα ονόματα αρχείων πρέπει να ερμηνεύονται ως CP 437 ή UTF-8 εάν έχει οριστεί ένα συγκεκριμένο bit σημαίας (APPNOTE.TXT, Παράρτημα Δ). Αυτό είναι ένα σημαντικό σημείο ασυμβατότητας μεταξύ των συντελεστών ανάλυσης zip, οι οποίοι ενδέχεται να ερμηνεύουν ονόματα αρχείων σε κάποια σταθερή ή συγκεκριμένη κωδικοποίηση τοπικών ρυθμίσεων. Επομένως, για συμβατότητα, είναι καλύτερο να περιοριστείτε σε χαρακτήρες με την ίδια κωδικοποίηση τόσο στο CP 437 όσο και στο UTF-8. Δηλαδή, είναι 95 εκτυπώσιμοι χαρακτήρες US-ASCII.

Δεσμευόμαστε επίσης από περιορισμούς ονομασίας συστήματος αρχείων. Ορισμένα συστήματα αρχείων δεν έχουν διάκριση πεζών-κεφαλαίων, επομένως το "a" και το "A" δεν θεωρούνται διαφορετικά ονόματα. Τα κοινά συστήματα αρχείων όπως το FAT32 δεν επιτρέπουν ορισμένους χαρακτήρες όπως "*" και "?".

Ως ασφαλής, αλλά όχι απαραίτητα βέλτιστος συμβιβασμός, το zip bomb μας θα χρησιμοποιεί ονόματα αρχείων από το αλφάβητο των 36 χαρακτήρων, το οποίο δεν περιλαμβάνει ειδικούς ή μεικτούς χαρακτήρες:

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Τα ονόματα των αρχείων δημιουργούνται με τον προφανή τρόπο, όλες οι θέσεις με τη σειρά, με την προσθήκη μιας θέσης στο τέλος του βρόχου:

"0", "1", "2", ..., "Z", "00", "01", "02", ..., "0Z", ..., "Z0", "Z1 ", "Z2", ..., "ZZ", "000", "001", "002", ...
Υπάρχουν 36 ονόματα αρχείων με μήκος ενός χαρακτήρα, 36² ονόματα αρχείων με μήκος δύο χαρακτήρες και ούτω καθεξής. Τέσσερα byte είναι αρκετά για 1.727.604 διαφορετικά ονόματα αρχείων.

Δεδομένου ότι τα ονόματα αρχείων σε ένα αρχείο θα έχουν συνήθως διαφορετικά μήκη, ποιος είναι ο καλύτερος τρόπος να τα παραγγείλετε: από το συντομότερο στο μεγαλύτερο ή το αντίστροφο; Αν το σκεφτείς λίγο, καλύτερα να βάλεις τελευταία τα μακροσκελή ονόματα. Αυτή η παραγγελία προσθέτει πάνω από 900 MB εξόδου στο zblg.zip, σε σύγκριση με την παραγγελία από το μεγαλύτερο στο μικρότερο. Ωστόσο, αυτή είναι μια μικρή βελτιστοποίηση, επειδή τα 900 MB είναι μόνο το 0,0003% του συνολικού μεγέθους εξόδου.

Μέγεθος πυρήνα

Ο σχεδιασμός επικάλυψης παραπομπών επιτρέπει την αποθήκευση ενός συμπιεσμένου πυρήνα δεδομένων και στη συνέχεια την αντιγραφή πολλές φορές φθηνά. Για συγκεκριμένο μέγεθος αρχείου zip Χ, πόσος χώρος είναι ο βέλτιστος να διατεθεί για την αποθήκευση του πυρήνα και πόσος για τη δημιουργία αντιγράφων;

Για να βρείτε τη βέλτιστη ισορροπία, χρειάζεται μόνο να βελτιστοποιήσετε μία μεταβλητή Ν, αριθμός αρχείων στο αρχείο zip. Κάθε τιμή Ναπαιτεί ένα ορισμένο ποσό επιβάρυνσης για κεφαλίδες κεντρικού καταλόγου, κεφαλίδες τοπικών αρχείων, κεφαλίδες μπλοκ εισαγωγικών και ονόματα αρχείων. Όλος ο υπόλοιπος χώρος θα καταληφθεί από τον πυρήνα. Επειδή η Νπρέπει να είναι ακέραιος και μπορείτε να χωρέσετε μόνο έναν συγκεκριμένο αριθμό αρχείων πριν το μέγεθος του πυρήνα πέσει στο μηδέν, απλώς ελέγξτε κάθε πιθανή τιμή Νκαι επιλέξτε αυτό που δίνει τα καλύτερα αποτελέσματα.

Εφαρμογή της διαδικασίας βελτιστοποίησης σε Χ= 42.374 για το 42.zip βρίσκει το μέγιστο στο Ν= 250. Αυτά τα 250 αρχεία απαιτούν 21.195 byte επιβάρυνσης, αφήνοντας 21.179 byte για τον πυρήνα. Ένας πυρήνας αυτού του μεγέθους αποσυμπιέζεται σε 21.841.249 byte (αναλογία 1031,3 προς 1). 250 αντίγραφα του μη συσκευασμένου πυρήνα συν μερικές κεφαλίδες τοπικού αρχείου σε εισαγωγικά δίνουν μια συνολική αποσυμπιεσμένη έξοδο 5.461.307.620 byte και μια αναλογία συμπίεσης 129.000.

Το CRC-32 μπορεί να μοντελοποιηθεί ως μηχάνημα κατάστασης που ενημερώνει έναν καταχωρητή κατάστασης 32 bit για κάθε bit εισόδου. Οι βασικές λειτουργίες ενημέρωσης για τα bit 0 και 1 είναι:

Uint32 crc32_update_0(uint32 κατάσταση) ( // Μετατόπιση του λιγότερο σημαντικού bit. bit b = κατάσταση & 1; κατάσταση = κατάσταση >> 1; // Εάν το bit μετατόπισης ήταν 1, XOR με τη σταθερά CRC-32. εάν (b == 1) κατάσταση = κατάσταση ^ 0xedb88320 επιστροφής κατάσταση ) uint32 crc32_update_1(uint32 κατάσταση) ( // Κάντε όπως για ένα bit 0, μετά XOR με τη σταθερά CRC-32. return crc32_update_0(state) ^ 320;
Εάν αντιπροσωπεύετε τον καταχωρητή κατάστασης ως ένα δυαδικό διάνυσμα 32 στοιχείων και χρησιμοποιείτε το XOR για πρόσθεση και πολλαπλασιασμό, τότε το crc32_update_0 είναι μια γραμμική αντιστοίχιση. Δηλαδή, μπορεί να αναπαρασταθεί ως πολλαπλασιασμός με έναν πίνακα δυαδικής μετάβασης 32x32. Για να καταλάβετε γιατί, σημειώστε ότι ο πολλαπλασιασμός πίνακα-διανύσματος είναι απλώς το άθροισμα των στηλών του πίνακα μετά τον πολλαπλασιασμό κάθε στήλης με το αντίστοιχο στοιχείο του διανύσματος. Η κατάσταση λειτουργίας shift >> 1 παίρνει απλώς κάθε bit Εγώδιάνυσμα κατάστασης και το πολλαπλασιάζει με ένα διάνυσμα που είναι μηδέν παντού εκτός από το bit Εγώ− 1 (αρίθμηση bit από δεξιά προς τα αριστερά). Σχετικά μιλώντας, η τελική κατάσταση XOR ^ 0xedb88320 εμφανίζεται μόνο όταν το bit b είναι ίσο με ένα. Αυτό μπορεί να θεωρηθεί ως πολλαπλασιασμός του b με 0xedb88320 και μετά XOR σε αυτήν την κατάσταση.

Επίσης, το crc32_update_1 είναι απλώς crc32_update_0 συν μια σταθερά (XOR). Αυτό κάνει το crc32_update_1 έναν συγγενικό μετασχηματισμό: πολλαπλασιασμός πίνακα ακολουθούμενο από αντιστοίχιση (δηλαδή, πρόσθεση διανύσματος). Μπορούμε να αναπαραστήσουμε τον πολλαπλασιασμό και την αντιστοίχιση μήτρας σε ένα βήμα αν αυξήσουμε τις διαστάσεις του πίνακα μετασχηματισμού σε 33x33 και προσθέσουμε ένα επιπλέον στοιχείο στο διάνυσμα κατάστασης, το οποίο είναι πάντα ίσο με 1 (αυτή η αναπαράσταση ονομάζεται ομογενείς συντεταγμένες).


Πίνακες μετασχηματισμού 33×33 M 0 και M 1 που υπολογίζουν την αλλαγή κατάστασης CRC-32 που γίνεται από τα bit 0 και 1, αντίστοιχα. Τα διανύσματα στηλών αποθηκεύονται με το πιο σημαντικό bit στο κάτω μέρος: διαβάζοντας την πρώτη στήλη από κάτω προς τα πάνω, βλέπετε την πολυωνυμική σταθερά CRC-32 edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2 . Οι δύο πίνακες διαφέρουν μόνο στην τελική στήλη, η οποία αντιπροσωπεύει το διάνυσμα μετάφρασης σε ομοιόμορφες συντεταγμένες. Στο M 0 η μετάφραση είναι μηδέν και στο M 1 είναι edb88320 16, μια πολυωνυμική σταθερά CRC-32. Τα αμέσως πάνω από τη διαγώνιο αντιπροσωπεύουν την κατάσταση της κατάστασης λειτουργίας >> 1

Και οι δύο λειτουργίες crc32_update_0 και crc32_update_1 μπορούν να αναπαρασταθούν από έναν πίνακα μετάβασης 33x33. Οι μήτρες Μ 0 και Μ 1 φαίνονται. Το πλεονέκτημα της αναπαράστασης πίνακα είναι ότι οι πίνακες μπορούν να πολλαπλασιαστούν. Ας υποθέσουμε ότι θέλουμε να δούμε την αλλαγή κατάστασης που παράγεται με την επεξεργασία του χαρακτήρα ASCII "a", του οποίου η δυαδική αναπαράσταση είναι 01100001 2 . Μπορούμε να αναπαραστήσουμε την αθροιστική αλλαγή κατάστασης CRC-32 αυτών των οκτώ bit σε έναν μόνο πίνακα μετασχηματισμού:


Και μπορούμε να φανταστούμε την αλλαγή στην κατάσταση μιας σειράς επαναλαμβανόμενων "a" πολλαπλασιάζοντας πολλά αντίγραφα του M a - αυξάνοντας τη μήτρα σε μια ισχύ. Μπορούμε να το κάνουμε αυτό γρήγορα χρησιμοποιώντας τον αλγόριθμο γρήγορης εκθέσεως, ο οποίος μας επιτρέπει να υπολογίσουμε το M n σε μόλις log 2 n βήματα. Για παράδειγμα, εδώ είναι ένας πίνακας αλλαγής κατάστασης για μια συμβολοσειρά 9 χαρακτήρων "a":
Ο αλγόριθμος πολλαπλασιασμού γρήγορης μήτρας είναι χρήσιμος για τον υπολογισμό του πυρήνα M, ο πίνακας για έναν μη συμπιεσμένο πυρήνα, αφού ο πυρήνας είναι μια σειρά από επαναλαμβανόμενα byte. Για να λάβετε ένα άθροισμα ελέγχου CRC-32 από έναν πίνακα, πολλαπλασιάστε τον πίνακα με το μηδενικό διάνυσμα (το μηδενικό διάνυσμα είναι σε ομοιόμορφες συντεταγμένες, δηλαδή 32 μηδενικά και μετά ένα· εδώ παραλείπουμε τη δευτερεύουσα επιπλοκή του προ- και του μετα- επεξεργασία του αθροίσματος ελέγχου για αντιστοίχιση). Για να υπολογίσουμε το άθροισμα ελέγχου για κάθε αρχείο, εργαζόμαστε αντίστροφα. Ας ξεκινήσουμε με την προετοιμασία M:=M πυρήνας. Το άθροισμα ελέγχου του πυρήνα είναι επίσης το τελικό άθροισμα ελέγχου αρχείου Ν, άρα πολλαπλασιάζουμε Μστο μηδενικό διάνυσμα και αποθηκεύστε το άθροισμα ελέγχου που προκύπτει σε CDH N και LFH N . Δεδομένα αρχείου N−1όπως και τα δεδομένα αρχείου Ν, αλλά με προσθήκη του προθέματος LFH N. Επομένως, υπολογίζουμε τον πίνακα αλλαγής κατάστασης για το LFH N και τον ενημερώνουμε. Τώρα Μαντιπροσωπεύει τη αθροιστική αλλαγή κατάστασης από την επεξεργασία LFH N ανά πυρήνα. Υπολογίστε το άθροισμα ελέγχου για το αρχείο N−1, πολλαπλασιάζοντας ξανά Μστο μηδενικό διάνυσμα. Συνεχίζουμε τη διαδικασία, συσσωρεύοντας πίνακες αλλαγής κατάστασης Μμέχρι να ολοκληρωθεί η επεξεργασία όλων των αρχείων.

Επέκταση: Zip64

Προηγουμένως, αντιμετωπίσαμε ένα πρόβλημα επέκτασης λόγω των περιορισμών της μορφής zip - ήταν αδύνατο να εξάγουμε περισσότερα από 281 TB, ανεξάρτητα από το πόσο έξυπνα ήταν συσκευασμένο το αρχείο zip. Είναι δυνατό να ξεπεραστούν αυτοί οι περιορισμοί χρησιμοποιώντας το Zip64, μια επέκταση στη μορφή zip που αυξάνει το μέγεθος ορισμένων πεδίων κεφαλίδας σε 64 bit. Η υποστήριξη Zip64 δεν είναι σε καμία περίπτωση καθολική, αλλά είναι μια από τις πιο συχνά υλοποιούμενες επεκτάσεις. Όσον αφορά την αναλογία συμπίεσης, το αποτέλεσμα του Zip64 είναι να αυξήσει το μέγεθος της κεφαλίδας του κεντρικού καταλόγου από 46 σε 58 byte και το μέγεθος της κεφαλίδας του τοπικού καταλόγου από 30 σε 50 byte. Εξετάζοντας τον τύπο για τον βέλτιστο συντελεστή επέκτασης σε ένα απλοποιημένο μοντέλο, βλέπουμε ότι η φερμουάρ Zip64 εξακολουθεί να αναπτύσσεται τετραγωνικά, αλλά με πιο αργό ρυθμό λόγω του μεγαλύτερου παρονομαστή - όπως φαίνεται στο παρακάτω διάγραμμα. Λόγω της απώλειας συμβατότητας και της βραδύτερης ανάπτυξης, σχεδόν όλοι οι περιορισμοί στο μέγεθος του αρχείου καταργούνται.

Ας υποθέσουμε ότι θέλουμε ένα zip bomb που επεκτείνεται στα 4,5 PB όπως το 42.zip. Πόσο μεγάλο πρέπει να είναι το αρχείο; Χρησιμοποιώντας δυαδική αναζήτηση, διαπιστώνουμε ότι το ελάχιστο μέγεθος ενός τέτοιου αρχείου είναι 46 MB.

  • zbxl.zip 46 MB → 4,5 PB (Zip64, λιγότερο συμβατό)
zipbomb --mode=quoted_overlap --num-files=190023 --compressed-size=22982788 --zip64 > zbxl.zip
4,5 petabyte - αυτός είναι περίπου ο όγκος των δεδομένων που κατέγραψε το τηλεσκόπιο Event Horizon για την πρώτη εικόνα μιας μαύρης τρύπας: rack και rack σκληρών δίσκων σε ένα κέντρο δεδομένων.

Με το Zip64, δεν είναι πια ενδιαφέρον να εξετάσουμε τη μέγιστη αναλογία συμπίεσης, επειδή μπορούμε απλώς να συνεχίσουμε να αυξάνουμε το μέγεθος του αρχείου zip και την αναλογία συμπίεσης μαζί του, έως ότου ακόμη και ένα συμπιεσμένο αρχείο zip γίνει απαγορευτικά μεγάλο. Ένα ενδιαφέρον όριο, ωστόσο, είναι τα 2 64 byte (18 EB ή 16 EiB) - αυτά δεν είναι πολλά δεδομένα που θα χωρέσουν στα περισσότερα συστήματα αρχείων. Η δυαδική αναζήτηση βρίσκει το μικρότερο zip bomb που παράγει τουλάχιστον τόση έξοδο: περιέχει 12 εκατομμύρια αρχεία και έναν συμπιεσμένο πυρήνα 1,5 GB. Το συνολικό μέγεθος του αρχείου zip είναι 2,9 GB και αποσυμπιέζεται σε 264+11727895877 byte με αναλογία συμπίεσης πάνω από 6,2 δισεκατομμύρια προς ένα. Δεν έχω κάνει αυτό το αρχείο διαθέσιμο για λήψη, αλλά μπορείτε να το δημιουργήσετε μόνοι σας χρησιμοποιώντας . Τα αρχεία του είναι τόσο μεγάλα που ανακαλύφθηκε ακόμη και ένα σφάλμα στο Info-ZIP UnZip 6.0.

Zipbomb --mode=quoted_overlap --num-files=12056313 --compressed-size=1482284040 --zip64 > zbxxl.zip

Επέκταση: bzip2

Το DEFLATE είναι ο πιο κοινός αλγόριθμος συμπίεσης για τη μορφή zip, αλλά είναι μόνο μία από τις πολλές επιλογές. Πιθανώς ο δεύτερος πιο διαδεδομένος αλγόριθμος είναι ο bzip2. Αν και δεν είναι τόσο συμβατό όσο το DEFLATE. Θεωρητικά, το bzip2 έχει μέγιστο λόγο συμπίεσης περίπου 1,4 εκατομμύριο προς ένα, που επιτρέπει την πυκνότερη συσκευασία του πυρήνα.

Το Bzip2 κωδικοποιεί πρώτα την κωδικοποίηση μήκους εκτέλεσης, μειώνοντας το μήκος της σειράς των επαναλαμβανόμενων byte κατά 51 φορές. Στη συνέχεια, τα δεδομένα χωρίζονται σε μπλοκ 900 KB και κάθε μπλοκ συμπιέζεται χωριστά. Θεωρητικά, ένα μπλοκ μπορεί να συμπιεστεί σε 32 byte. 900.000 × 51 / 32 = 1.434.375.

Αγνοώντας τις απώλειες συμβατότητας, το bzip2 κάνει πιο αποτελεσματική βόμβα;

Ναι - αλλά μόνο για μικρά αρχεία. Το πρόβλημα είναι ότι το bzip2 δεν έχει τίποτα σαν τα ασυμπίεστα μπλοκ DEFLATE που χρησιμοποιούσαμε για να αναφέρουμε κεφαλίδες τοπικών αρχείων. Έτσι, δεν είναι δυνατή η επικάλυψη αρχείων και η επαναχρησιμοποίηση του πυρήνα - κάθε αρχείο πρέπει να γράψει το δικό του αντίγραφο, επομένως η συνολική αναλογία συμπίεσης δεν θα είναι καλύτερη από την αναλογία για οποιοδήποτε μεμονωμένο αρχείο. Στο παρακάτω γράφημα βλέπουμε ότι χωρίς επικάλυψη, το bzip2 υπερτερεί του DEFLATE μόνο για αρχεία μεγέθους γύρω στα megabyte.

Η μόνη ελπίδα που απομένει είναι ένα εναλλακτικό μέσο αναφοράς κεφαλίδων στο bzip2, το οποίο συζητείται στην επόμενη ενότητα. Επίσης, εάν γνωρίζετε ότι ένας συγκεκριμένος αναλυτής zip υποστηρίζει το bzip2 Καιεπιτρέπει αναντιστοιχίες ονομάτων αρχείου, μπορείτε να χρησιμοποιήσετε την κατασκευή πλήρους επικάλυψης, η οποία δεν χρειάζεται παράθεση.

Σύγκριση αναλογιών συμπίεσης διαφορετικών φερμουάρ. Σημειώστε τους λογαριθμικούς άξονες. Κάθε σχέδιο εμφανίζεται με και χωρίς Zip64. Οι κατασκευές χωρίς επικάλυψη έχουν γραμμικό ρυθμό ανάπτυξης, ο οποίος φαίνεται από τη σταθερή αναλογία των αξόνων. Η κατακόρυφη μετατόπιση του γραφήματος bzip2 σημαίνει ότι ο λόγος συμπίεσης του bzip2 είναι περίπου χίλιες φορές μεγαλύτερος από αυτόν του DEFLATE. Οι κατασκευές DEFLATE με παραπομπές έχουν τετραγωνικό ρυθμό ανάπτυξης, όπως αποδεικνύεται από μια κλίση 2:1 προς τους άξονες. Η επιλογή Zip64 είναι ελαφρώς λιγότερο αποτελεσματική, αλλά επιτρέπει πάνω από 281 TB. Τα γραφήματα για bzip2 με παραπομπή μέσω ενός πρόσθετου πεδίου μεταβαίνουν από το τετραγωνικό σε γραμμικό όταν επιτευχθεί είτε το μέγιστο μέγεθος αρχείου (2 32 −2 byte) είτε ο μέγιστος επιτρεπόμενος αριθμός αρχείων

Επέκταση: παραπομπή μέσω πρόσθετου πεδίου

Μέχρι στιγμής χρησιμοποιούσαμε τη συνάρτηση DEFLATE για να αναφέρουμε κεφαλίδες τοπικών αρχείων και μόλις είδαμε ότι αυτό το κόλπο δεν λειτουργεί στο bzip2. Ωστόσο, υπάρχει μια εναλλακτική μέθοδος αναφοράς, κάπως πιο περιορισμένη, που χρησιμοποιεί μόνο τις δυνατότητες μορφής zip και είναι ανεξάρτητη από τον αλγόριθμο συμπίεσης.

Στο τέλος της δομής κεφαλίδας τοπικού αρχείου υπάρχει πρόσθετο πεδίομεταβλητού μήκους για την αποθήκευση πληροφοριών που δεν χωρούν σε κανονικά πεδία κεφαλίδας (APPNOTE.TXT, ενότητα 4.3.7). Οι πρόσθετες πληροφορίες μπορεί να περιλαμβάνουν, για παράδειγμα, μια χρονική σήμανση ή ένα uid/gid από το Unix. Οι πληροφορίες Zip64 αποθηκεύονται επίσης σε ένα πρόσθετο πεδίο. Το πρόσθετο πεδίο αντιπροσωπεύεται ως δομή μήκους-τιμής. Εάν αυξήσετε το μήκος χωρίς να προσθέσετε μια τιμή, το επιπλέον πεδίο θα περιλαμβάνει ό,τι βρίσκεται πίσω από αυτό στο αρχείο zip, δηλαδή την επόμενη κεφαλίδα του τοπικού αρχείου. Χρησιμοποιώντας αυτήν τη μέθοδο, κάθε τοπική κεφαλίδα αρχείου μπορεί να "αναφέρει" τις επόμενες κεφαλίδες περικλείοντάς τις στο δικό της πρόσθετο πεδίο. Σε σύγκριση με το DEFLATE υπάρχουν τρία πλεονεκτήματα:

  1. Η παράθεση μέσω του επιπλέον πεδίου απαιτεί μόνο 4 byte αντί 5, αφήνοντας περισσότερο χώρο για τον πυρήνα.
  2. Δεν αυξάνει το μέγεθος του αρχείου, πράγμα που σημαίνει μεγαλύτερο μέγεθος πυρήνα δεδομένων των περιορισμών της μορφής zip.
  3. Παρέχει παραπομπή στο bzip2.
Παρά αυτά τα πλεονεκτήματα, η παραπομπή μέσω πρόσθετων πεδίων είναι λιγότερο ευέλικτη. Αυτό δεν είναι αλυσίδα, όπως στο DEFLATE: κάθε τοπική κεφαλίδα αρχείου πρέπει να περιέχει όχι μόνο την αμέσως επόμενη κεφαλίδα, αλλά και Ολαεπόμενες επικεφαλίδες. Πρόσθετα πεδία αυξάνονται όσο πλησιάζετε στην αρχή του αρχείου zip. Δεδομένου ότι το μέγιστο μήκος πεδίου είναι 2 16 −1 byte, μπορείτε να αναφέρετε μόνο έως και 1808 τοπικές κεφαλίδες αρχείων (ή 1170 στο Zip64), υποθέτοντας ότι τα ονόματα (στην περίπτωση του DEFLATE, μπορείτε να χρησιμοποιήσετε ένα πρόσθετο πεδίο για να αναφέρετε το πρώτο (οι συντομότερες) κεφαλίδες τοπικών αρχείων και, στη συνέχεια, μεταβείτε στην παράθεση DEFLATE για τα υπόλοιπα). Ένα άλλο πρόβλημα: για να ταιριάξετε την εσωτερική δομή δεδομένων του πρόσθετου πεδίου, πρέπει να επιλέξετε μια ετικέτα 16-bit για τον τύπο (APPNOTE.TXT, ενότητα 4.5.2) που προηγείται των δεδομένων παραπομπής. Θέλουμε να επιλέξουμε μια ετικέτα τύπου που θα κάνει τους αναλυτές να αγνοούν τα δεδομένα που αναφέρονται σε εισαγωγικά αντί να προσπαθήσουν να τα ερμηνεύσουν ως μεταδεδομένα με νόημα. Οι αναλυτές zip πρέπει να αγνοούν ετικέτες άγνωστου τύπου, ώστε να μπορούμε να επιλέγουμε τυχαία ετικέτες, αλλά υπάρχει ο κίνδυνος στο μέλλον κάποια ετικέτα να σπάσει τη συμβατότητα σχεδίασης.

Το προηγούμενο διάγραμμα απεικονίζει τη δυνατότητα χρήσης πρόσθετων πεδίων στο bzip2, με και χωρίς Zip64. Και τα δύο γραφήματα έχουν ένα σημείο καμπής όπου η ανάπτυξη μετακινείται από το τετραγωνικό σε γραμμικό. Χωρίς Zip64, αυτό συμβαίνει όταν επιτυγχάνεται το μέγιστο μέγεθος ασυμπίεστου αρχείου (2 32 −2 byte). τότε μπορείτε να αυξήσετε μόνο τον αριθμό των αρχείων, αλλά όχι το μέγεθός τους. Το γράφημα τελειώνει εντελώς όταν ο αριθμός των αρχείων φτάσει τα 1809, τότε εξαντλείται ο χώρος στο πρόσθετο πεδίο για να παραθέσουμε πρόσθετους τίτλους. Με το Zip64, το σημείο θραύσης εμφανίζεται στα 1171 αρχεία, μετά το οποίο μπορεί να αυξηθεί μόνο το μέγεθος των αρχείων, αλλά όχι ο αριθμός τους. Το πρόσθετο πεδίο βοηθά επίσης στην περίπτωση του DEFLATE, αλλά η διαφορά είναι τόσο μικρή που δεν γίνεται οπτικά αισθητή. Αυξάνει την αναλογία συμπίεσης του zbsm.zip κατά 1,2%. zblg.zip κατά 0,019%; και zbxl.zip κατά 0,0025%.

Συζήτηση

Στην εργασία τους πάνω σε αυτό το θέμα, ο Ploetz και οι συνεργάτες του χρησιμοποιούν επικάλυψη αρχείων για να δημιουργήσουν ένα αρχείο zip σχεδόν αυτοαναπαραγόμενο. Η ίδια η επικάλυψη αρχείων προτάθηκε νωρίτερα (διαφάνεια 47) από τον Ginvael Coldwind.

Σχεδιάσαμε τη σχεδίαση φερμουάρ για να λάβουμε υπόψη τη συμβατότητα - ορισμένες διαφορές εφαρμογής, μερικές από τις οποίες φαίνονται στον παρακάτω πίνακα. Το σχέδιο που προκύπτει είναι συμβατό με zip parsers, οι οποίοι λειτουργούν με τον συνήθη τρόπο, δηλαδή ελέγχοντας πρώτα έναν κεντρικό κατάλογο και χρησιμοποιώντας τον ως ευρετήριο αρχείων. Μεταξύ αυτών είναι το μοναδικό zip parser από το Nail, το οποίο δημιουργείται αυτόματα από την επίσημη γραμματική. Ωστόσο, η σχεδίαση δεν είναι συμβατή με τους αναλυτές "ροής", οι οποίοι αναλύουν ένα αρχείο zip από την αρχή μέχρι το τέλος σε ένα μόνο πέρασμα χωρίς να διαβάσουν πρώτα τον κεντρικό κατάλογο. Από τη φύση τους, οι αναλυτές ροής δεν επιτρέπουν την επικάλυψη αρχείων με κανέναν τρόπο. Το πιθανότερο είναι ότι θα εξαγάγουν μόνο το πρώτο αρχείο. Επιπλέον, μπορεί να ρίξουν ακόμη και ένα σφάλμα, όπως συμβαίνει με

mob_info