
Εάν ανησυχείτε για την ακεραιότητα του συστήματός σας, Το dm-verity είναι ένα από τα βασικά κομμάτια του οικοσυστήματος Linux. για ασφαλή εκκίνηση και ανίχνευση παραβίασης του χώρου αποθήκευσης. Προήλθε ως μέρος του device mapper του πυρήνα και τώρα αποτελεί τη βάση για επαληθευμένη εκκίνηση σε Android, OpenWrt και διανομές που αναζητούν βελτιωμένη ασφάλεια.
Μακριά από το να είναι μια αφηρημένη έννοια, Το dm-verity έχει ρυθμιστεί και χρησιμοποιείται με πραγματικά εργαλεία όπως το veritysetup και το systemd-veritysetupΕπικυρώνει μπλοκ εν κινήσει χρησιμοποιώντας δέντρα κατακερματισμού και μπορεί να αντιδράσει σε περιπτώσεις αλλοίωσης με πολιτικές που κυμαίνονται από την καταγραφή του συμβάντος έως την επανεκκίνηση ή την κατάρρευση του συστήματος. Ας ρίξουμε μια πιο προσεκτική ματιά, χωρίς να αφήσουμε εκκρεμότητες.
Τι είναι το dm-verity και γιατί μπορεί να σας ενδιαφέρει
Το dm-verity είναι ένας στόχος χαρτογράφησης συσκευών στον πυρήνα που επαληθεύει την ακεραιότητα μιας συσκευής μπλοκ καθώς διαβάζονται δεδομέναΛειτουργεί υπολογίζοντας και επαληθεύοντας τα hashes κάθε μπλοκ (συνήθως 4K) σε σχέση με ένα προ-υπολογισμένο δέντρο κατακερματισμού, συνήθως χρησιμοποιώντας SHA-256.
Αυτός ο σχεδιασμός επιτρέπει Τα αρχεία δεν μπορούν να τροποποιηθούν σιωπηλά μεταξύ επανεκκινήσεων ή κατά την εκτέλεσηΕίναι το κλειδί για την επέκταση της αλυσίδας εμπιστοσύνης εκκίνησης στο λειτουργικό σύστημα, τον περιορισμό της επιμονής του κακόβουλου λογισμικού, την ενίσχυση των πολιτικών ασφαλείας και τη διασφάλιση των μηχανισμών κρυπτογράφησης και MAC κατά την εκκίνηση.
Σε Android (από την έκδοση 4.4 και μετά) και σε Linux γενικότερα, Η εμπιστοσύνη είναι αγκυροβολημένη στο ριζικό κατακερματισμό του δέντρου, το οποίο υπογράφεται και επικυρώνεται με ένα δημόσιο κλειδί που βρίσκεται σε μια προστατευμένη τοποθεσία (π.χ., στο διαμέρισμα εκκίνησης ή σε ένα UKI με υπογραφή Secure Boot). Η παραβίαση οποιουδήποτε μπλοκ θα απαιτούσε τη παραβίαση του υποκείμενου κρυπτογραφικού κατακερματισμού.
Η επαλήθευση γίνεται ανά μπλοκ και κατ' απαίτηση: Η πρόσθετη καθυστέρηση είναι ελάχιστη σε σύγκριση με το κόστος εισόδου/εξόδουΕάν ένας έλεγχος αποτύχει, ο πυρήνας επιστρέφει ένα σφάλμα εισόδου/εξόδου και το σύστημα αρχείων εμφανίζεται κατεστραμμένο, κάτι που είναι αναμενόμενο όταν τα δεδομένα δεν είναι αξιόπιστα. Οι εφαρμογές μπορούν να αποφασίσουν εάν θα συνεχίσουν ή όχι με βάση την ανοχή σφαλμάτων τους.
Πώς λειτουργεί εσωτερικά το δέντρο επαλήθευσης
Το δέντρο επαλήθευσης είναι κατασκευασμένο σε επίπεδα. Το επίπεδο 0 είναι τα ακατέργαστα δεδομένα από τη συσκευή, χωρισμένα σε 4K μπλοκ; υπολογίζεται ένας κατακερματισμός SHA-256 (salted) για κάθε μπλοκ. Αυτοί οι κατακερματισμοί στη συνέχεια συνενώνονται για να σχηματίσουν το επίπεδο 1. Το επίπεδο 1 ομαδοποιείται στη συνέχεια σε μπλοκ και ανακατακερματίζεται για να σχηματίσει το επίπεδο 2, και ούτω καθεξής μέχρι να χωρέσουν όλα σε ένα μόνο μπλοκ: αυτό το μπλοκ, όταν κατακερματιστεί, παράγει τον ριζικό κατακερματισμό.
Εάν οποιαδήποτε στρώση δεν ολοκληρώνει ακριβώς ένα μπλοκ, Είναι γεμάτο με μηδενικά μέχρι να φτάσει τα 4K για την αποφυγή ασαφειών. Το συνολικό μέγεθος του δέντρου εξαρτάται από το μέγεθος του διαμερίσματος που ελέγχεται. Στην πράξη, είναι συνήθως λιγότερο από 30 MB για τυπικά διαμερίσματα συστήματος.
Η γενική διαδικασία είναι: επιλέξτε ένα τυχαίο αλάτι, κατακερματίστε σε 4K, υπολογίστε το SHA-256 με αλάτι ανά μπλοκ, συνενώνεται για να σχηματίσει επίπεδα, γεμίζει το όριο του μπλοκ με μηδενικά και επαναλαμβάνεται με το προηγούμενο επίπεδο μέχρι να απομείνει ένα μόνο ριζικό hash. Αυτό το ριζικό hash, μαζί με το αλάτι που χρησιμοποιείται, τροφοδοτεί τον πίνακα dm-verity και την υπογραφή.
Εκδόσεις μορφής δίσκου και αλγόριθμος
Η μορφή των μπλοκ κατακερματισμού στον δίσκο έχει μια έκδοση. Η έκδοση 0 ήταν η αρχική έκδοση που χρησιμοποιήθηκε στο Chromium OS.Το αλάτι προστίθεται στο τέλος της διαδικασίας κατακερματισμού, τα digests αποθηκεύονται συνεχώς και το υπόλοιπο μπλοκ συμπληρώνεται με μηδενικά.
La Η έκδοση 1 συνιστάται για νέες συσκευές: Το αλάτι προπροστίθεται στο hash και κάθε digest συμπληρώνεται με μηδενικά έως και δύο, βελτιώνοντας την ευθυγράμμιση και την ευρωστία. Ο πίνακας dm-verity καθορίζει επίσης τον αλγόριθμο (π.χ., sha1 ή sha256), αν και για την τρέχουσα ασφάλεια χρησιμοποιείται το sha256.
Πίνακας dm-verity και βασικές παράμετροι
Ο πίνακας-στόχος dm-verity περιγράφει πού βρίσκονται τα δεδομένα, πού βρίσκεται το δέντρο κατακερματισμού και πώς να το επαληθεύσετεΤυπικά πεδία πίνακα:
- dev: συσκευή με τα δεδομένα που πρόκειται να επαληθευτούν (τύπος διαδρομής /dev/sdXN ή μεγαλύτερη:μικρότερη).
- hash_dev: συσκευή με το δέντρο κατακερματισμού (μπορεί να είναι το ίδιο· αν ναι, το hash_start πρέπει να βρίσκεται εκτός του ελεγμένου εύρους).
- μέγεθος_μπλοκ_δεδομένων: μέγεθος μπλοκ δεδομένων σε bytes (π.χ. 4096).
- μέγεθος_μπλοκ_κατακερματισμού: μέγεθος μπλοκ κατακερματισμού σε byte.
- num_data_blocks: αριθμός επαληθεύσιμου μπλοκ δεδομένων.
- hash_start_block: μετατόπιση (σε μπλοκ hash_block_size) ως προς το ριζικό μπλοκ του δέντρου.
- αλγόριθμος: αλγόριθμος κατακερματισμού (π.χ. sha256).
- σύνοψη: δεκαεξαδική κωδικοποίηση του hash του root block (συμπεριλαμβανομένου του salt σύμφωνα με την έκδοση μορφής). Αυτή η τιμή είναι αξιόπιστη.
- αλάτι: δεκαεξαδικό άλας.
Επιπλέον, υπάρχουν προαιρετικές παράμετροι πολύ χρήσιμο για την προσαρμογή της συμπεριφοράς:
- ignore_corruptionΚαταγράφει τα κατεστραμμένα μπλοκ, αλλά επιτρέπει τη συνέχιση της ανάγνωσης.
- επανεκκίνηση_στη_διαφθορά: επανεκκίνηση κατά την ανίχνευση καταστροφής (δεν είναι συμβατό με το ignore_corruption και απαιτεί υποστήριξη χώρου χρήστη για την αποφυγή βρόχων).
- πανικός_για_τη_διαφθορά: : προκαλεί πανικό κατά την ανίχνευση διαφθοράς (δεν είναι συμβατό με προηγούμενες εκδόσεις).
- επανεκκίνηση_κατά_σφάλμα y panic_on_error: ίδιες αντιδράσεις αλλά για σφάλματα εισόδου/εξόδου.
- ignore_zero_blocks: δεν ελέγχει τα μπλοκ που αναμένονται ως μηδενικά και επιστρέφει μηδενικά.
- use_fec_from_device + fec_roots + fec_blocks + fec_startΕνεργοποίηση του Reed–Solomon (FEC) για ανάκτηση δεδομένων όταν η επαλήθευση αποτύχει. Οι περιοχές δεδομένων, κατακερματισμού και FEC δεν πρέπει να επικαλύπτονται και τα μεγέθη των μπλοκ πρέπει να ταιριάζουν.
- έλεγχος_το_περισσότερο_μία φοράΕλέγχει κάθε μπλοκ δεδομένων μόνο την πρώτη φορά που διαβάζεται (μειώνει το κόστος εις βάρος της ασφάλειας σε ζωντανές επιθέσεις).
- root_hash_sig_key_descΑναφορά σε ένα κλειδί στο keyring για την επικύρωση μιας υπογραφής PKCS7 του root hash κατά τη δημιουργία της αντιστοίχισης (απαιτείται κατάλληλη διαμόρφωση πυρήνα και αξιόπιστα keyrings).
- try_verify_in_taskletΕάν τα hashes είναι αποθηκευμένα στην προσωρινή μνήμη και το μέγεθος I/O το επιτρέπει, ελέγχει το κάτω μισό για να μειώσει την καθυστέρηση. Προσαρμόζεται με /sys/module/dm_verity/parameters/use_bh_bytes ανά κλάση I/O.
Υπογραφή, μεταδεδομένα και αγκύρωση εμπιστοσύνης
Για να είναι αξιόπιστο το dm-verity, Το root hash πρέπει να είναι αξιόπιστο και συνήθως υπογεγραμμένοΣτο κλασικό Android, ένα δημόσιο κλειδί περιλαμβάνεται στο διαμέρισμα εκκίνησης, το οποίο επαληθεύεται εξωτερικά από τον κατασκευαστή. Επικυρώνει την υπογραφή root hash και διασφαλίζει ότι το διαμέρισμα συστήματος δεν έχει τροποποιηθεί.
Τα μεταδεδομένα Verity προσθέτουν δομή και έλεγχο έκδοσης. Το μπλοκ μεταδεδομένων περιλαμβάνει έναν μαγικό αριθμό 0xb001b001 (bytes b0 01 b0 01), έκδοση (προς το παρόν 0), η υπογραφή πίνακα στο PKCS1.5 (συνήθως 256 bytes για RSA-2048), το μήκος του πίνακα, ο ίδιος ο πίνακας και μηδενική συμπλήρωση έως 32K.
Στις εφαρμογές Android, η επαλήθευση βασίζεται σε fs_mgr και fstab: Προσθήκη ενός σημαδιού ελέγχου στην αντίστοιχη καταχώρηση και τοποθέτηση του κλειδιού στο /boot/verity_key. Εάν ο μαγικός αριθμός δεν βρίσκεται εκεί που θα έπρεπε, η επαλήθευση σταματά για να αποφευχθεί ο έλεγχος του λάθος αριθμού.
Η έναρξη της λειτουργίας επαληθεύτηκε
Η προστασία βρίσκεται στον πυρήνα: Εάν παραβιαστεί πριν από την εκκίνηση του πυρήνα, ο εισβολέας διατηρεί τον έλεγχοΓι' αυτό το λόγο, οι κατασκευαστές συνήθως επικυρώνουν αυστηρά κάθε στάδιο: ένα κλειδί που είναι ενσωματωμένο στη συσκευή επαληθεύει τον πρώτο bootloader, ο οποίος επαληθεύει τον επόμενο, τον bootloader της εφαρμογής και τέλος, τον πυρήνα.
Με τον πυρήνα επαληθευμένο, Το dm-verity ενεργοποιείται κατά την προσάρτηση της επαληθευμένης συσκευής μπλοκΑντί να γίνεται κατακερματισμός ολόκληρης της συσκευής (κάτι που θα ήταν αργό και θα σπαταλούσε ενέργεια), επαληθεύεται μπλοκ προς μπλοκ καθώς γίνεται πρόσβαση σε αυτήν. Μια αποτυχία προκαλεί σφάλμα εισόδου/εξόδου και οι υπηρεσίες και οι εφαρμογές αντιδρούν ανάλογα με την ανοχή τους: είτε συνεχίζουν χωρίς αυτά τα δεδομένα είτε καταρρέουν εντελώς.
Διόρθωση σφαλμάτων προς τα εμπρός (FEC)
Από το Android 7.0, Το FEC (Reed–Solomon) ενσωματώνεται με τεχνικές interlacing για τη μείωση του χώρου και την αύξηση της δυνατότητας ανάκτησης κατεστραμμένων μπλοκ. Αυτό λειτουργεί σε συνδυασμό με το dm-verity: εάν ένας έλεγχος αποτύχει, το υποσύστημα μπορεί να επιχειρήσει να τον διορθώσει πριν το κηρύξει μη ανακτήσιμο.
Απόδοση και βελτιστοποίηση
Για να μειώσετε τον αντίκτυπο: Ενεργοποίηση επιτάχυνσης SHA-2 από NEON σε ARMv7 και επεκτάσεις SHA-2 σε ARMv8 από τον πυρήνα. Προσαρμόστε τις παραμέτρους read-ahead και prefetch_cluster για το υλικό σας. Η επαλήθευση ανά μπλοκ συνήθως προσθέτει ελάχιστα στο κόστος εισόδου/εξόδου, αλλά αυτές οι ρυθμίσεις κάνουν τη διαφορά.
Ξεκινώντας με Linux (systemd, veritysetup) και Android
Σε ένα σύγχρονο Linux με systemd, Το dm-verity επιτρέπει μια επαληθευμένη ρίζα μόνο για ανάγνωση χρησιμοποιώντας το veritysetup (μέρος του cryptsetup), το systemd-veritysetup.generator και το systemd-veritysetup@.service. Συνιστάται να συμπεριλάβετε το Secure Boot και ένα υπογεγραμμένο UKI (ενοποιημένο είδωλο πυρήνα), αν και δεν είναι απολύτως απαραίτητα.
Προετοιμασία και συνιστώμενος διαχωρισμός
Μέρος ενός λειτουργικού και προσαρμοσμένου συστήματος. Κράτηση τόμου για το δέντρο κατακερματισμού (Το 8–10% του μεγέθους του root είναι συνήθως αρκετό) και σκεφτείτε να διαχωρίσετε το /home και το /var αν χρειάζεται να γράψετε. Ένα τυπικό σχήμα περιλαμβάνει: ESP (για τον bootloader), XBOOTLDR (για χρήστες του Ηνωμένου Βασιλείου), root (με ή χωρίς κρυπτογράφηση), διαμέρισμα VERITY και προαιρετικά /home και /var.
Ως ρίζα, Το EROFS είναι μια πολύ ενδιαφέρουσα εναλλακτική λύση για το ext4 ή το squashfs.Είναι σχεδιασμένο μόνο για ανάγνωση, με πολύ καλή απόδοση σε flash/SSD, συμπίεση lz4 από προεπιλογή και χρησιμοποιείται ευρέως σε τηλέφωνα Android με dm-verity.
Αρχεία που πρέπει να είναι εγγράψιμα
Με το root ro, ορισμένα προγράμματα αναμένουν να γράψουν σε /etc ή κατά την έναρξηΜπορείτε να το μετακινήσετε στο /var/etc και να προσθέσετε συμβολικό σύνδεσμο σε οτιδήποτε χρειάζεται να αλλάξει (π.χ., συνδέσεις NetworkManager στο /etc/NetworkManager/system-connections). Σημειώστε ότι το systemd-journald απαιτεί την ύπαρξη του /etc/machine-id στον ριζικό κατάλογο (όχι συμβολικό σύνδεσμο) για να αποφευχθεί η διακοπή των πρώιμων εκκινήσεων.
Για να μάθετε ποιες αλλαγές στην εκτέλεση, χρήση dracut-overlayroot: επικαλύπτει ένα tmpfs πάνω από το root, και όλα τα γραμμένα εμφανίζονται στο /run/overlayroot/u. Προσθέστε την ενότητα στο /usr/lib/dracut/modules.d/, συμπεριλάβετε το overlayroot στο dracut και ορίστε overlayroot=1 στη γραμμή του πυρήνα. Με αυτόν τον τρόπο θα δείτε τι θα μετεγκατασταθεί στο /var.
Χρήσιμα παραδείγματα: pacman και NetworkManager
Στο Arch, είναι βολικό Μετακινήστε τη βάση δεδομένων Pacman στο /usr/lib/pacman έτσι ώστε τα rootfs να αντικατοπτρίζουν πάντα τα εγκατεστημένα πακέτα. Στη συνέχεια, ανακατευθύνετε την προσωρινή μνήμη στο /var/lib/pacman και συνδέστε το. Για να αλλάξετε τη λίστα κατοπτρισμού χωρίς να αγγίξετε το root, μετακινήστε το στο /var/etc και συνδέστε το ούτως ή άλλως.
Με το NetworkManager, μετακινήστε τις συνδέσεις συστήματος στο /var/etc/NetworkManager και σύνδεσμος από το /etc/NetworkManager/system-connections. Αυτό διατηρεί το root αμετάβλητο και τη διαμόρφωση ζωντανή εκεί που θα έπρεπε να είναι εγγράψιμη.
Κατασκευή της αλήθειας και δοκιμές
Από ένα live και με όλα τα πάντα τέλεια και τοποθετημένα σε ro, δημιουργήστε το δέντρο και το roothash με μορφή veritysetupΌταν εκτελείται, εκτυπώνει τη γραμμή Root Hash, την οποία μπορείτε να αποθηκεύσετε στο roothash.txt. Εκτελέστε το για δοκιμή με το veritysetup, ανοίξτε το root-device root verity-device $(cat roothash.txt) και mount το /dev/mapper/root.
Αν προτιμάς, πρώτα δημιουργεί το δέντρο σε ένα αρχείο (verity.bin) και στη συνέχεια γράψτε το στο διαμέρισμα VERITY. Το σύνολο που προκύπτει είναι: η εικόνα ρίζας, το δέντρο verity και ο κατακερματισμός ρίζας που θα καρφιτσώσετε κατά την εκκίνηση.
Ρύθμιση παραμέτρων της γραμμής πυρήνα
Προσθέστε αυτές τις παραμέτρους: systemd.verity=1, roothash=contents_of_roothash.txt, systemd.verity_root_data=ROOT-PATH (π.χ. LABEL=OS) και systemd.verity_root_hash=VERITY-PATH (π.χ. LABEL=VERITY). Ορίστε το systemd.verity_root_options σε restart-on-corruption ή panic-on-corruption για αυστηρές πολιτικές.
Άλλες προτεινόμενες επιλογές: ro (αν δεν χρησιμοποιείτε EROFS/squashfs), rd.emergency=επανεκκίνηση y rd.shell=0 (αποτροπή μη εξουσιοδοτημένων κελυφών σε περίπτωση αποτυχίας εκκίνησης), και lockdown = εμπιστευτικότητα για την προστασία της μνήμης του πυρήνα από την πρόσβαση.
Επιπλέον διαμερίσματα με verity
Όχι μόνο η ρίζα: Μπορείτε να ορίσετε άλλες αντιστοιχίσεις στο /etc/veritytab και το systemd-veritysetup@.service θα τα συγκεντρώσει κατά την εκκίνηση. Θυμηθείτε: είναι πιο εύκολο να προσαρτήσετε σε RW ένα διαμέρισμα που δεν είναι root και ένας χρήστης root θα μπορούσε να απενεργοποιήσει το Verity σε αυτά τα διαμερίσματα, επομένως η τιμή ασφαλείας εκεί είναι χαμηλότερη.
Ασφάλεια: Ασφαλής εκκίνηση, UKI και υπογεγραμμένες ενότητες
Το dm-verity δεν είναι μια λύση. Υπογράψτε το UKI και ενεργοποιήστε την Ασφαλή Εκκίνηση με τα δικά σας κλειδιά για να αποτρέψετε οποιονδήποτε από το να παρακάμψει το kernel/initramfs/cmdline (το οποίο περιλαμβάνει το root hash). Εργαλεία όπως το sbupdate-git ή το sbctl βοηθούν στη διατήρηση των εικόνων υπογεγραμμένων και της αλυσίδας εκκίνησης άθικτης.
Εάν ενεργοποιήσετε το κλείδωμα πυρήνα ή την επαλήθευση υπογραφής λειτουργικής μονάδας, Οι μονάδες DKMS ή οι μονάδες εκτός δέντρου πρέπει να είναι υπογεγραμμένες αλλιώς δεν θα φορτώσουν. Σκεφτείτε έναν προσαρμοσμένο πυρήνα με υποστήριξη υπογραφής για τον αγωγό σας (δείτε υπογεγραμμένες ενότητες πυρήνα).
Κρυπτογράφηση, TPM και μέτρηση
Το dm-verity προστατεύει την ακεραιότητα, μη εμπιστευτικότηταΜπορείτε να αφήσετε το root μη κρυπτογραφημένο εάν δεν περιέχει μυστικά και η αλυσίδα εκκίνησης είναι προστατευμένη. Εάν χρησιμοποιείτε αρχεία κλειδιών από το root για να ξεκλειδώσετε άλλους τόμους, τότε είναι καλή ιδέα να το κρυπτογραφήσετε.
Με TPM 2.0, Το systemd-cryptenroll επιτρέπει τη σύνδεση κλειδιών σε PCR 0,1,5,7 (υλικολογισμικό, επιλογές, GPT, κατάσταση ασφαλούς εκκίνησης). Προσθέστε το rd.luks.options=LUKS_UUID=tpm2-device=auto και βεβαιωθείτε ότι έχετε συμπεριλάβει υποστήριξη TPM2 στο initramfs. Το systemd-boot μετρά το kernel.efi στο PCR4, χρήσιμο για την ακύρωση κλειδιών εάν αλλάξει το UKI ή η γραμμή cmdline του.
Ενημερώσεις και μοντέλα ανάπτυξης
Μια επαληθευμένη ρίζα μόνο για ανάγνωση Δεν ενημερώνεται με τον διαχειριστή πακέτων με τον παραδοσιακό τρόποΤο ιδανικό είναι να δημιουργήσετε νέες εικόνες με εργαλεία όπως το έργο Yocto και να τα δημοσιεύσετε. Το systemd διαθέτει τα systemd-sysupdate και systemd-repart για ισχυρή λήψη και εγκατάσταση εικόνων.
Μια άλλη στρατηγική είναι Σχέδιο Α/ΒΔιατηρείτε δύο ρίζες και δύο verities. Αντιγράφετε την ενεργή ρίζα στην ανενεργή ρίζα, εφαρμόζετε τις αλλαγές και επαναλαμβάνετε την verity. Επιστρέφετε στην επόμενη εκκίνηση. Εάν χρησιμοποιείτε UKI, θυμηθείτε να ενημερώσετε το hash ρίζας στη γραμμή cmd ή να αναδημιουργήσετε το υπογεγραμμένο UKI.
Για προαιρετική επιμονή, χρησιμοποιήστε το OverlayFS στην επαληθευμένη ρίζα με το πάνω μέρος σε tmpfs ή δίσκο. Μπορείτε επίσης να περάσετε την εντολή systemd.volatile=overlay για προσωρινή διατήρηση. Το Flatpak διευκολύνει την εγκατάσταση εφαρμογών στο /var και στο /home χωρίς να αγγίξετε το /.
Υπάρχουν αυτοματοποιημένα πακέτα (π.χ. verity-squash-root στο AUR) που δημιουργούν μια ρίζα squashfs και Υπογράψτε το roothash με τον πυρήνα και το initramfs, επιτρέποντάς σας να επιλέξετε μεταξύ μόνιμης ή εφήμερης λειτουργίας και να διατηρήσετε τα πιο πρόσφατα rootfs ως αντίγραφο ασφαλείας. Σημείωση: Η προσθήκη μόνιμης σε μια επαληθευμένη ρίζα έχει περιορισμένες περιπτώσεις χρήσης. Δοκιμάστε να διατηρήσετε τα δεδομένα εφαρμογής σε ξεχωριστά διαμερίσματα.
Android: σύστημα ως root, επικαλύψεις AVB και προμηθευτών
Από το Android 10, Το RootFS σταματά να εκτελείται σε δίσκο RAM και ενσωματώνεται με το system.img. (system-as-root). Οι συσκευές που εκκινούνται με Android 10 χρησιμοποιούν πάντα αυτό το σχήμα και απαιτούν δίσκο ram για το dm-linear. Το BOARD_BUILD_SYSTEM_ROOT_IMAGE έχει οριστεί σε false σε αυτήν την έκδοση για να γίνεται διάκριση μεταξύ της χρήσης ενός δίσκου ram και της άμεσης ενεργοποίησης του system.img.
Ενσωματώνει το Android 10 δυναμικά διαμερίσματα και ένα init πρώτου σταδίου το οποίο ενεργοποιεί το λογικό διαμέρισμα συστήματος. Ο πυρήνας δεν το προσαρτά πλέον απευθείας. Τα OTA μόνο για σύστημα απαιτούν σχεδιασμό συστήματος ως root, ο οποίος είναι υποχρεωτικός σε συσκευές Android 10.
Σε κανένα A/B, Διατηρήστε την ανάκτηση ξεχωριστά από την εκκίνησηΣε αντίθεση με το A/B, δεν υπάρχει αντίγραφο ασφαλείας boot_a/boot_b, επομένως η κατάργηση της αποκατάστασης σε μη-A/B μπορεί να σας αφήσει χωρίς λειτουργία αποκατάστασης εάν αποτύχει μια ενημέρωση εκκίνησης.
Ο πυρήνας προσαρτά το system.img στο /converity μέσω δύο διαδρομών: vboot 1.0 (επιδιορθώσεις κώδικα για τον πυρήνα για την ανάλυση μεταδεδομένων Android στο /system και την εξαγωγή παραμέτρων dm-verity· η cmdline περιλαμβάνει root=/dev/dm-0, skip_initramfs και init=/init με dm=…) ή vboot 2.0/AVB, όπου ο bootloader ενσωματώνει το libavb, διαβάζει την περιγραφή hashtree (στο vbmeta ή στο σύστημα), κατασκευάζει τις παραμέτρους και τις μεταβιβάζει στον πυρήνα στη γραμμή cmdline, με υποστήριξη FEC και σημαίες όπως restart_on_corruption.
Με το σύστημα ως root, μην χρησιμοποιείτε BOARD_ROOT_EXTRA_FOLDERS για φακέλους root που αφορούν συγκεκριμένες συσκευές: αυτοί θα εξαφανιστούν κατά την ενημέρωση ενός GSI. Ορίστε συγκεκριμένα mounts στο /mnt/vendor/ , τα οποία δημιουργεί αυτόματα το fs_mgr, και αναφέρετέ τα στο fstab του δέντρου συσκευών.
Το Android επιτρέπει ένα επικάλυψη προμηθευτή από /product/vendor_overlay/: η init θα προσαρτήσει στον /vendor τους υποκαταλόγους που πληρούν τις απαιτήσεις περιβάλλοντος SELinux και την ύπαρξη του /vendor/ Απαιτείται η εντολή CONFIG_OVERLAY_FS=yy, σε παλαιότερους πυρήνες, η εντολή override_creds=off.
Τυπική υλοποίηση: εγκαθιστά προμεταγλωττισμένα αρχεία στη συσκευή/ / /επικάλυψη_προμηθευτή/, προσθέστε τα στο PRODUCT_COPY_FILES με την εντολή find-copy-subdir-files στο $(TARGET_COPY_OUT_PRODUCT)/vendor_overlay, ορίστε περιβάλλοντα στο file_contexts για το etc και την εφαρμογή (π.χ. vendor_configs_file και vendor_app_file) και επιτρέψτε την προσάρτηση σε αυτά τα περιβάλλοντα στο init.te. Δοκιμάστε με το atest vfs_mgr_vendor_overlay_test στο userdebug.
Αντιμετώπιση προβλημάτων: μήνυμα αλλοίωσης dm-verity σε Android
Σε συσκευές με υποδοχές A/B, αλλάξτε υποδοχές ή Αναβοσβήνει το vbmeta/boot χωρίς συνέπεια roothash Αυτό μπορεί να ενεργοποιήσει την προειδοποίηση: dm-verity corruption, your device is untrusted. Εντολές όπως fastboot flash –disable-verity –disable-verification vbmeta vbmeta.img απενεργοποιούν την επαλήθευση, αλλά αφήνουν το σύστημα χωρίς καμία εγγύηση ακεραιότητας.
Ορισμένα προγράμματα εκκίνησης υποστηρίζουν fastboot oem disable_dm_verity και το αντίθετό του, enable_dm_verity. Λειτουργεί σε ορισμένα μοντέλα, αλλά όχι σε άλλα. και μπορεί να απαιτεί πυρήνα/magisk με προσαρμοσμένες σημαίες. Χρησιμοποιήστε το με δική σας ευθύνη: η συνετή πορεία δράσης είναι ευθυγράμμιση boot, vbmeta και system, υπογράψτε ή αναγεννήστε το δέντρο και βεβαιωθείτε ότι το αναμενόμενο root hash ταιριάζει με το διαμορφωμένο.
Εάν μετά την προειδοποίηση μπορείτε να συνεχίσετε να πατάτε το κουμπί λειτουργίας, το σύστημα ξεκινά, αλλά δεν έχεις πλέον μια άθικτη αλυσίδα εμπιστοσύνηςΓια να καταργήσετε το μήνυμα χωρίς να θυσιάσετε την ασφάλεια, επαναφέρετε τις αρχικές υπογεγραμμένες εικόνες ή ανακατασκευάστε/επαληθεύστε το vbmeta με το σωστό hashtree, αντί να απενεργοποιήσετε το verity.
Πλατφόρμες i.MX και OpenWrt
Στο i.MX6 (π.χ. sabresd), ρυθμίστε τον πυρήνα με υποστήριξη DM_VERITY και FEC, δημιουργήστε το δέντρο με το veritysetup, αποθηκεύστε με ασφάλεια το root hash και περάστε τις κατάλληλες παραμέτρους στη γραμμή cmd ή ενσωματώστε μέσω initramfs με το systemd-veritysetup. Εάν δεν χρησιμοποιείτε dm-crypt, δεν χρειάζεστε CAAM για το verity. Η έμφαση δίνεται στην ακεραιότητα.
Στο OpenWrt και στο ενσωματωμένα συστήματα Linux με OpenEmbedded, Υπάρχουν προσπάθειες για την ενσωμάτωση του dm-verity και του SELinux. (Οι εργασίες Bootlin αναθεωρήθηκαν με σκοπό την ενσωμάτωση υποστήριξης). Είναι μια φυσική προσαρμογή: οι δρομολογητές και ο εξοπλισμός δικτύου επωφελούνται από μια αμετάβλητη, επαληθευμένη και ανθεκτική σε MAC ρίζα.
Χειροκίνητη κατασκευή δέντρου και μεταδεδομένων (λεπτομερής προβολή)
Το cryptsetup μπορεί να δημιουργήσει το δέντρο για εσάς, αλλά αν προτιμάτε να κατανοήσετε τη μορφή, ο ορισμός της γραμμής του συμπαγούς πίνακα περιλαμβάνει: όνομα αντιστοίχισης, συσκευή δεδομένων, μεγέθη μπλοκ δεδομένων και κατακερματισμού, μέγεθος εικόνας σε μπλοκ, hash_start position (εικόνα μπλοκ + 8 εάν είναι συνενωμένη), root hash και salt. Αφού δημιουργήσετε τις συνενωμένες στρώσεις (από πάνω προς τα κάτω, εξαιρουμένης της στρώσης 0), γράφετε το δέντρο στον δίσκο.
Για να συσκευάσω τα πάντα, συνθέστε τον πίνακα dm-verity, υπογράψτε τον (τυπικό RSA-2048) και ομαδοποιήστε τον πίνακα υπογραφής+στα μεταδεδομένα με μια κεφαλίδα έκδοσης και έναν μαγικό αριθμό. Στη συνέχεια, συνενώνει την εικόνα συστήματος, τα μεταδεδομένα Verity και το δέντρο κατακερματισμού. Στο fstab, επισημαίνει το fs_mgr ως verify και τοποθετεί το δημόσιο κλειδί στο /boot/verity_key για να επικυρώσει την υπογραφή.
Βελτιστοποίηση με Επιταχύνσεις SHA-2 για την CPU σας και προσαρμόστε το read-ahead/prefetch_cluster. Σε υλικό ARM, οι επεκτάσεις NEON SHA-2 (ARMv7) και SHA-2 (ARMv8) μειώνουν σημαντικά την επιβάρυνση επαλήθευσης.
Σε κάθε ανάπτυξη, να θυμάστε ότι η τιμή hash root πρέπει να προστατεύεται: είτε έχει μεταγλωττιστεί σε ένα υπογεγραμμένο UKI, είτε στο υπογεγραμμένο διαμέρισμα εκκίνησης, είτε έχει επικυρωθεί από τον bootloader χρησιμοποιώντας AVB. Όλα τα στοιχεία μετά από αυτό το σημείο κληρονομούν αυτήν την αξιοπιστία.
Με όλα τα παραπάνω στη θέση τους, το dm-verity γίνεται μια σταθερή βάση για αμετάβλητα, κινητά και ενσωματωμένα συστήματα, υποστηρίζοντας ενημερώσεις συναλλαγών, επικαλύψεις διαμόρφωσης και ένα σύγχρονο μοντέλο ασφαλείας που μειώνει την επιφάνεια επίθεσης και αποτρέπει την επιμονή χωρίς να θυσιάζει την απόδοση.


