Musterlösung 13 - auf Matthias

Transcription

Musterlösung 13 - auf Matthias
TI III:
Operating and Communication Systems
WS 2008/09
Übungsblatt Nr. 13
Georg Wittenburg, M.Sc., AG Technische Informatik, Freie Universität Berlin
1. Aufgabe: Begriffe (5 Punkte)
Beschreiben Sie jeden der folgenden Begriffe durch maximal zwei Sätze:
QoS,
• Die Dienstgüte (engl.: Quality of Service) ist die Menge der Anforderungen an das gemeinsame Verhalten von
Komponenten. Häufig werden dabei Parameter wie Latenzzeit, Jitter, Durchsatz oder Paketverlustrate als Einflussgrößen auf die Dienstgüte erfasst.
Port,
• Der Port ist ein Kommunikationsendpunkt, über den in einem Netzwerk Dienste angeboten bzw. in Anspruch
genommen werden können.
Flow Control,
• Die Flusskontrolle ist eine Teilaufgabe der Schicht 2 im OSI Schichtmodell. Hierbei wird dem Empfänger gestattet, dynamisch auf die Übertragungsgeschwindigkeit Einfluss zu nehmen.
Datagram,
• Ist ein verbindungsloser und statusfreier Übertragungsdienst in der Transportschicht. Die Datenpakete, die versendet werden sollen, erhalten einen speziellen Kopf, in dem Empfänger und Sender adressiert werden. Eine
Garantie, dass das Paket ankommt, gibt es nicht.
TCP Socket.
• Der englische Begriff „socket“ steht für die Abstraktion des Zugriffes auf ein Netzwerk als Programmierschnittstelle. Sobald eine Verbindung zu einem Dienst aufgebaut wurde, ist es aus Anwendungssicht nicht erkennbar,
wo der genutzte Dienst tatsächlich läuft. TCP spezifiziert das genutzte Protokoll.
2. Aufgabe: Linuxkernel patchen (20 Punkte)
Verwenden Sie den CPU-Emulator QEMU (http://bellard.org/qemu/download.html), um das auf der Homepage der
Veranstaltung verlinkte, in einer Zipdatei hinterlegte Festplatten-Image (ca. 400 MB) zu starten.
Um das Festplatten-Image zu starten, verwenden Sie den Befehl
qemu –hda DebianEtch20090119.qcom.img
(Wenn Sie eine „qemu: could not load PC BIOS“-Nachricht bekommen, verwenden Sie die zusätzliche Option „-L .“)
Melden Sie Sich im emulierten System mit dem Benutzernamen „tiiii“ und dem Passwort „fuberlin“ an.
1. Im Heimatverzeichnis befindet sich der Sourcecode für einen Exploit. Kompilieren Sie diesen und führen Sie
ihn aus. Welchen Effekt hat der Exploit? (2 Punkte)
•
Nach der Ausführung des compilierten Codes der Quellcodedatei vmsplice-exploit.c wird statt dem
angemeldeten Benutzer tiiii der Benutzer root in der Kommandozeile angezeigt. Der aktuell angemeldete Benutzer verfügt nun offenbar über root-Rechte
2. Erklären Sie durch Internet-Recherche oder Codeanalyse die Funktionsweise des Exploits. (4 Punkte)
• Zitat des Artikels http://www.heise.de/newsticker/Root-Exploit-fuer-Linux-Kernel--/meldung/103279
i. Für eine Sicherheitslücke im Linux-Kernel kursieren zwei Root-Exploits, mit denen Anwender mit eingeschränkten Rechten an höhere Rechte gelangen können. Insbesondere Systeme, auf denen mehrere Benutzer parallel arbeiten dürfen, laufen Gefahr,
dass ein Angreifer die Lücke nutzt, um ein System zu manipulieren oder unter seine
Kontrolle zu bekommen. Einer der Exploits öffnete im Test der heise-SecurityRedaktion auf einem Ubuntu-System eine Shell mit Root-Rechten.
ii. Die Lücke beruht auf Fehlern im Umgang mit Pointern von Nutzerprogrammen in Zusammenhang mit der erst in Kernel 2.6.17 eingeführten Funktion vmsplice. Durch die
fehlende Prüfung von Pointern beim Aufruf der Funktion vmsplice_to_user ist der lesende und schreibende Zugriff auf beliebige Speicherbereiche möglich. Eine detaillierte Fehlerbeschreibung der Kernelentwickler fehlt, im Changelog zum ersten Korrekturversuch in Kernel 2.6.24.1 steht nur lapidar "splice: missing user pointer access verification (CVE-2008-0009/10)". Die CVE-Einträge sind allerdings noch leer. Kurz nach
dem Update des Kernels zeigte sich aber, dass sich die Lücke trotz des Patches weiter ausnutzen lässt, weshalb die Entwickler Version 2.6.24.2 nachlegen mussten.
iii. Ganz sicher scheint man sich mit dieser Lösung aber immer noch nicht zu sein, der
Kommentar zu dem Patch deutet darauf hin, dass noch einige Tests durchzuführen
sind, um sicherzustellen, dass er wirklich funktioniert, wie er soll. Zudem gibt es unbes-
tätigte vereinzelte Hinweise, dass der Patch in Version 2.6.24.2 die alte Lücke wieder
aufreißen soll. Betreiber eines Mehrbenutzersystems sollten dennoch auf die aktuelle
Kernel-Version wechseln beziehungsweise die Pakete der Linux-Distributoren installieren, sobald sie verfügbar sind.
3. Finden Sie einen Patch und erklären Sie kurz seine Funktionsweise. (3 Punkte).
• Der erste Patch ist u.a. unter http://bugs.debian.org/cgibin/bugreport.cgi?bug=464945 zu finden
1.
2.
3.
4.
5.
diff --git a/fs/splice.c b/fs/splice.c
index 684bca3..2d7e598 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1122,6 +1122,11 @@ static int
get_iovec_page_array(const struct iovec __user *iov,
6.
size_t len;
7.
int i;
8.
9.
+
if (!access_ok(VERIFY_READ, iov, sizeof(struct iovec))) {
10.
+
error = -EFAULT;
11.
+
break;
12.
+
}
13.
+
14.
/*
15.
* Get user address base and length for
this iovec.
16.
*/
17.
@@ -1141,6 +1146,11 @@ static int
get_iovec_page_array(const struct iovec __user *iov,
18.
if (unlikely(!base))
19.
break;
20.
21.
+
if (!access_ok(VERIFY_READ, base, len)) {
22.
+
error = -EFAULT;
23.
+
break;
24.
+
}
25.
+
26.
/*
27.
* Get this base offset and number of pages, then map
28.
* in the user pages.
•
2. Patch siehe Version 2.6.24.2 Changelog
4. Transferieren Sie den Patch in das unter Qemu ausgeführte Linux. Beschreiben Sie den Vorgang. Wenn Sie sich
für das Einbinden einer physikalischen Partition in das Qemu-Linux entscheiden, so sollten Sie unbedingt die
snapshot-Option von Qemu verwenden, damit Ihre Partition nicht beschädigt werden kann. (4 Punkte)
• Windows :
i. C:\Programme\qemu>qemu -hda c:\DebianEtch20090119.qcow.img –L . -hdb fat:H:\patch
•
ii. mount –t vfat /dev/hdb1 /mnt
macht das Verzeichnis verfügbar
Linux :
i. qemu -hda DebianEtch20090119.qcow.img –hdb /dev/sda1
macht einen USB-Stick verfügbar
ii. qemu -hda DebianEtch20090119.qcow.img –cdrom datei.iso
macht ein vorher erstelltes Image als CD-ROM Laufwerk verfügbar
iii. mount –t vfat /* /mnt
* steht für das entsprechende Laufwerk /mnt für den entsprechenden Mountpunkt
5. Als nächstes patchen Sie den Kernel, kompilieren Sie ihn und laden Sie ihn anschließend beim erneuten Hochfahren des Systems.
Loggen Sie sich dazu als Root ins System ein (Name: „root“, Kennwort: „fuberlin“) und wechseln Sie in das
Verzeichnis, das den Quellcode des Linux-Kernels enthält:
# cd /usr/src/linux-source-2.6.18
Patchen Sie nun die verbuggte Kerneldatei.
Kompilieren Sie anschließend Ihren modifizieren Kernel mittels:
# make
Installieren Sie den gepatchten Kernel im emulierten System:
#
#
#
#
#
make install
make modules_install
update-initramfs –k 2.6.18 -c
ln –s /boot/initrd.img-2.6.18 /boot/initrd.img
update-grub
Starten Sie nun das System neu:
# reboot
Achten Sie im Boot-Menu darauf, Ihren neu kompilierten Kernel auszuwählen. (5 Punkte)
Obere Abbildung zeigt die Einbindung als CD-Rom Laufwerk.
Nach dem „patchen“ wurde der Kernel neu kompiliert und das System neu gestartet.
6. Loggen Sie sich erneut als Benutzer tiiii ein und führen Sie den Exploit erneut aus. Welche Veränderung stellen
Sie fest? (2 Punkte)
• Nach Ausführung des Programmes ist immer noch der Benutzer tiiii angemeldet
• Das Programm selbst gibt eine „Bad address“ Information aus.