Διάχυση πληροφοριών και ασφάλεια στον παγκόσμιο ιστό

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Αρχιτεκτονική του παγκόσμιου ιστού

Προσδιορισμός στοιχείων με URI

Ο προσδιορισμός στοιχείων στο πρωτόκολλο HTTP γίνεται με τη χρήση των Uniform Resource Identifiers. Αυτά ορίζονται από την παρακάτω γραμματική (RFC 2068):
  URI            = ( absoluteURI | relativeURI ) [ "#" fragment ]

  absoluteURI    = scheme ":" *( uchar | reserved )

  relativeURI    = net_path | abs_path | rel_path

  net_path       = "//" net_loc [ abs_path ]
  abs_path       = "/" rel_path
  rel_path       = [ path ] [ ";" params ] [ "?" query ]

  path           = fsegment *( "/" segment )
  fsegment       = 1*pchar
  segment        = *pchar

  params         = param *( ";" param )
  param          = *( pchar | "/" )
  scheme         = 1*( ALPHA | DIGIT | "+" | "-" | "." )
  net_loc        = *( pchar | ";" | "?" )

  query          = *( uchar | reserved )
  fragment       = *( uchar | reserved )

  pchar          = uchar | ":" | "@" | "&" | "=" | "+"
  uchar          = unreserved | escape
  unreserved     = ALPHA | DIGIT | safe | extra | national

  escape         = "%" HEX HEX
  reserved       = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"
  extra          = "!" | "*" | "'" | "(" | ")" | ","
  safe           = "$" | "-" | "_" | "."
  unsafe         = CTL | SP | <"> | "#" | "%" | "<" | ">"
  national       = <any OCTET excluding ALPHA, DIGIT,
		   reserved, extra, safe, and unsafe>
Η χρήση τους επιτρέπει τον προσδιορισμό άλλων σελίδων τοπικά, σε άλλα μηχανήματα, καθώς και ερωτήσεων:
http://kerkis.math.aegean.gr/~dspin/
http://www.altavista.com/cgi-bin/query?pg=q&text=yes&q=link%3akerkis%2emath%2eaegean%2egr%2f%7edspin+%2dhost%3akerkis%2emath%2eaegean%2egr&stq=10&c9k
Σημαντικά προβλήματα ασφάλειας που μπορούν να προκύψουν είναι τα παρακάτω:
  1. Το σύστημα DNS που μετατρέπει τα ονόματα σε διευθύνσεις δεν είναι ασφαλές
  2. Οποιοσδήποτε μπορεί να δημιουργήσει ένα URI. Δεν πρέπει η ασφάλειά μας να βασίζεται σε "κρυμμένα" αρχεία ή στη χρήση συγκεκριμένων URI.
  3. Με τον προσδιορισμό άλλων θυρών μπορεί ένα "αθώο" URI να "μιλήσει" σε άλλο πρωτόκολλο (όχι HTTP) με καταστροφικά αποτελέσματα.
  4. Όταν ένα URI περιέχει συνθηματικό αυτό δεν μπορεί να είναι εμπιστευτικό.

Το πρωτόκολλο HTTP

Το πρωτόκολλο HTTP υποστηρίζει τις παρακάτω μεθόδους επικοινωνίας: Παράδειγμα:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
Βασικά προβλήματα ασφάλειας που έχουν σχέση με το HTTP είναι τα παρακάτω:

Διασφάλιση συναλλαγών HTTP

Συναλλαγές που χρησιμοποιούν HTTP μπορούν να ασφαλιστούν ως προς την εμπιστευτικότητα και την ακεραιότητα σε τρία διαφορετικά επίπεδα:
  1. Κάτω από το πρωτόκολλο HTTP μέσω SSL ή IPSEC
  2. Επεκτείνοντας το πρωτόκολλο HTTP (π.χ. secure HTTP)
  3. Πάνω από το πρωτόκολλο HTTP με λ.χ. με εξειδικευμένες εφαρμογές σε Java που κρυπτογραφούν τα μηνύματα.

Περιγραφή σελίδων με HTML

H HTML είναι μια εφαρμογή της SGML για την περιγραφή σελίδων στο Web. Περιοχές του κειμένου σημειώνονται με ετικέτες (tags). Κάθε ετικέτα περιλαμβάνει το όνομά της και παραμέτρους. Οι ετικέτες γράφονται ως εξής:
<όνομα ετικέτας παράμετροι>
Μια περιοχή του κειμένου μπορεί να σημειωθεί ως εξής:
<ετικέτα>
περιοχή που σημειώνεται
</ετικέτα>
Βασικές ετικέτες που υποστηρίζει η HTML είναι οι παρακάτω:
HTML
περιγραφή ολόκληρης σελίδας
HEAD
επικεφαλίδα της σελίδας
BODY
κείμενο της σελίδας
H1-H6
επικεφαλίδες του κειμένου
P
αλλαγή παραγράφου
UL
λίστα με τελείες
OL
αριθμημένη λίστας
LI
στοιχείο λίστας
BR
αλλαγή γραμμής
HR
οριζόντια γραμμή
IMG
εικόνα
A
(anchor) σημείο πρόσβασης από ή σε υπερκείμενο
PRE
προστοιχειοθετημένο κείμενο
DL, DT, DD
λίστα περιγραφών, περιγραφές
I
πλάγιοι χαρακτήρες
B
έντονοι χαρακτήρες
Παράδειγμα σελίδας:
<!doctype html public "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Τίτλος της σελίδας</title>

<META NAME="GENERATOR" CONTENT="thread.pl">
<META NAME="AUTHOR" CONTENT="Diomidis Spinellis">
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=ISO-8859-7">
<LINK REV="made" HREF="mailto:dspin@aegean.gr"> 
<LINK REL="ToC" HREF=".././web/index.htm">
<LINK REV="Subdocument" HREF=".././web/index.htm">
<LINK REL="previous" HREF=".././web/http.htm">
<LINK REL="next" HREF=".././web/cgi.htm">

</HEAD>

<BODY> <H1>Επικεφαλίδα πρώτου επιπέδου</H1><HR>
Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
<a name="G42"> (<em>με έντονο κείμενο</em>)</a> 
και μια λίστα:
<ul>
<li> στοιχείο 1
<li> στοιχείο 2
</ul>

<p>
Νέα παράγραφος με ένωση υπερκειμένου στο
<A HREF="http://www.aegean.gr">Πανεπιστήμιο Αιγαίου</A>

<HR>
</BODY>

</HTML>
Προβλήματα ασφάλειας που σχετίζονται με την HTML είναι τα εξής:

Ενεργό περιεχόμενο με CGI

Προγράμματα CGI (Common Gateway Interface) επικοινωνούν με τον εξυπηρετητή Web για να εκτελέσουν κάποιες λειτουργίες που ζητά ο πελάτης, ή/και να δημιουργήσουν ενεργό περιεχόμενο.

Το πρόγραμμα CGI δέχεται από τον εξυπηρετητή τις παραμέτρους που καθόρισε ο χρήστης μέσω μεταβλητών του περιβάλλοντος (environment variables). Τυπικό δείγμα των μεταβλητών που μεταφέρονται στο πρόγραμμα CGI είναι το παρακάτω:

SERVER_SOFTWARE=Apache/1.2.5
GATEWAY_INTERFACE=CGI/1.1
DOCUMENT_ROOT=/home/www/htdocs
REMOTE_ADDR=192.168.135.5
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
REMOTE_HOST=staffpc15.aegean.gr
QUERY_STRING=
HTTP_USER_AGENT=Mozilla/3.01 (Win95; I)
PATH=/bin:/usr/bin:
HTTP_CONNECTION=Keep-Alive
HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
REMOTE_PORT=1124
SCRIPT_NAME=/cgi-bin/pe
SCRIPT_FILENAME=/home/www//cgi-bin/pe
SERVER_NAME=www.aegean.gr
REQUEST_URI=/cgi-bin/pe
SERVER_PORT=80
HTTP_HOST=www.aegean.gr
SERVER_ADMIN=webmaster@aegean.gr
Αφού το πρόγραμμα επεξεργαστεί τις παραμέτρους που όρισε ο χρήστης στη φόρμα (που περιέχονται κωδικοποιημένες στη μεταβλητή QUERY_STRING) δημιουργεί μια πλήρη απάντηση σύμφωνα με το πρωτόκολλο HTTP (επικεφαλίδα και δεδομένα). Για παράδειγμα, η εκτύπωση των πιο πάνω μεταβλητών έγινε από το εξής πρόγραμμα σε Perl:
#!/usr/bin/perl
print "Content-Type: text/plain\n\n";
for $key (keys %ENV) {
        print "$key=$ENV{$key}\n";
}
Σχετιζόμενα προβλήματα ασφάλειας είναι τα παρακάτω: Παρόμοια προβλήματα μπορούν να εμφανίσουν και τα server side includes που εκτελούν κώδικα.

Παράδειγμα

Το παρακάτω λανθασμένο και ανασφαλές πρόγραμμα σε Perl τρέχει την εντολή finger σε σύστημα Unix για το χρήστη που έχει ζητήσει κάποιος στο πεδίο USER μιας φόρμας HTML.
#!/usr/bin/perl
$query = $ENV{'QUERY_STRING'};
@pairs = split(/\&/, $query);
for (@pairs) {
        ($field, $val) = split(/=/);
        $field =~ s/\+/ /g;
        $field =~ s/\%(\w\w)/sprintf("%c", hex($1))/eg;
        $val =~ s/\+/ /g;
        $val =~ s/\%(\w\w)/sprintf("%c", hex($1))/eg;
        $field{$field} = $val;
}
$|=1;
print "Content-Type: text/plain\n\n";
system "finger $field{USER}\n";  
Αν το εκτελέσουμε με την παράμετρο USER να έχει την τιμή dds
http://www.senanet.com/cgi-bin/pe?USER=dds
θα εμφανιστεί το παρακάτω αποτέλεσμα:
Login: dds                              Name: Diomidis Spinellis
Directory: /home/dds                    Shell: /bin/bash
On since Wed Jun 30 12:18 (EET) on ttyp0
   5 minutes 49 seconds idle
Αν όμως προσθέσουμε στο τέλος του URI ένα ερωτηματικό (που διαχωρίζει τις εντολές στο φλοιό του Unix) και την εντολή cat /etc/passwd
http://www.senanet.com/cgi-bin/pe?USER=dds;cat%20/etc/passwd
θα λάβουμε και το περιεχόμενο του αρχείου passwd (περιέχει τους κωδικοποιημένους κωδικούς χρηστών σε ορισμένες εκδόσεις του Unix) στο τέλος της απάντησης:
Login: dds                              Name: Diomidis Spinellis
Directory: /home/dds                    Shell: /bin/bash
On since Wed Jun 30 12:18 (EET) on ttyp0
   5 minutes 49 seconds idle

root:XXXXXXXXXXXXX:0:0:Charlie Root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:The Devil Himself:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
...
Για να αποφεύγουμε τέτοια προβλήματα πρέπει:

Αυθεντικοποίηση του χρήστη

Η αυθεντικοποίηση του χρήστη γίνεται συχνά με τη χρήση της μεθόδου POST ή με την χρήση του κατάλληλου URI. Με τον τρόπο αυτό είναι πολύ εύκολη η επαναχρησιμοποίηση ενός συνθηματικού ή η ανακάλυψή του παρακολουθώντας πακέτα στο δίκτυο.

Παράδειγμα εντολής POST με συνθηματικό:

POST /cgi-bin/smswww HTTP/1.0
Referer: http://www.netcs.com/pages/foo/send.html
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/3.01 (Win95; I)
Host: www.netcs.com
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Content-type: application/x-www-form-urlencoded
Content-length: 143
Authorization: Basic aWV0ZopqZXRm

Προστασία προσωπικών στοιχείων

Ένας χρήστης μπορεί άθελά του να αποκαλύψει τα παρακάτω στοιχεία μέσω της πρόσβασής του στο Web: Πολλά από τα στοιχεία μπορούν να αποκαλυφθούν και από ανάλυση της κίνησης κοντά στο μηχάνημα του χρήστη. Με τεχνικές όπως Chaum mixes και Onion routing μπορούμε να αποφύγουμε ορισμένα από τα προβλήματα αυτά.

Cookies

Τα cookies χρησιμοποιούνται στο Web για να επιτρέψουν την εκτέλεση προγραμμάτων που απαιτούν τη διατήρηση κατάστασης (state) ανάμεσα στις εξ' ορισμού χωρίς κατάσταση (stateless) αυτόνομες συναλλαγές HTTP. Η διατήρηση κατάστασης είναι απαραίτητη για την υλοποίηση εφαρμογών ηλεκτρονικού εμπορίου όπου ο υπηρέτης χρειάζεται π.χ. να γνωρίζει τα είδη που έχει επιλέξει ο χρήστης να αγοράσει.

Τα cookies έχουν τη μορφή:

Name=VALUE; expires=DATE; domain=DOMAIN; path=PATH; secure
Παράδειγμα (από το αρχείο cookies.txt):
home.netscape.com	FALSE	/	FALSE	942189160	NGUserID	cfc84d23-4929-905788546-1
Προβλήματα ασφάλειας:

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

Η Java επιτρέπει τη μεταφορά εκτελέσιμου περιεχομένου και την εκτέλεσή του σε οποιαδήποτε αρχιτεκτονική και λειτουργικό σύστημα έχει υλοποιηθεί η ιδεατή μηχανή Java (Java virtual machine). Οι περισσότεροι εξυπηρετητές υποστηρίζουν την μεταφορά και εκτέλεση προγραμμάτων Java μέσα από τον ιστό με τη χρήση της ετικέτας της HTML applet. Τέτοια προγράμματα περιέχουν ανέμπιστο (untrusted) κώδικα. Για την προστασία του χρήστη και του μηχανήματος ο ανέμπιστος κώδικας ελέγχεται ως προς την ορθότητά του και εκτελείται σε ένα περιβάλλον περιορισμένων δυνατοτήτων, το σκάμμα (sandbox). Οι περιορισμοί προγραμμάτων που εκτελούνται στο σκάμμα εξαρτώνται από την πολιτική ασφάλειας που έχει οριστεί. Μια τυπική πολιτική ασφάλειας περιέχει τους παρακάτω περιορισμούς: Ο έλεγχος του κώδικα διασφαλίζει τις παρακάτω ιδιότητες: Στο JDK 1.1 υπάρχει η δυνατότητα φορτώματος μιας έμπιστης εφαρμογής από το δίκτυο αν αυτή έχει την κατάλληλη ψηφιακή υπογραφή. Τα προβλήματα ασφάλειας στην περίπτωση αυτή είναι παρόμοια με αυτά της τεχνολογίας ActiveX. Στην Java 2 υπάρχει δυνατότητα ορισμού διαφορετικής πολιτικής ασφάλειας ανάλογα με την υπογραφή μιας εφαρμογής.

Ορισμένα προβλήματα ασφάλειας που δημιουργούνται από τη χρήση της Java είναι τα εξής:

Ασφάλεια στη Javascript

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

Οι παρακάτω είναι ορισμένες επιτυχημένες επιθέσεις που έχουν γίνει με βάση της Javascript:

Ασφάλεια και ActiveX

Τρόπος προστασίας

Η τεχνολογία ActiveX είναι εγγενώς ανασφαλής. Ο καλύτερος τρόπος προστασίας είναι η απενεργοποίηση της δυνατότητας εκτέλεσης ActiveX στο φυλλομετρητή.

Βιβλιογραφία