ZIP-Bombe neu gedacht

ZIP-Bomben (oder Archivbomben im allgemeinen) sind ZIP-Dateien, welche beim dekomprimieren sehr groß werden. Der bekannteste Vertreter dieser Spezies ist die 42.zip. Bei dieser ZIP-Datei werden rekursiv immer weitere Dateien entpackt. Dies führt dazu das die 42 Kilobyte große Datei am Ende 4,5 Petabyte Speicherplatz auf der Festplatte benötigt. Solche Dateien werden meist benutzt, um Virenscanner in die Knie zu zwingen, da diese versuchen die Datei zu entpacken und dabei in den meisten Fällen scheitern.

David Fifield hat nun eine neue Art von ZIP-Bombe gebaut, welche ohne Rekursion auskommt. Das Problem ist das für die 42.zip alle Dateien entpackt werden müssen und nicht nur die erste Ebene. Er verfolgte zwei Ziele: maximale Kompressionsrate und das Ganze sollte möglichst kompatibel bleiben:

Maximize the compression ratio. We define the compression ratio as the the sum of the sizes of all the files contained the in the zip file, divided by the size of the zip file itself. It does not count filenames or other filesystem metadata, only contents.

Be compatible. Zip is a tricky format and parsers differ, especially around edge cases and optional features. Avoid taking advantage of tricks that only work with certain parsers. We will remark on certain ways to increase the efficiency of the zip bomb that come with some loss of compatibility.

Mit dieser neuen Art der ZIP-Bombe, welche überlappende Dateien innerhalb des ZIP-Container nutzt, kommt er auf folgende Werte:

zbsm.zip	42 kB	→	5.5 GB
zblg.zip	10 MB	→	281 TB
zbxl.zip	46 MB	→	4.5 PB (Zip64, less compatible)

Im Detail wird die neue ZIP-Bombe auf bamsoftware.com erklärt; dort lassen sich auch entsprechende Beispiele herunterladen. Nur entpackt werden sollten die Beispiele natürlich nicht.

TripMode; unterwegs effizient im Internet

Wer öfters unterwegs ist und von unterwegs das Internet mit seinem MacBook nutzen möchte, der kann dies in Verbindung mit einem iPhone als WLAN-Hotspot oder über ein entsprechendes anderes WLAN tun. Problematisch wird es, wenn die Kapazität des WLAN oder des Datentarifs arg beschränkt ist. An dieser Stelle kommt die Software TripMode ins Spiel.

TripMode unter macOS

Bei TripMode handelt es sich um eine Anwendung, welche es bei Bedarf ermöglicht nur bestimmte Anwendungen in das Netz zu lassen. Somit wird das Datenvolumen nicht unnötig durch irgendwelche Hintergrundprozesse oder Synchronisierungsdienste wie Dropbox und Co. verbraucht. Bezogen werden kann TripMode über die Seite des Herstellers unter tripmode.ch. Neben einer Version für macOS steht dort auch eine Version für Windows zur Verfügung.

Exception-Hierarchie unter Java

Java nutzt, wie viele andere Sprachen, Exceptions zur Fehlersignalisierung und Fehlerbehandlung. Folgender Code würde hierbei dem Anschein nach alle Exceptions fangen:

try {
  // Do something wrong
} catch(Exception e) {
  // Gotta Catch 'Em All
}

An dieser Stelle trügt der Schein nicht. Allerdings werden nur einige Fehlerklassen gefangen, nämlich nur solche vom Typ Exception. Die Hierarchie der Fehlerklassen ist unter Java ein wenig differenzierter. In Java erbt jede Klasse implizit von der Klasse Object und so erbt auch die Klasse Throwable von dieser und implementiert das Interface Serializable.

Die Hierarchie der Klassen, welche für Fehlersignalisierung zuständig sind

Von der Klasse Throwable wiederum erben die Klassen Error und Exception. Fehler vom Typ Error stellen laut Definition immer Fehler innerhalb der JVM da, während Exceptions gewöhnliche Fehler des Programmes bzw. des Entwicklers sind. Sollen nun alle Fehlerklassen gefangen werden, so müsste der Quellcode wie folgt aussehen:

try {
  // Do something wrong
} catch(Throwable t) {
  // Gotta Catch 'Em All
}

Das Beispiel sollte nur als solches betrachtet werden, da es sich immer empfiehlt spezielle Fehler zu fangen und zu behandeln. Ein solch allgemeiner Fehlerhandler eignet sich nur für Spezialfälle wie z.B. das Logging nicht behandelter Fehler. Die Hierarchie verästelt sich anschließend noch weiter, so erben unterschiedlichste Klassen von der Klasse Error. Bei der Klasse Exception sieht dies ähnlich aus, allerdings existiert hier eine Besonderheit, die Klasse RuntimeException. Normalerweise muss eine Methode Exceptions, die sie wirft im Methodenkopf bekannt geben, wenn sie nicht in der Methode behandelt werden:

public static void example() throws Exception {
  throw new Exception();
}

Bei Klassen die von der Klasse RuntimeException erben muss diese Bekanntmachung im Methodenkopf nicht erfolgen. Sie werden trotzdem nach oben durchgereicht bis sie gefangen werden oder sich das Programm beendet, wenn die Behandlung der Exception nicht durchgeführt wurde.