DedSec Project

Ασφαλής επιθεώρηση αρχείων: nesting, symlinks και όρια μεγέθους — DedSec Project

Πρώτα επιθεώρηση ZIP, μετά ελεγχόμενη εξαγωγή Έλεγξε ονόματα και όρια Τα μέλη ενός αρχείου μπορεί να περιέχουν ../ , απόλυτα paths, διπλά ονόματα ή separators άλλου λειτουργικού. Επίσης το…

Πρώτα επιθεώρηση ZIP, μετά ελεγχόμενη εξαγωγή

Έλεγξε ονόματα και όρια

Τα μέλη ενός αρχείου μπορεί να περιέχουν ../, απόλυτα paths, διπλά ονόματα ή separators άλλου λειτουργικού. Επίσης το δηλωμένο αποσυμπιεσμένο μέγεθος μπορεί να είναι τεράστιο σε σχέση με το ZIP. Πριν δεχτείς άγνωστο archive όρισε μέγιστο αριθμό μελών, συνολικά bytes και όριο ανά αρχείο. Η κανονικοποίηση path δεν πρέπει να επιτρέπει έξοδο από τον επιλεγμένο φάκελο.

from pathlib import PurePosixPath
names = ["docs/readme.txt", "../outside.txt", "/absolute/config"]
for name in names:
    parts = PurePosixPath(name.replace("\\", "/")).parts
    safe = not name.startswith(("/", "\\")) and ".." not in parts
    print(name, safe)

Πριν γράψεις ένα byte

Ονόματα A.txt και a.txt μπορούν να συγκρουστούν σε case-insensitive filesystem. Διπλές διαδρομές μπορεί να αντιμετωπίζονται διαφορετικά από extractors. Symlink μπορεί να δείχνει εκτός του επιτρεπόμενου φακέλου παρότι το δικό του όνομα φαίνεται σωστό. Έλεγξε τον τελικό στόχο και απόρριψε τύπους link που δεν υποστηρίζεις αντί να αφαιρείς πρόχειρα κακόβουλες διαδρομές.

Άσκηση με σκόπιμα άκυρες εγγραφές

Δημιούργησε μικρό ZIP με ένα ασφαλές path, μία διαδρομή traversal και δύο ονόματα που διαφέρουν μόνο σε κεφαλαία. Μην το αποσυμπιέσεις σε πραγματικό project. Φτιάξε validator που επιστρέφει λίστα απορρίψεων. Σωστή συμπεριφορά είναι σαφής αποτυχία ή απομονωμένη εξαγωγή με καθορισμένη πολιτική, όχι μερική ανεξέλεγκτη εγγραφή.

Απόδειξη ασφάλειας

Κατάγραψε τα όρια και επαλήθευσε ότι δεν γράφτηκε τίποτα εκτός προσωρινού extraction root. Σωστό CRC δεν αποδεικνύει ασφαλή διαδρομή, επιτρεπτό μέγεθος ή αξιόπιστο publisher. Κράτησε hash fixture και αναμενόμενο αποτέλεσμα rejection.