Κάποια
συγκεκριμένα προβλήματα
Για να γίνουμε πιο συγκεκριμένοι και για να κατανοήσουμε καλύτερα
τα προβλήματα ασφάλειας της Java, θα αναφέρουμε εδώ δύο χαρακτηριστικά
παραδείγματα τα οποία καταδεικνύουν το πρόβλημα. Έχουν αναφερθεί
διάφορες περιπτώσεις παραβιάσεων ασφάλειας με την βοήθεια
της Java, οι οποίες ευτυχώς κατά κανόνα δημιουργήθηκαν σε
κάποιο πανεπιστημιακό εργαστήριο με σκοπό την έρευνα και τίποτα
περισσότερο. Τα προβλήματα αυτά αναφέρθηκαν και διορθώθηκαν
σε επόμενες εκδόσεις των Broswer.
Το πρόβλημα με το DNS
Κάθε Η/Υ που είναι συνδεδεμένος στο Internet έχει έναν αριθμό
IP που προσδιορίζει αυτόν τον Η/Υ μοναδικά. Αυτός ο αριθμός
τεμαχίζεται σε τέσσερις αριθμούς από 0-255 οι οποίοι χωρίζονται
μεταξύ τους με τελείες. Ένα παράδειγμα είναι ο αριθμός 195.20.10.2
κ.λ.π. Επειδή για τον χρήστη η απομνημόνευση τέτοιων αριθμών
είναι δύσκολη, κάθε τέτοιος αριθμός έχει αντιστοιχιστεί σε
ένα όνομα που σαφώς είναι πολύ πιο κατανοητό, π.χ. www.station1.uom.gr,
www.terminal2.microsoft.com κ.λ.π. Αυτός ο μηχανισμός ονοματοδοσίας
λειτουργεί με την βοήθεια του DNS (Domain Name Server). Το
πρόβλημα ξεκινάει επειδή υπάρχει η δυνατότητα ένα μηχάνημα
με ένα όνομα DNS να έχει δύο ή και περισσότερες διευθύνσεις
IP αλλά και το αντίθετο, δύο διαφορετικά ονόματα DNS να έχουν
το ίδιο IP.
Σύμφωνα με τους κανόνες των applets, ένα applet δεν μπορεί
να συνδεθεί με άλλο μηχάνημα στο δίκτυο εκτός απ’ αυτό απ’
το οποίο προήλθε. Με ποιο μηχανισμό διασφαλίζεται αυτό. Όταν
ένα applet αιτείται μια σύνδεση με κάποιον μηχάνημα το DNS
μεταφράζει πρώτα την διεύθυνση του Web Server απ’ τον οποίο
προήλθε σε μια λίστα IP διευθύνσεων. Το ίδιο κάνει και με
το όνομα αυτού του μηχανήματος με το οποίο πρόκειται να συνδεθεί.
Έτσι υπάρχουν δύο λίστες διευθύνσεων IP τις οποίες συγκρίνει
και αν υπάρχει μια κοινή διεύθυνση, επιτρέπει την σύνδεση,
εάν δεν υπάρχει που σημαίνει ότι το applet προσπαθεί να συνδεθεί
με τρίτο μηχάνημα και όχι σ’ αυτό απ’ το οποίο προήλθε τότε
ο μηχανισμός ασφαλείας αρνείται να κάνει την σύνδεση.
Πως μπορεί τώρα να ενεργήσει κάποιος κακόβουλος. Απ΄ την μια
μεριά είναι ο κακός που “στήνει” ένας Web Server με το όνομα
www.κακόβουλος.com με διεύθυνση IP 66.66.66.66. Μέσα σ’ αυτόν
υπάρχει ένα μηχάνημα το www.H/Y1.κακόβουλος.com. Απ’ την άλλη
πλευρά υπάρχει ο www.περίεργος.com με διεύθυνση IP 1.1.1.1
και ο www.αθώος.com με διεύθυνση IP 0.0.0.0. Το σκηνικό είναι
έτοιμο. Ο περίεργος επισκέπτεται το domain του κακόβουλου
απ’ το οποίο “κατεβαίνει” ένα applet. Στην συνέχεια αυτό το
applet αιτείται μια σύνδεση με το μηχάνημα Η/Υ1 του κακόβουλου.
Το DNS επειδή έχει την λάθος δυνατότητα να επιστρέψει περισσότερες
από μια διευθύνσεις IP μπορεί να επιστρέψει τις διευθύνσεις
0.0.0.0 και 66.66.66.66. Ο μηχανισμός ασφαλείας της Java επειδή
βρίσκει την διεύθυνση 66.66.66.66 να ταιριάζει νομίζει ότι
η σύνδεση θα γίνει με τον Web Server απ’ τον οποίο προήλθε
το applet. Τελικά όμως εξαιτίας των διπλών διευθύνσεων το
μηχάνημα συνδέεται στην διεύθυνση 0.0.0.0 με το μηχάνημα του
αθώου ο οποίος στο τέλος την πληρώνει.
Τελικά η λύση στο πρόβλημα βρέθηκε με τον περιορισμό του DNS
στο να δίνει μια μόνο διεύθυνση η οποία αποθηκεύεται και είναι
αυτή του Web Server απ’ την οποία προήλθε το applet και καμία
άλλη.
Το πρόβλημα με τις καθέτους
Το δεύτερο πρόβλημα προκύπτει από το γεγονός ότι η Java θεωρεί
ως ασφαλή κώδικα Java αυτόν που προέρχεται απ’ τον τοπικό
σκληρό δίσκο και ύποπτο αυτόν που προέρχεται απ’ το δίκτυο.
¶ρα αν κάποιος μπορέσει να τοποθετήσει ένα κακόβουλο κομμάτι
κώδικα στον τοπικό σκληρό δίσκο τότε η Java θα το χειριστεί
σαν ασφαλή κώδικα. Αφού ο κώδικας αυτός τοποθετηθεί στον σκληρό
δίσκο θα πρέπει να τοποθετηθεί και στο κατάλληλο κατάλογο
για να μπορέσει η ίδια η Java να το καλέσει, μιας και ο κώδικας
της Java φορτώνεται καλώντας το ένα κομμάτι το άλλο.
Ας πάρουμε όμως τα πράγματα με την σειρά. Το να τοποθετήσουμε
ένα κομμάτι κώδικα μέσα στον τοπικό σκληρό δίσκο κάποιου δεν
είναι ιδιαίτερα δύσκολο. Πολλά μηχανήματα έχουν δημόσιο FTP
κατάλογο όπου μπορούμε να βάλουμε ό,τι θέλουμε, επίσης πολλά
υποψήφια θύματα χρησιμοποιούν ένα δημόσιο μηχάνημα και ο επιτιθέμενος
παίρνοντας λογαριασμό σε αυτό το μηχάνημα μπορεί να βάλει
αρχεία όπου θέλει. Επίσης υπάρχει και ένας τρόπος χρησιμοποιώντας
τον μηχανισμό cache του Browser, αλλά δεν θα αναφερθώ εδώ
με λεπτομέρειες.
Οι ασφαλείς κλάσεις της Java βρίσκονται σε συγκεκριμένο κατάλογο
του τοπικού σκληρού δίσκου. Για παράδειγμα είναι στον κατάλογο
\programs\netscape\java\applets. Ό,τι μπορεί να μπει εκεί
μέσα απ’ το παράθυρο έχει την δυνατότητα να κάνει την ζημιά.
Τα ονόματα των κλάσεων που καλούνται έχουν την μορφή java.applets.class1,
java.applets.class2 κ.λ.π. όπου προσέξτε όμως όταν γίνεται
η κλήση η Java μετατρέπει τις τελείες σε καθέτους “\” και
ψάχνει τις κλάσεις στο java\applets\class1 κ.λ.π. Επειδή η
διαδρομή ξεκινάει ΧΩΡΙΣ κάθετο η θέση της κλάσης είναι σχετική
και βρίσκεται πάντοτε εκεί που καθορίζει το σύστημα με την
βοήθεια του Browser, στην συγκεκριμένη περίπτωση μέσα στον
κατάλογο \programs\netscape. Μια συγκεκριμένη όμως έκδοση
του Netscape είχε το πρόβλημα ότι ΤΟΠΟΘΕΤΟΥΣΕ ΚΑΘΕΤΟ ΚΑΙ ΣΤΗΝ
ΑΡΧΗ. Έτσι στο παράδειγμα μας ζητούσε την κλάση ένα στον κατάλογο
\java\applets\class1, θεωρώντας ότι ο κατάλογος java είναι
κάτω απ’ τον κεντρικό (root). Με αυτό τον τρόπο έχοντας πρόσβαση
στον κεντρικό κατάλογο θα μπορούσε να φορτωθεί ΟΠΟΙΟΔΗΠΟΤΕ
ΑΡΧΕΙΟ ΟΠΟΥ ΚΑΙ ΑΝ ΒΡΙΣΚΟΤΑΝ, για παράδειγμα στο \windows\command.
Φυσικά το πρόβλημα διορθώθηκε με το να μην μπαίνει κάθετος
στην αρχή της κλάσης.