Βασικές Έννοιες

6.4 Ασφάλεια στην Java

6.4.1 Εισαγωγή

Η γλώσσα προγραμματισμού Java είναι ένα πρόσφατο προϊόν της Sun Microsystems Inc.. Ξεκίνησε σαν μέρος ενός μεγαλύτερου σχεδίου που αφορούσε την ανάπτυξη λογισμικού για καταναλωτικά ηλεκτρονικά. Πρόκειται για μικρές, αξιόπιστες, φορητές, πραγματικού χρόνου συσκευές που στην αρχή βασιζόντουσαν στην C++. Αρκετά προβλήματα όμως παρουσιάστηκαν και η γλώσσα C++ δεν μπόρεσε να εφαρμοστεί τελικά. Χρειάστηκε να αναπτυχθεί μία νέα γλώσσα: η Java. Η Java, στην τελική της μορφή, βρήκε περαιτέρω εφαρμογή στην επίλυση μερικών προβλημάτων του σημερινού προγραμματισμού, όπως animation, την αλληλεπίδραση πραγματικού χρόνου (real-time interaction) και την εξερεύνηση του Web (Web browsing).

Ας πάρουμε το World Wide Web για παράδειγμα. Οι Web browsers περιορίζονται σε ότι μπορεί να προσφέρει η HTML γλώσσα: σελίδες δυο διαστάσεων με κείμενο, φωτογραφίες ή γραφικά και συνδέσμους (links). Κάποια μορφή επεκτασιμότητας προσέφερε η JavaScript από την Netscape Corporation, αλλά οι σελίδες παραμένουν βαρετές, στατικές και χαζές σε περιεχόμενο. Οι Web browsers δεν διαθέτουν ακόμα την ιδιότητα της αλληλεπίδρασης πραγματικού χρόνου. Χρησιμοποιώντας την Java γλώσσα, η Sun κατασκεύασε τον νέο World Wide Web browser, τον HotJava. Πλέον, η σχέση μεταξύ server και client αλλάζει. Ο νέος browser εκμεταλλεύεται την υπολογιστική δύναμη του client και αντί να κατεβάζει απλές στατικές σελίδες κειμένου και εικόνων, ο HotJava κατεβάζει μικρά προγράμματα σε Java που τρέχουν στον client. Ο browser είναι γρήγορος, ευέλικτος, πολύπλευρος και εύκολα προσαρμόσιμος.

Από την ημέρα της δημοσιοποίηση της τον Μάιο του 1995, η Java έχει εξαπλωθεί σε όλο το Internet. Η Java έχει κιόλας λύσει τα περισσότερα προβλήματα στο μοντέλο client/server και έχει προάγει την χρήση του World Wide Web. Παρ' όλα αυτά, επειδή η Java έχει σχεδιαστεί για να χρησιμοποιείται σε ανοικτά, δικτυωμένα περιβάλλοντα, έχει βαθιές συνέπειες στην ασφάλεια ενός συστήματος υπολογιστών. Επίσης, η δυνατότητα της να διανέμει αυτόματα εκτελέσιμα αρχεία μέσω του Internet επηρεάζει, με την σειρά της, την ασφάλεια των δικτύων. Τα εκτελέσιμα αρχεία από το Internet συχνά κρύβουν παγίδες και δύσκολα μπορεί να είναι κανείς σίγουρος ότι ο κώδικας είναι ελεύθερος από ιούς.

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

6.4.2 Τι είναι Java

Η Java είναι δύο πράγματα: (α) γλώσσα προγραμματισμού και (β) πλατφόρμα.

Η Java σαν Γλώσσα Προγραμματισμού

Η Java χαρακτηρίζεται από τα εξής: απλή, αντικειμενοστραφής, συμβατή με δικτυακά πρωτόκολλα, ουδέτερη της υποκείμενης αρχιτεκτονικής, φορητή ασφαλής, υψηλής απόδοσης, δυναμική, σταθερή, interpreted και multithreaded. Στις ακόλουθες παραγράφους θα αναλύσουμε καθεμία από αυτές τις έννοιες.

Απλή

Στόχος της ομάδας της Sun που ανέπτυξε την Java, ήταν μια γλώσσα εύκολη στην χρήση, που δεν απαιτεί πολλή εξάσκηση και εκπαίδευση. Οι περισσότεροι προγραμματιστές στις μέρες μας δουλεύουν είτε με την C είτε με την C++. Έτσι, μολονότι η C++ δεν ήταν η κατάλληλη για το αρχικό σχέδιο, η Java σχεδιάστηκε βάσει της C++, με σκοπό να γίνεί όσο το δυνατόν περισσότερο κατανοητή.

Η Java παραλείπει πολλά από τα σπανίως χρησιμοποιούμενα και δυσκολονόητα χαρακτηριστικά της C++, που δεν ωφελούν και πολύ την ευελιξία της γλώσσας. Προστέθηκαν διεργασίες, όπως η αυτόματη συλλογή των "σκουπιδιών" (automatic garbage collection), διευκολύνοντας τον προγραμματισμό σε Java. Μια κοινή πηγή πολυπλοκότητας της C++ και της C είναι η διαχείριση της μνήμης. Με την καινούργια διεργασία της αυτόματης συλλογής "σκουπιδιών", που συνιστάται από την περιοδική αποδέσμευση της μνήμης που δεν χρησιμοποιείται, μεγάλο μέρος από την δουλεία των προγραμματιστών αυτοματοποιείται και μειώνονται τα bugs.

Ένα πλεονέκτημα της Java που οφείλεται στην απλότητα της είναι ότι το μέγεθος των απαραίτητων εργαλείων. Ο Java interpreter και οι βασικές βιβλιοθήκες είναι μικρές και ο κώδικάς της Java είναι τόσο περιορισμένος σε μέγεθος που μπορεί άνετα να τρέξει σε οποιαδήποτε μικρή μηχανή και να κατέβει από το δίκτυο.

Αντικειμενοστραφής

Λέγοντας ότι μία γλώσσα προγραμματισμού είναι αντικειμενοστραφής, εννοούμε η τεχνική σχεδιασμού ενός προγράμματος συγκεντρώνεται σε αντικείμενα. Ένα αντικείμενο είναι ο συνδυασμός δεδομένων, διαδικασιών και λειτουργιών με βασική ιδιότητα την απόκρυψη του συνδυασμού αυτού. Το κάθε αντικείμενο, δηλαδή, αντιμετωπίζεται σαν ένα "μαύρο κουτί". Τα αντικείμενα δεν είναι ανεξάρτητα μεταξύ τους, αλλά βρίσκονται σε σχέση αλληλεξάρτησης με τα υπόλοιπα. Υπάρχει η έννοια της κληρονομικότητας μεταξύ των αντικειμένων, δηλαδή ένα αντικείμενο μπορεί να κληρονομήσει δεδομένα από άλλα αντικείμενα.

Οι γλώσσες αντικειμενοστραφή προγραμματισμού είναι γλώσσες υψηλού επιπέδου, αφαιρετικές, αποτελεσματικές, γρήγορες και χρησιμοποιούνται για την δημιουργία μεγάλων και σημαντικών εφαρμογών. Οι αντικειμενοστραφής ευκολίες της Java είναι ίδιες με αυτές της C++, με επεκτάσεις από την Objectine C.

Συμβατή με Δίκτυα

Η Java έχει μια μεγάλη βιβλιοθήκη από ρουτίνες για την επιτυχημένη συνεργασία με τα πρωτόκολλα HTTP και FTP. Κατ 'αυτόν τον τρόπο, οι δικτυακές συνδέσεις δημιουργούνται ευκολότερα από ότι με την C ή την C++. Τα προγράμματα σε Java μπορούν να έχουν πρόσβαση μέσω δικτύου σε αντικείμενα , με την ίδια άνεση που ένας χρήστης προσπελάζει ένα τοπικό σύστημα αρχείων.

Σταθερή

Η Java προορίζεται για την σύνταξη προγραμμάτων που θα είναι αξιόπιστα από όλες τις πλευρές. Δίνεται έμφαση στον από νωρίς έλεγχο για πιθανά προβλήματα και στον έλεγχο σε πραγματικό χρόνο και στην εξάλειψη καταστάσεων που προκαλούν λάθη.

Η μεγαλύτερη διαφορά μεταξύ Java και C/C++ είναι το γεγονός ότι η Java έχει ένα μοντέλο δεικτών που εξαφανίζει την πιθανότητα της επαναχρησιμοποίησης της μνήμης και την καταστροφή των δεδομένων. Αντί για αριθμητικούς δείκτες (pointer arithmetic), η Java έχει πραγματικούς πίνακες (true arrays). Οι προγραμματιστές της Java δεν έχουν να φοβηθούν την ακούσια (ή μη) τροποποίηση της μνήμης, γιατί δεν υπάρχουν δείκτες (pointers). Εξάλλου, τα προγράμματα σε Java δεν μπορούν να αποκοτήσουν μη εγκεκριμένη πρόσβαση στην μνήμη.

Ασφαλής

Η Java προορίζεται για χρήση σε ανοικτά, δικτυωμένα περιβάλλοντα. Γι' αυτό το λόγο, ιδιαίτερη προσοχή έχει δοθεί στην ασφάλεια που παρέχει η γλώσσα. Η Java επιτρέπει την κατασκευή προγραμμάτων ελεύθερων από ιούς και η τροποποίηση τους είναι αδύνατη. Οι τεχνικές πιστοποίησης ταυτότητας βασίζονται στην ασύμμετρη κρυπτογραφία.

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

Ουδέτερη της Υποκείμενης Αρχιτεκτονικής

Η Java έχει σχεδιαστεί για να υποστηρίζει δικτυακές εφαρμογές. Ένα δίκτυο, όμως, αποτελείται από ποικιλία διαφορετικών συστημάτων, με διαφορετικές CPU και λειτουργικά συστήματα. Για να μπορούν οι Java εφαρμογές να εκτελούνται παντού στο δίκτυο, το πρόγραμμα Java πρέπει να περάσει από δύο διαδικασίες ώστε να καταλήξει σε εκτελέσιμη μορφή. Πρώτα ο μεταγλωττιστής, μετατρέπει τον πηγαίο κώδικα του προγράμματος σε μία ενδιάμεση γλώσσα που καλείται Java bytecodes. Τα Java bytecodes είναι ανεξάρτητα της πλατφόρμας και με χρήση του ερμηνευτή (interpreter) κάθε bytecode εντολή μετατρέπεται σε κατάλληλη δυαδική μορφή για να τρέξει στον εκάστοτε υπολογιστή. Η μεταγλώττιση (compilation) συμβαίνει μόνο μια φορά για κάθε Java πρόγραμμα, η ερμηνεία (interpretation) γίνεται κάθε φορά που το πρόγραμμα εκτελείται. Το παρακάτω σχήμα επιδεικνύει πως λειτουργεί αυτή η φιλοσοφία.

Τα Java bytecodes μπορούμε να τα φανταστούμε σαν την γλώσσα μηχανής για την Java Virtual Machine (JVM). Κάθε Java ερμηνευτής (π.χ. ένας Web browser που μπορεί να τρέχει applets) είναι μια λογισμική εφαρμογή του της Java Virtual Machine. Η JVM αναλαμβάνει να μετατρέψει τα bytecodes σε κατάλληλη εκτελέσιμη μορφή, ανάλογα με το υποκείμενο software και hardware.

Η τεχνική που περιγράφηκε παραπάνω καλείται "write once, run anywhere". Το Java πρόγραμμα μεταγλωττίζεται μία φορά σε Java bytecodes με τον μεταγλωττιστή της Java. Έπειτα, τα bytecodes μπορούν να τρέξουν σε οποιαδήποτε μηχανή που έχει μία εφηρμοσμένη JVM (ο ερμηνευτής).

Φορητή

Το γεγονός ότι είναι ανεξάρτητη της υποκείμενης πλατφόρμας αποτελεί μεγάλο μέρος του ότι είναι φορητή, άλλα υπάρχουν και άλλα σημεία που χαρακτηρίζουν την φορητότητα της.

Σε αντίθεση με την C/C++ δεν υπάρχουν καθόλου χαρακτηριστικά που εξαρτούνται από την CPU του υπολογιστή. Έτσι, τα μεγέθη των πρωταρχικών τύπων δεδομένων είναι καθορισμένα και η συμπεριφορά τους είναι παντού η ίδια. Για παράδειγμα, "int" σημαίνει πάντα έναν 32 bit ακέραιο και "float" πάντα αντιπροσωπεύει έναν 32 bit floating αριθμό.

Interpreted

Τα Java bytecodes μεταφράζονται σε πραγματικό χρόνο σε εντολές μηχανής που εξαρτώνται από την εκάστοτε πλατφόρμα, και δεν αποθηκεύονται πουθενά. Η διαδικασία είναι γρήγορη και πιο αποτελεσματική. Μαζί με τα bytecodes μεταφέρονται πληροφορίες που μπορούν να χρησιμοποιηθούν κατά την εκτέλεση και παρέχουν την βάση για τους ελέγχους που πραγματοποιεί ο συνδετής (linker). Επίσης τα προγράμματα γίνονται πιο επιδεκτικά σε debugging διαδικασίες.

Υψηλής Απόδοσης

Η διαδικασία παραγωγής των εντολών μηχανής είναι απλή και γρήγορη. Ο κώδικας που προκύπτει είναι αποτελεσματικός. Ο μεταγλωττιστής από την μεριά του εφαρμόζει αυτόματη κατανομή των καταχωρητών (automatic register allocation) όταν παράγει τα bytecodes. Η τελική μορφή του κώδικα (εκτελέσιμη δυαδική μορφή) είναι μικρή σε μέγεθος και ταχύτατη στην εκτέλεση.

Multithreaded

Τα προγράμματα σε Java έχουν την δυνατότητα να αντιμετωπίζουν πολλές καταστάσεις – διαδικασίες ταυτόχρονα. Σε αντίθεση, η C και C++ είναι single-threaded γλώσσες. Τα πλεονεκτήματα του multithreading είναι η καλύτερη πραγματικού χρόνου συμπεριφορά και η καλύτερη αλληλεπιδραστική ανταπόκριση.

Δυναμική

Η Java είναι πιο δυναμική γλώσσα από την C ή C++. Έχει αναπτυχθεί για να προσαρμοστεί σε ένα εξελισσόμενο περιβάλλον. Οι βιβλιοθήκες εργαλείων αναπτύσσονται ελεύθερα με την πρόσθεση νέων μεθόδων και μεταβλητών, χωρίς να επηρεάζονται οι ήδη υπάρχουσες εφαρμογές.

Applets και Applications

Υπάρχουν δύο είδη προγραμμάτων στην Java: τα applets και οι applications.

Τα δύο είδη έχουν πολλές κοινές δυνατότητες, όπως πρόσβαση σε απομακρυσμένη βάση δεδομένων, απόκτηση των ζητούμενων δεδομένων, τοπική επεξεργασία των δεδομένων και αποθήκευση των αποτελεσμάτων στον απομακρυσμένο υπολογιστή. Παρ' όλα αυτά, οι applications έχουν μεγαλύτερη ελευθερία όσον αναφορά τις υπηρεσίες του συστήματος. Για παράδειγμα, μια application, σε αντίθεση με ένα applet, έχει πρόσβαση γραφής και ανάγνωσης στα αρχεία οποιουδήποτε δίσκου. Ένα applet έχει πλήρη πρόσβαση μόνο στον σύστημα αρχείων του server από τον οποίο προήλθε. Επίσης, μια ακόμα αξιοσημείωτη διαφορά είναι ότι το applet χρειάζεται δίκτυο για να τρέξει, ενώ μια application όχι.

Η Java Πλατφόρμα

Πλατφόρμα είναι το hardware ή software περιβάλλον όπου τρέχει ένα πρόγραμμα. Η Java πλατφόρμα διαφέρει από τις άλλες πλατφόρμες, γιατί είναι μία software-only πλατφόρμα που τρέχει πάνω από άλλες hardware πλατφόρμες. Οι υπόλοιπες πλατφόρμες περιγράφονται σαν συνδυασμός hardware και software.

Η Java πλατφόρμα έχει δύο στοιχεία: την Java Virtual Machine (JVM) και το Java Application Programming Interface (Java API).

Τα προγράμματα σε Java, λόγω της συμβατότητας τους με όλα είδη υπολογιστών, μπορεί να είναι λίγο πιο αργά σε εκτέλεση από ότι τα προγράμματα σε τοπική γλώσσα μηχανής. Η χρήση, όμως, just-in-time-compilers εξαλείφει και αυτό το πρόβλημα. Παρακάτω βλέπουμε το ολοκληρωμένο μοντέλο της Java πλατφόρμας.

 

6.4.3 Ασφάλεια στην Java

Το μοντέλο Sandbox

Το μοντέλο ασφαλείας στην Java επιτρέπει σε ένα χρήστη να εισάγει και να τρέξει applets από το Web ή από το εσωτερικό δίκτυο, χωρίς την δημιουργία υπερβολικού ρίσκου για την ακεραιτότητα της μηχανής του χρήστη. Οι ενέργειες του applet είναι περιορισμένες σε ένα θεωρητικό "κουτί", που καλείται "sandbox". Το sandbox καταλαμβάνει μια περιοχή του Web browser που αφιερώνεται στο applet. Το applet μπορεί να κάνει ότι θέλει μέσα στα όρια του sandbox, άλλα δεν μπορεί να διαβάσει ή να τροποποιήσει δεδομένα έξω από το sandbox. Το μοντέλο sandbox χρησιμοποιείται για την εκτέλεση μη έμπιστου κώδικα σε ένα ασφαλές περιβάλλον, ώστε εάν ο χρήστης κατεβάσει ένα "εχθρικό" applet, να μην μπορεί να καταστρέψει το σύστημα.

Οι τελικοί χρήστες δεν είναι ανάγκη να προβούν σε καμία ενέργεια για την διασφάλιση της μηχανής τους. Το sandbox δεν προσπαθεί να αναγνωρίσει τους πιθανούς ιούς που μπορεί να κρύβονται στο applet. Απλά δεν του επιτρέπει να πραγματοποιήσει καμία από τις ενέργειες που χαρακτηρίζουν έναν ιό. Κατ' αυτόν τον τρόπο δεν είναι δυνατή η κλοπή δεδομένων ή η εξάπλωση ενός ιού. Επίσης, το μοντέλο δεν απαιτεί περιοδικές ενημερώσεις για νέους ιούς.

Οι παραπάνω περιορισμοί απευθύνονται μονάχα στα applets, λόγω της ιδιότητας τους να ταξιδεύουν στο Διαδίκτυο. Οι Java applications είναι προγράμματα που αγοράζονται και εγκαθίστανται όπως όλα τα συνηθισμένα προγράμματα. Από την στιγμή που οι applications δεν προέρχονται από το Διαδίκτυο και εγκαθίστανται από εγκεκριμένα άτομα, δεν προσθέτουν νέα προβλήματα ασφαλείας.

Χτίζοντας το Sandbox

Τα όρια και τα χαρακτηριστικά του sandbox καθορίζονται από τρία διαφορετικά συστήματα που λειτουργούν σε συνεργασία.

Class Loader

Όταν ένα applet πρόκειται να εισαχθεί από το δίκτυο, ο Web browser καλεί τον applet class loader. Ο class loader αναλαμβάνει να κατεβάσει τον εκτελέσιμο κώδικα από το δίκτυο και έπειτα εφαρμόζει την ιεραρχία του name space. Ο όρος "name space" περιγράφει το κομμάτι της JVM που έχει πρόσβαση ένα applet. Ο class loader αποτρέπει τα applet από την απόκτηση μη εγκεκριμένης πρόσβασης σε περισσότερο προνομιούχα μέρη του συστήματος και πιο συγκεκριμένα της μνήμης.

Τα applets που κατεβαίνουν από το Διαδίκτυο δεν μπορούν να δημιουργήσουν τους δικούς τους class loaders.

Verifier

Πριν την εκτέλεση ενός νεοφερμένου applet, ο class loader ξεκινά τον verifier. Ο verifier ελέγχει εάν το applet συμμορφώνεται με τους κανόνες της Java γλώσσας και ότι δεν παραβιάζονται οι περιορισμοί του name space. Επίσης, ο verifier ελέγχει για παραβιάσεις της διαχείρισης μνήμης, όπως η υπερχείλιση του stack και η χρήση παράνομων τύπων δεδομένων, που θα επέτρεπαν σε ένα "εχθρικό" applet να καταστρέψει τα δεδομένα της μνήμης ή να αντικαταστήσει κομμάτια μνήμης.

Αυτό που στην ουσία επιτελεί ο verifier είναι η διαχείριση της μνήμης και εξάλειψη των πιθανοτήτων επικάλυψης δεδομένων της. Η μη έγκυρη πρόσβαση στα δεδομένα της μνήμης ή της πρόσβασης των δεδομένων των αντικειμένων είναι αδύνατη. Όπως προείπαμε, αντί για αριθμητικούς δείκτες (pointer arithmetic), η Java έχει πραγματικούς πίνακες (true arrays), περιορίζοντας την δράση των ιών.

Security Manager

Ο security manager εφαρμόζει τα όρια γύρω από το sandbox. Οποτεδήποτε ένα applet προσπαθεί να πραγματοποιήσει μία ενέργεια που θα μπορούσε να καταστρέψει την μηχανή του χρήστη ή να διαβάσει απαγορευμένα δεδομένα, η JVM πρώτα ρωτά τον security manager εάν η συγκεκριμένη ενέργεια μπορεί να γίνει με ασφάλεια. Εάν ο security manager εγκρίνει την ενέργεια, για παράδειγμα όταν ένα applet από τον σκληρό δίσκο του υπολογιστή προσπαθεί να διαβάσει κάποιο αρχείο ή όταν ένα μη έμπιστο applet προσπαθεί να συνδεθεί με τον server του, η JVM θα εκτελέσει την ζητούμενη ενέργεια. Διαφορετικά, η JVM αρνείται να προχωρήσει στην εκτέλεση και γράφει ένα μήνυμα λάθους στην Java console.

Ο security manager δεν θα επιτρέψει σε ένα μη έμπιστο applet να διαβάσει ή να γράψει σε ένα αρχείο, να σβήσει ένα αρχείο, να πάρει πληροφορίες για ένα αρχείο, να εκτελέσει εντολές του συστήματος ή άλλα προγράμματα, να φορτώσει μια βιβλιοθήκη στην μνήμη ή να εγκαθιδρύσει σύνδεση με οποιαδήποτε μηχανή εκτός από τον server από τον οποίο προήλθε το applet.

Μια Java εφαρμογή ή ένας Web browser μπορεί να έχει μόνο έναν security manager, σιγουρεύοντας την εφαρμογή μίας και μόνης πολιτικής. Ο security manager φορτώνεται κατά την εκκίνηση του Web browser ή της Java εφαρμογής και δεν μπορεί να επεκταθεί, να παραληφθεί ή να αντικατασταθεί. Τέλος, ένα applet δεν μπορεί να δημιουργήσει τον δικό του security manager.

Στο παρακάτω σχήμα βλέπουμε μια αναπαράσταση του μοντέλου ασφαλείας της Java.

 

Χαρακτηριστικά της Γλώσσας

Η Java έχει αρκετά χαρακτηριστικά που προστατεύουν την ασφάλεια και την ακεραιότητα του συστήματος και που αποτρέπουν μερικές συνηθισμένες επιθέσεις. Τα Java προγράμματα δεν μπορούν να ορίζουν τους δικούς τους δείκτες στην μνήμη του συστήματος, ούτε έχουν απευθείας πρόσβαση στην φυσική μνήμη. Η γλώσσα ελέγχει όλες τις ενέργειες του applet ώστε να μην μπορεί να του επιτρέπεται να δημιουργήσει τους δικούς του class loader ή security managers. Έχει, επιπλέον, ειδικούς ελέγχους για κακομεταχείριση δεικτών και μνήμης.

Διαθέσιμη για Έρευνες

Η Sun δημοσιοποίησε, από την πρώτη μέρα της παρουσίαση της, όλες τις λεπτομέρειες του μοντέλου ασφαλείας της Java, συμπεριλαμβανομένων και της περιγραφής της γλώσσας, των μηχανισμών, του sandbox και τον πλήρη πηγαίο κώδικα της γλώσσας. Αυτή η προσέγγιση έχει σαν σκοπό να ενθαρρύνει μελετητές από όλο τον κόσμο να εξετάσουν την γλώσσα και να αναφέρουν τυχόν προβλήματα που θα βρεθούν. Τα προβλήματα θα διορθωθούν πριν γίνουν ευρέως γνωστά στην κοινότητα του Internet και τα εκμεταλλευτούν πιθανοί εισβολείς.

6.4.4 Επεκτείνοντας την Ασφάλεια στην Java

Υπογεγραμμένα JAR Αρχεία

Όλα τα δικτυωμένα συστήματα είναι ευάλωτα στις επιθέσεις man-in-the-middle. Για την καταπολέμηση τέτοιων επιθέσεων είναι απαραίτητη η υπογραφή της ανταλλασσόμενης πληροφορίας με τρόπο που να διασφαλίζεται η ακεραιότητα των δεδομένων και να μπορεί να επιβεβαιωθεί η ταυτότητα του αποστολέα πέρα από κάθε αμφιβολία. Ακολουθώντας αυτήν την φιλοσοφία, τα applets υπογράφονται με σκοπό την εμπιστοσύνη στο λογισμικό που διανέμεται ελεύθερα στο Διαδίκτυο.

Για την υπογραφή ενός applet, ο συγγραφέας του πρώτα δένει σε ένα ενιαίο πακέτο όλα τον Java κώδικα και τα συσχετιζόμενα αρχεία του applet, δημιουργώντας ένα Java Archive ή JAR. Ο συγγραφέας του applet, έπειτα, υπογραφεί το JAR και παράγει την υπογραφή αυτού που βασίζεται στα περιεχόμενα του. Χρησιμοποιείται ασύμμετρη κρυπτογραφία σε συνδυασμό με πιστοποιητικά για την μεταφορά της δημόσιας κλείδας. Οι αλγόριθμοι που εφαρμόζονται είναι οι MD5, DSA και ο SHA-1. Η μορφή του πιστοποιητικού ακολουθεί το πρωτόκολλο Χ.509.

Τα JAR αρχεία λύνουν και ένα άλλο πρόβλημα: τα περισσότερα Java applets παίρνουν πολύ ώρα να μεταφερθούν στον υπολογιστή του χρήστη, πράγμα ενοχλητικό ακόμα και για χρήστες με γρήγορες συνδέσεις. Ακόμα, η μεταφορά των Web σελίδων με τα υπάρχοντα πρωτόκολλα γίνεται ένα αρχείο κάθε φορά. Επειδή τα JAR αρχεία μεταφέρουν όλες τις πληροφορίες του applet δεμένες σε ένα πακέτο, η επεξεργασία και η εκτέλεση των applets επιταχύνεται σημαντικά.

Ευέλικτες Πολιτικές

Καθ' ότι οι ψηφιακές υπογραφές παρέχουν την απαραίτητη πιστοποίηση της ταυτότητας του αποστολέα του applet, είναι δυνατόν να εφαρμόζονται πιο ελαστικές και ευέλικτες πολιτικές ασφαλείας. Τα applets που προέρχονται από servers που εμπιστεύεται ο χρήστης, μπορούν να αντιμετωπίζονται με λιγότερους περιορισμούς.

Ας πούμε για παράδειγμα, ότι ο χρήστης δηλώσει ότι ο server μίας συγκεκριμένης τράπεζας ή εταιρίας πιστωτικών καρτών είναι έμπιστος. Τα applets που αποστέλλονται από αυτόν τον server, αφού πιστοποιηθούν, θα χειρίζονται από την JVM σαν να ήταν τοπικά εγκατεστημένο πρόγραμμα.

Το μοντέλο της ασφάλειας αλλάζει ως εξής:

Επιπλέον, είναι δυνατόν ο security manager να επιβάλλει διαφορετικά επίπεδα ασφαλείας, βασιζόμενος με το πόσο μπορεί να εμπιστευτεί τον εκδότη ενός applet ή ακόμα και το Internet σαν σύνολο.

Auditing

Η καταγραφή όλων όσων συμβαίνουν κατά την διάρκεια μιας συναλλαγής, μπορεί να αποβεί πολύ χρήσιμη. Οτιδήποτε πάει στραβά, είτε λόγω ατυχήματος είτε λόγω κάποιου bug ή ακόμα και επίθεσης, καταγράφεται λεπτομερώς σε κατάλληλα αρχεία. Ο διαχειριστής του συστήματος και το προσωπικό ασφαλείας είναι σε θέση να καταλάβουν τι συνέβηκε και να λάβουν τα απαραίτητα μέτρα για μην επαναληφθεί το γεγονός. Μολονότι κάτι τέτοιο δεν μπορεί να καλύψει τις υπάρχουσες "τρύπες", είναι σημαντικό εργαλείο για την ανακάλυψη τους.

Κρυπτογράφηση

Τα υπογεγραμμένα applets παρέχουν την υπηρεσία της πιστοποίησης της ταυτότητας και την ακεραιότητα των δεδομένων. Είναι απαραίτητο, όμως, να διασφαλιστεί και το απόρρητο της συναλλαγής. Αυτό επιτυγχάνεται με την χρήση κρυπτογράφησης για την απόκρυψη της διακινούμενης πληροφορίας. Επί του παρόντος, αναπτύσσονται εργαλεία για την κρυπτογράφηση των Java αρχείων.

6.4.5 Ατέλειες

Ενώ πολλοί ειδικοί υποστηρίζουν ότι το μοντέλο ασφαλείας της Java είναι αδιαπέραστο, υπάρχει ανησυχία λόγω του γεγονότος ότι το μοντέλο δεν έχει εξεταστεί με αρκετή λεπτομέρεια, ώστε να επιβεβαιωθεί ότι το sandbox είναι όσο ασφαλές όλο λέγεται ότι είναι. Διαρκώς ανακαλύπτονται νέα bugs και άλλα λάθη στον κώδικα της γλώσσας που μπορούν να εκμεταλλευτούν από "εχθρικά" applets. Άλλες ατέλειες που έχουν να κάνουν με μη αναμενόμενες αλληλεπιδράσεις μεταξύ των Java applets και άλλων μερών του δικτύου που επίσης μπορούν να εκμεταλλευτούν από. Πολλές από αυτές της αδυναμίες του Java συστήματος έχουν καλυφθεί, ενώ οι έρευνες συνεχίζονται και καινούργιες ατέλειες έρχονται στην επιφάνεια.

6.4.6 Περαιτέρω Πληροφορίες

Επιπλέον πληροφορίες για το μοντέλο ασφάλειας της Java και για την ίδια την γλώσσα, είναι διαθέσιμες στις παρακάτω ηλεκτρονικές σελίδες:

Java Security Resources -- http://pantheon.yale.edu/~dff/java.html

Java Security -- http://java.sun.com/sfaq/

Secure Internet Programming: Java Security: From HotJava to Netscape and Beyond http://www.cs.princeton.edu/sip/pub/secure96.html

Frequently Asked Questions - Applet Security -- http://swissnet.ai.mit.edu/~jbank/javapaper/javapaper.html

Java(tm) Technology Home Page -- http://java.sun.com/

Java White Papers -- http://java.sun.com/docs/white/

Βασικές Έννοιες