Μοντέλα απειλών, permissions και εξουσιοδότηση — DedSec Project
Μοντέλα απειλών, permissions και εξουσιοδότηση 01. Μοντέλο απειλών για μικρή offline εφαρμογή Στόχος: Μοντέλο απειλών για μικρή offline εφαρμογή. Ακόμη και μια offline εφαρμογή έχει όρια…
01. Μοντέλο απειλών για μικρή offline εφαρμογή
Στόχος: Μοντέλο απειλών για μικρή offline εφαρμογή.
Ακόμη και μια offline εφαρμογή έχει όρια εμπιστοσύνης. Σχεδίασε πέντε κουτιά: πηγαία μαθήματα, γεννήτρια ευρετηρίου, έτοιμο HTML, browser και προαιρετική τοπική κατάσταση. Σημείωσε με βέλη πώς περνούν τα δεδομένα.
Ο βασικός κίνδυνος δεν είναι η απουσία Internet, αλλά να εμφανιστεί κείμενο μαθήματος ως εκτελέσιμο HTML. Το περιεχόμενο πρέπει να αποθηκεύεται ως δεδομένα, να γίνεται ασφαλές serialization και να εμφανίζεται με textContent, όχι με ανεξέλεγκτο innerHTML. Ο generator οφείλει να αγνοεί μη αναμενόμενα ή ευαίσθητα αρχεία.
Άσκηση: γράψε σε δοκιμαστικό μάθημα έναν αβλαβή χαρακτήρα που θυμίζει HTML tag. Αναδημιούργησε το index και αναζήτησέ τον. Πρέπει να εμφανιστεί ως απλό κείμενο, όχι να ερμηνευτεί.
Καταγραφή: αγαθό (μαθήματα), είσοδος (Markdown), όριο εμπιστοσύνης (δεδομένα προς DOM), προστασία (σωστή κωδικοποίηση) και αρνητικό τεστ (κακοσχηματισμένη είσοδος).
Ασφαλής εξάσκηση: μόνο συνθετικά δεδομένα, δικά σου συστήματα ή ρητή εξουσιοδότηση. Έλεγξε τις πληροφορίες και σε επίσημη τεκμηρίωση.
Συμπληρωματική ύλη: Hacking Guide Project — ενότητα 41.
02. Δικαιώματα Linux και Termux
Στόχος: Δικαιώματα Linux και Termux.
Στο Unix ελέγχεις ιδιοκτήτη, ομάδα και δικαιώματα ανάγνωσης, εγγραφής και εκτέλεσης. Ένας φάκελος χρειάζεται δικαίωμα διέλευσης ακόμη κι αν ξέρεις το όνομα του αρχείου. Το ότι ένα script εκτελείται δεν σημαίνει ότι είναι ασφαλές.
Το Termux λειτουργεί μέσα στο sandbox της εφαρμογής Android. Οι εντολές Linux δεν αποκτούν αυτόματα όλα τα δικαιώματα του κινητού. Η πρόσβαση σε εξωτερικό χώρο αποθήκευσης εξαρτάται από το Android. Διαδρομές υπολογιστή μπορεί να μην υπάρχουν στο κινητό.
Παράδειγμα βλάβης: script backup διαβάζει έναν φάκελο αλλά όχι άλλον. Έλεγξε πρώτα ύπαρξη αρχείου, δικαιώματα στους γονικούς φακέλους και μετά την άδεια Android. Το «τρέξ' τα όλα ως root» δεν εξηγεί το πρόβλημα.
Άσκηση: σε προσωρινό φάκελο δώσε διαφορετικά δικαιώματα σε δύο δοκιμαστικά αρχεία. Παρατήρησε τι αλλάζει. Πρότεινε το ελάχιστο δικαίωμα αντί για γενικό write σε όλους.
Ξεχώριζε δικαιώματα διεργασίας, άδειες Android και Unix file modes.
Συμπληρωματική ύλη: Hacking Guide Project — ενότητα 33.
03. Η ταυτοποίηση δεν είναι εξουσιοδότηση
Στόχος: Η ταυτοποίηση δεν είναι εξουσιοδότηση.
Authentication απαντά «ποιος κάνει την κλήση;». Authorization απαντά «δικαιούται να κάνει αυτή την πράξη στο συγκεκριμένο αντικείμενο και σε αυτή την κατάσταση;». Ένα έγκυρο login δεν επιτρέπει ανάγνωση αρχείου άλλου χρήστη.
Σκέψου τον κανόνα ως allow(χρήστης, ενέργεια, αντικείμενο, συνθήκες). Οι συνθήκες μπορεί να περιλαμβάνουν ιδιοκτησία, ομάδα, έγκριση και λήξη άδειας.
Μικρός πίνακας: ιδιοκτήτης/ανάγνωση/δικό του → ναι· ιδιοκτήτης/αλλαγή/δικό του → ναι εφόσον επιτρέπεται· επισκέπτης/ανάγνωση/ξένο → όχι· διαχειριστής/διαγραφή/ξένο → μόνο με ρητή πολιτική.
Κρυφή βλάβη: ο αρχικός έλεγχος δικαιωμάτων δουλεύει, αλλά μια εργασία εξαγωγής στον server ξεχνά την ιδιοκτησία. Χρειάζεται η ίδια πολιτική σε αναζήτηση, download και batch exports.
Άσκηση: φτιάξε στα χαρτιά δύο χρήστες και δύο σημειώσεις. Γράψε έξι τεστ «επιτρέπεται/απαγορεύεται» προτού γράψεις το API.
Συμπληρωματική ύλη: Hacking Guide Project — ενότητα 71.
Εξουσιοδότηση αντικειμένου στο όριο δεδομένων
Η αυθεντικοποίηση δείχνει ποιος κάνει αίτημα, όχι αν επιτρέπεται συγκεκριμένο αντικείμενο. Κάθε αναζήτηση εξωτερικού ID χρειάζεται κανόνα ιδιοκτησίας, πελάτη ή ρόλου. Η απόκρυψη ενέργειας στο UI δεν επιβάλλει κανόνα στον διακομιστή.
Προτίμησε πρόσβαση δεδομένων που ενσωματώνει την εξουσιοδότηση στο ίδιο ερώτημα ή συναλλαγή. Διατήρησε απουσία και άρνηση σύμφωνα με την πολιτική αποκάλυψης. Το συνθετικό μοντέλο ελέγχει ιδιοκτησία σε ανάγνωση και αλλαγή χωρίς πραγματικούς λογαριασμούς.
objects={"note-a":{"owner":"alice","body":"fixture"}}
def allowed(actor, object_id, action):
item=objects.get(object_id)
return bool(item and item["owner"]==actor and action in {"read","update"})
assert allowed("alice","note-a","read")
assert not allowed("bob","note-a","read")
assert not allowed("alice","missing","read")
assert not allowed("alice","note-a","delete")
print("object and action both checked")
Πρόσθεσε ID άλλου πελάτη, ανακλημένο ρόλο και ταυτόχρονη αλλαγή ιδιοκτήτη. Οι αρνητικές δοκιμές καλούν την ίδια προστατευμένη πράξη, όχι μόνο κρυμμένο κουμπί. Η προεπιλεγμένη άρνηση καλύπτει άγνωστες ενέργειες.