Steganography παρελθόντα αρχεία: απόκρυψη δεδομένων απευθείας σε τομείς

Ένας σύντομος πρόλογος

Η στεγανογραφία, αν κάποιος δεν θυμάται, κρύβει πληροφορίες σε κάποια κοντέινερ. Για παράδειγμα, σε εικόνες (συζητήθηκαν εδώ и εδώ). Μπορείτε επίσης να αποκρύψετε δεδομένα σε πίνακες υπηρεσιών του συστήματος αρχείων (για αυτό γράφτηκε εδώ), και ακόμα σε πακέτα υπηρεσιών πρωτοκόλλου TCP. Δυστυχώς, όλες αυτές οι μέθοδοι έχουν ένα μειονέκτημα: για να "εισάγετε" ανεπαίσθητα πληροφορίες σε ένα δοχείο, χρειάζεστε πονηρούς αλγόριθμους που λαμβάνουν υπόψη τις ιδιαιτερότητες της εσωτερικής δομής του δοχείου. Και προκύπτουν προβλήματα με την αντίσταση του κοντέινερ σε χειρισμούς: για παράδειγμα, εάν επεξεργαστείτε ελαφρώς την εικόνα, οι κρυφές πληροφορίες χάνονται.

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

Αιματηρές λεπτομέρειες της μεθόδου

Η βασική ιδέα είναι τόσο απλή όσο ένα χτύπημα στο μέτωπο: υπάρχουν περιοχές στο δίσκο που το λειτουργικό σύστημα δεν γράφει ποτέ (ή γράφει σε σπάνιες περιπτώσεις). Για να αποφύγουμε την ανάγκη αναζήτησης αυτών των περιοχών χρησιμοποιώντας πονηρούς αλγόριθμους, θα χρησιμοποιήσουμε πλεονασμό - δηλαδή, θα αντιγράψουμε τις κρυφές πληροφορίες μας πολλές, πολλές φορές σε όλους τους τομείς του δίσκου. Στη συνέχεια, πάνω από όλο αυτό το μεγαλείο, μπορείτε να δημιουργήσετε τα απαραίτητα διαμερίσματα, να μορφοποιήσετε συστήματα αρχείων, να γράψετε αρχεία και να εγκαταστήσετε λειτουργικά συστήματα - παρόλα αυτά, μέρος των μυστικών δεδομένων θα αποθηκευτεί και θα μπορεί να ανακτηθεί και η επαναλαμβανόμενη αντιγραφή θα μας βοηθήσει συνδυάστε το αρχικό σύνολο από τα κομμάτια.

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

Τα μειονεκτήματα είναι επίσης, νομίζω, προφανή:

  • Τα μυστικά δεδομένα μπορούν να αλλάξουν μόνο με την πλήρη επανεγγραφή ολόκληρου του δίσκου, ακολουθούμενη από την εκ νέου δημιουργία του περιεχομένου που είναι ορατό στον χρήστη. Ωστόσο, δεν μπορείτε να χρησιμοποιήσετε λογισμικό που αναδημιουργεί το δίσκο από μια εικόνα: θα αναδημιουργήσει επίσης τα προηγούμενα μυστικά δεδομένα.
  • Όσο μεγαλύτερος είναι ο όγκος των μυστικών δεδομένων, τόσο μεγαλύτερη είναι η πιθανότητα απώλειας ορισμένων πληροφοριών.
  • Η ανάκτηση δεδομένων από το δίσκο μπορεί να διαρκέσει πολύ. Από αρκετά λεπτά έως αρκετές ημέρες (οι σύγχρονοι δίσκοι είναι μεγάλοι).

Τώρα ας προχωρήσουμε στα συγκεκριμένα.

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

Το επόμενο ερώτημα είναι πώς μπορούμε να διακρίνουμε τα «καλά» δεδομένα από τα κακά δεδομένα. Εδώ ένα άθροισμα ελέγχου θα μας βοηθήσει, αλλά όχι ένα απλό, αλλά το SHA1. Και τι? Είναι αρκετά καλό για git, οπότε θα μας ταιριάζει και εμείς. Αποφασίστηκε: παρέχουμε σε κάθε αποθηκευμένη πληροφορία ένα άθροισμα ελέγχου και εάν μετά την αποκρυπτογράφηση ταιριάζει, σημαίνει ότι η αποκρυπτογράφηση ήταν επιτυχής.

Θα χρειαστείτε επίσης τον αριθμό τμήματος και το συνολικό μήκος των μυστικών δεδομένων. Ο αριθμός του θραύσματος είναι για να παρακολουθείτε ποια κομμάτια έχουμε ήδη αποκρυπτογραφήσει και ποια έχουν απομείνει. Το συνολικό μήκος θα μας φανεί χρήσιμο κατά την επεξεργασία του τελευταίου κομματιού, ώστε να μην γράψουμε περιττά δεδομένα (δηλαδή padding). Λοιπόν, επειδή έχουμε ακόμα μια κεφαλίδα, θα προσθέσουμε το όνομα του μυστικού αρχείου εκεί. Θα είναι χρήσιμο μετά την αποκρυπτογράφηση, για να μην μαντέψετε πώς να το ανοίξετε.

Δοκιμή της μεθόδου στην πράξη

Για να ελέγξουμε, ας πάρουμε το πιο κοινό μέσο - μια μονάδα flash. Βρήκα ένα παλιό με χωρητικότητα 1 GB, που είναι αρκετά κατάλληλο για πειράματα. Εάν, όπως εγώ, σκέφτηκες την ιδέα να μην ασχοληθείς με τα φυσικά μέσα, αλλά να τα δοκιμάσεις σε ένα αρχείο - μια εικόνα δίσκου, τότε θα πω αμέσως: δεν θα λειτουργήσει. Όταν μορφοποιείτε έναν τέτοιο «δίσκο», το Linux δημιουργεί ξανά το αρχείο και όλοι οι τομείς που δεν χρησιμοποιούνται θα γεμίσουν με μηδενικά.

Ως μηχάνημα με Linux, δυστυχώς, έπρεπε να χρησιμοποιήσω έναν μετεωρολογικό σταθμό στο Raspberry Pi 3 που βρίσκεται στο μπαλκόνι. Δεν υπάρχει πολλή μνήμη εκεί, επομένως δεν θα κρύψουμε μεγάλα αρχεία. Περιοριζόμαστε σε μέγιστο μέγεθος 10 megabyte. Επίσης, δεν έχει νόημα να αποκρύπτετε αρχεία που είναι πολύ μικρά: το βοηθητικό πρόγραμμα εγγράφει δεδομένα στο δίσκο σε συμπλέγματα 4 KB. Επομένως, παρακάτω θα περιοριστούμε σε ένα αρχείο 3 kb - χωράει σε ένα τέτοιο σύμπλεγμα.

Θα κοροϊδεύουμε τη μονάδα flash σταδιακά, ελέγχοντας μετά από κάθε στάδιο εάν οι κρυφές πληροφορίες είναι αναγνώσιμες:

  1. Γρήγορη μορφοποίηση σε μορφή FAT16 με μέγεθος συμπλέγματος 16 KB. Αυτό είναι που προσφέρουν τα Windows 7 με μια μονάδα flash που δεν διαθέτει σύστημα αρχείων.
  2. Γεμίζοντας τη μονάδα flash με κάθε είδους σκουπίδια κατά 50%.
  3. Γεμίζοντας τη μονάδα flash με κάθε είδους σκουπίδια κατά 100%.
  4. Μορφοποίηση "Long" σε μορφή FAT16 (αντικαθιστά τα πάντα).

Οι δύο πρώτες δοκιμές, όπως αναμενόταν, έληξαν με πλήρη νίκη: το βοηθητικό πρόγραμμα μπόρεσε να εξαγάγει με επιτυχία 10 megabyte μυστικών δεδομένων από τη μονάδα flash. Αλλά μετά την πλήρωση της μονάδας flash με αρχεία, παρουσιάστηκε μια αποτυχία:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Όπως μπορείτε να δείτε, μόνο 158 συμπλέγματα αποκρυπτογραφήθηκαν επιτυχώς (632 kilobytes ακατέργαστων δεδομένων, που δίνει 636424 byte ωφέλιμου φορτίου). Είναι σαφές ότι δεν υπάρχει τρόπος να αποκτήσετε 10 megabyte εδώ, και ωστόσο μεταξύ αυτών των συστάδων υπάρχουν σαφώς διπλότυπα. Δεν μπορείτε να ανακτήσετε ούτε 1 megabyte με αυτόν τον τρόπο. Μπορούμε όμως να εγγυηθούμε ότι θα ανακτήσουμε 3 kilobyte μυστικών δεδομένων από μια μονάδα flash ακόμα και μετά τη μορφοποίηση και την εγγραφή της στη χωρητικότητα. Ωστόσο, τα πειράματα δείχνουν ότι είναι πολύ πιθανό να εξαγάγετε ένα αρχείο μήκους 120 kilobyte από μια τέτοια μονάδα flash.

Η τελευταία δοκιμή, δυστυχώς, έδειξε ότι ολόκληρη η μονάδα flash αντικαταστάθηκε:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

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

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

Total clusters read: 250752, decrypted: 405

Δυστυχώς, είναι αδύνατο να συναρμολογήσετε ένα megabyte από κομμάτια, αλλά τα διακόσια kilobyte είναι εύκολα.

Λοιπόν, τα νέα για τον τελευταίο, 4ο έλεγχο, αυτή τη φορά είναι χαρούμενα: η πλήρης μορφοποίηση μιας τέτοιας μονάδας flash δεν οδήγησε στην καταστροφή όλων των πληροφοριών! 120 kilobyte μυστικών δεδομένων ταιριάζουν τέλεια στον αχρησιμοποίητο χώρο.

Συνοπτικός πίνακας δοκιμής:

Steganography παρελθόντα αρχεία: απόκρυψη δεδομένων απευθείας σε τομείς

Λίγη θεωρητικοποίηση: σχετικά με τον ελεύθερο χώρο και τους αχρησιμοποίητους τομείς

Εάν έχετε χωρίσει ποτέ τον σκληρό σας δίσκο σε διαμερίσματα, ίσως έχετε παρατηρήσει ότι δεν είναι πάντα δυνατό να εκχωρήσετε όλο τον ελεύθερο χώρο στο δίσκο. Η πρώτη ενότητα ξεκινά πάντα με κάποια εσοχή (συνήθως 1 megabyte ή 2048 τομείς). Πίσω από το τελευταίο τμήμα, συμβαίνει επίσης να παραμένει μια μικρή «ουρά» αχρησιμοποίητων τομέων. Και μερικές φορές υπάρχουν κενά μεταξύ των τμημάτων, αν και σπάνια.

Με άλλα λόγια, υπάρχουν τομείς στο δίσκο στους οποίους δεν είναι δυνατή η πρόσβαση κατά την κανονική εργασία με το δίσκο, αλλά τα δεδομένα μπορούν να εγγραφούν σε αυτούς τους τομείς! Και αυτό σημαίνει να το διαβάσετε επίσης. Προσαρμόστηκε για το γεγονός ότι υπάρχει επίσης ένας πίνακας διαμερισμάτων και ένας κωδικός bootloader, που βρίσκονται στην κενή περιοχή στην αρχή του δίσκου.

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

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

Και επίσης - καθαρά εμπειρικά - μπορούμε να υποθέσουμε ότι το σύστημα αρχείων δεν μπορεί πάντα να καταλαμβάνει όλο τον χώρο που του έχει παραχωρηθεί μέχρι τον τελευταίο τομέα. Για παράδειγμα, ένα σύστημα αρχείων FAT16 με μέγεθος συμπλέγματος 64 kilobyte προφανώς δεν μπορεί να καταλάβει πλήρως ένα διαμέρισμα με μέγεθος όχι πολλαπλάσιο των 64 kilobyte. Στο τέλος μιας τέτοιας ενότητας θα πρέπει να υπάρχει μια "ουρά" πολλών τομέων, απρόσιτη για την αποθήκευση δεδομένων χρήστη. Ωστόσο, αυτή η υπόθεση δεν μπορούσε να επιβεβαιωθεί πειραματικά.

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

Βοηθητικό πρόγραμμα για πειράματα

Μπορείτε να αγγίξετε τον πηγαίο κώδικα του βοηθητικού προγράμματος εδώ

Για να δημιουργήσετε, θα χρειαστείτε Qt έκδοση 5.0 ή νεότερη και OpenSSL. Εάν κάτι δεν λειτουργεί, ίσως χρειαστεί να επεξεργαστείτε το αρχείο steganodisk.pro.

Μπορείτε να αλλάξετε το μέγεθος του συμπλέγματος από 4 KB σε, ας πούμε, 512 byte (στο secretfile.h). Ταυτόχρονα, οι πληροφορίες κόστους της υπηρεσίας θα αυξηθούν: η κεφαλίδα και το άθροισμα ελέγχου καταλαμβάνουν σταθερά 68 byte.

Πρέπει να εκτελέσετε το βοηθητικό πρόγραμμα, φυσικά, με δικαιώματα χρήστη root και με προσοχή. Δεν θα γίνουν ερωτήσεις πριν από την αντικατάσταση του καθορισμένου αρχείου ή συσκευής!

Απολαμβάνω.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο