Τεχνικές εκμετάλλευσης τρωτοτήτων ασφάλειας πυρήνα. census, inc IT security research, development and services

Σχετικά έγγραφα
Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Ασφαλής προγραμματισμός σε γλώσσα C

Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

Αρχιτεκτονική x86(-64) 32-bit και 64-bit λειτουργία. Αρχιτεκτονική x86(-64) Αρχιτεκτονική επεξεργαστών x86(-64) Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Intel x86 ISA. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών ΗΥ

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 6 C & Assembly

Λειτουργικά Συστήματα (ΗΥ321)

Δομημένος Προγραμματισμός

Data-Level Parallelism Linking & Loading

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

EPL475:Εργαστήριο 5, GDB

MIPS functions and procedures

Υποστήριξη διαδικασιών στο υλικό των υπολογιστών

Λειτουργικά Συστήματα (Λ/Σ)

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Δομές δεδομένων (2) Αλγόριθμοι

Συναρτήσεις-Διαδικασίες

Ε-85: Ειδικά Θέµατα Λογισµικού

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Κεντρική Μονάδα Επεξεργασίας (ΚΜΕ) Τμήματα ΚΜΕ (CPU) Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (Ι)

6. Επιστροφή ελέγχου στο σημείο εκκίνησης

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Οργάνωση Υπολογιστών (Ι)

Παράλληλη Επεξεργασία

Αρχιτεκτονική Υπολογιστών

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΟΡΓΑΝΩΣΗ Η/Υ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Αρχιτεκτονική Υπολογιστών

Λειτουργικά Συστήματα (Λ/Σ)

Ερωτήσεις θεωρίας MY. Μέρος Α. Υλικό.

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Ανάπτυξη και Σχεδίαση Λογισμικού

Αρχιτεκτονική Υπολογιστών

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 4 Real Mode Interrupts

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διαδικασίες ΙI. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 5

Ανάπτυξη rootkit σε Λειτουργικό Σύστημα Linux

Μετάφραση ενός Προγράμματος Εξαιρέσεις

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΕΙΣΑΓΩΓΗ

Ιστορική Αναδρομή Λειτουργικών Συστημάτων (ΛΣ) Εισαγωγή : ο πυρήνας (kernel) / ο φλοιός (shell) Β ΕΠΑΛ

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Διαδικασιακός Προγραμματισμός

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Κατανεμημένα Συστήματα

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Αρχιτεκτονική Υπολογιστών

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Κεφάλαιο 3.1: Λειτουργικά Συστήματα. Επιστήμη ΗΥ Κεφ. 3.1 Καραμαούνας Πολύκαρπος

Διαχείριση Κύριας Μνήμης

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Λειτουργικά Συστήματα (ΗΥ321)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαχείριση μνήμης III

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εργαστήριο 9: Αρχεία

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Λειτουργικά Συστήματα

Εικονική Μνήμη (Virtual Μemory)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Εντολές γλώσσας μηχανής

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86

Transcript:

Τεχνικές εκμετάλλευσης τρωτοτήτων ασφάλειας πυρήνα Πάτροκλος Αργυρούδης census, inc IT security research, development and services argp@censusgr University of Piraeus Software Libre Society Event #16: Computer Security Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 1 / 30

Περιεχόμενα 1 Εισαγωγή 2 Πλαίσιο 3 Εκμετάλλευση 4 Συμπεράσματα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 2 / 30

Γιατί στον πυρήνα; Παράκαμψη τεχνολογιών αποτροπής εκμετάλλευσης Non-executable stack/heap, ASLR, προστασία της διεύθυνσης επιστροφής Δυνατότητα για απόλυτα αθόρυβες επιθέσεις και κερκόπορτες Πολύ μεγαλύτερο ενδιαφέρον Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 3 / 30

Γιατί (όχι) στον πυρήνα; Δυσκολίες Ο εντοπισμός σφαλμάτων κατά την εκμετάλλευση Η δημιουργία αξιόπιστου κώδικα εκμετάλλευσης Το βασικότερο πρόβλημα αποτελεί η συνέχιση του πυρήνα μετά την εκμετάλλευση η οποία αφήνει το σύστημα σε ασταθή κατάσταση Καλή γνώση του πυρήνα του λειτουργικού συστήματος που διερευνούμε Καλή γνώση x86 Assembly Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 4 / 30

Γιατί FreeBSD; Οι υπάρχουσες προγενέστερες εργασίες αφορούν Είτε άλλα συστήματα (Windows, Linux, OpenBSD) Είτε αρκετά παλαιότερες εκδόσεις του FreeBSD (40-411) Είτε ιδιαίτερα συγκεκριμένες περιπτώσεις εκμετάλλευσης οι οποίες δεν είναι γενικά εφαρμόσιμες Θα διερευνήσουμε την τελευταία έκδοση του FreeBSD (70) σε x86 Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 5 / 30

Προγενέστερες εργασίες (1) Exploiting kernel buffer overflows FreeBSD style (2000) Αφορά τις εκδόσεις 40 εώς 411 Η τρωτότητα βρίσκεται στη κλήση συστήματος jail(2) Παρουσιάζεται κατά τη ανάγνωση της κατάστασης του jail από το procfs όταν το εν λόγω jail έχει δημιουργηθεί με υπερβολικά μεγάλο hostname Μη επαναχρησιμοποιήσιμος αυθαίρετος κώδικας (shellcode) πυρήνα Μη επαναχρησιμοποιήσιμος αλγόριθμος εκμετάλλευσης Μετά από οχτώ χρόνια οι τεχνικές είναι μη εφαρμόσιμες Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 6 / 30

Προγενέστερες εργασίες (2) Kernel level vulnerabilities, 2001 Solaris 27-28 (x86) Smashing the kernel stack for fun and profit, 2002 OpenBSD 2x-3x (x86) Κύρια συνεισφορά: τεχνική για τη συνέχιση του πυρήνα Kernel wars, 2007 Συγκεκριμένες περιπτώσεις εκμετάλλευσης τρωτοτήτων σε Windows, {Free, Net, Open}BSD (x86) Δεν δημοσιεύθηκαν λεπτομέρειες και κώδικας Attacking the core: kernel exploiting notes, 2007 Linux (x86, AMD64), Solaris (UltraSPARC) Κύρια συνεισφορά: ανάλυση τρωτοτήτων σωρού (heap) στον πυρήνα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 7 / 30

Κατηγορίες τρωτοτήτων πυρήνα Εκτέλεση αυθαίρετου κώδικα με στόχο την Κλιμάκωση προνομίων Διαφυγή από περιορισμένα περιβάλλοντα τύπου jail, chroot, κτλ Διαρροή πληροφοριών από τη μνήμη του πυρήνα Ιδιωτικά SSH κλειδιά από τη περιοχή μνήμης του sshd Περιεχόμενα ευαίσθητων αρχείων (/etc/masterpasswd) Δομή και περιεχόμενα της στοίβας ή/και του σωρού Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 8 / 30

Υπερχείλιση στοίβας Πολύ γνωστό και κατανοητό πρόβλημα, υπερχείλιση τοπικών μεταβλητών από αντιγραφή δεδομένων χωρίς έλεγχο ορίων Χαμηλές διευθύνσεις Κορυφή στοίβας local_buffer ESP local_char δείκτης π λαισίου στοίβας (SFP) EBP - 4 EBP Ροή επ έκτασης δεδομένων Ροή επ έκτασης στοίβας διεύθυνση επιστροφής arg_1 EBP + 4 arg_2 EBP + 8 Προηγούμενες συναρτήσεις, π χ main void func(int arg_1, char *arg_2) { char local_char; char local_buffer[512]; strcpy(local_buffer, arg_2); } Υψηλές διευθύνσεις Καταχωρητές Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 9 / 30

Στοίβες πυρήνα Ο ιδεατός χώρος διευθύνσεων χωρίζεται σε δύο τμήματα, ένα για τον πυρήνα και ένα για τις διεργασίες (σε x86) Κάθε διεργασία έχει τη δική της αποκλειστική στοίβα στον πυρήνα Όταν η διεργασία χρησιμοποιεί υπηρεσίες του πυρήνα (πχ int $0x80) ο ESP δείχνει στην αντίστοιχη στοίβα πυρήνα Οι στοίβες του πυρήνα έχουν σταθερό μέγεθος και δεν μεγαλώνουν δυναμικά, σε x86 το μέγεθος είναι δυο σελίδες Ο κύριος λόγος ύπαρξης τους είναι ότι πρέπει να παραμένουν πάντα στη μνήμη ώστε να μπορούν να εξυπηρετούν πιθανά σφάλματα σελίδων Κατά την υλοποίηση εφαρμογών που πρόκειται να εκτελεστούν στον πυρήνα πρέπει να αποφεύγονται μεγάλες τοπικές μεταβλητές Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 10 / 30

Υπερχείλιση στοίβας του πυρήνα Δυο διαφορετικές περιπτώσεις υπερχείλισης Τοπικής μεταβλητής με αποτέλεσμα την επικάλυψη α) της διεύθυνσης επιστροφής της συνάρτησης, ή β) του δείκτη του πλαισίου στοίβας, ή γ) κάποιου δείκτη συνάρτησης που έχει οριστεί ως τοπική μεταβλητή Της στοίβας συνολικά από διαδοχικές ένθετες συναρτήσεις Σε περίπτωση υπερχείλισης προκαλείται σφάλμα προσπέλασης και ο πυρήνας του FreeBSD ``κρεμάει'' Θα μπορούσε απλά να τερματίζεται η διεργασία (Linux) Το FreeBSD (ορθώς) τα αντιμετωπίζει ως θεμελιώδη σφάλματα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 11 / 30

Αλγόριθμος εκμετάλλευσης πυρήνα 1 Εκτροπή της ροής εκτέλεσης του πυρήνα με στόχο την εύρεση του αυθαίρετου κώδικά μας 2 Αυθαίρετος εκτελέσιμος κώδικας μηχανής πυρήνα 3 Κλιμάκωση προνομίων της τρέχουσας διεργασίας (ή του γονέα της) 4 Συνέχιση πυρήνα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 12 / 30

Εκτροπή της ροής εκτέλεσης του πυρήνα Κώδικας που εκτελείται σε πλαίσιο διεργασίας (process context) μπορεί να ανατρέξει στον ιδεατό χώρο διευθύνσεων του χρήστη Πλαίσιο διεργασίας είναι το πλαίσιο κατά το οποίο ο πυρήνας εκτελείται για λογαριασμό κάποιας διεργασίας (πχ κλήση συστήματος) Συνεπώς μπορούμε να στείλουμε τη ροή εκτέλεσης στην περιοχή μνήμης που χρησιμοποιείται ως προέλευση στην προβληματική συνάρτηση Σε αντίθεση με την εκμετάλλευση απλών εφαρμογών όπου συνήθως χρησιμοποιούμε την περιοχή μνήμης που χρησιμοποιείται ως προορισμός Κύριο πλεονέκτημα: γνωρίζουμε ακριβώς πού βρίσκεται ο στόχος μας (δεν υπάρχει ανάγκη για λύσεις τύπου ελκήθρου από nop εντολές) Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 13 / 30

Αυθαίρετος κώδικας πυρήνα Συνήθως δεν είναι απαραίτητος στη μορφή που γνωρίζουμε από την εκμετάλλευση απλών εφαρμογών Μπορούμε να κάνουμε την υλοποίηση σε C και να επιστρέψουμε στην περιοχή μνήμης όπου βρίσκεται Εμείς θα παρουσιάσουμε αυθαίρετο κώδικα εξολοκλήρου σε Assembly Η γνωστή μέθοδος όπου αντικαθιστούμε την τρέχουσα διεργασία με αυτή που παρουσιάζει το σφάλμα ασφάλειας χρησιμοποιώντας συναρτήσεις της οικογένειας execve(2) προφανώς δεν λειτουργεί Ο κώδικάς μας πρέπει να 1 Εντοπίσει τη δομή του πυρήνα της τρέχουσας διεργασίας (ή του γονέα της) 2 Τροποποιήσει τα προνόμιά της (effective και real UID) στα ανώτερα δυνατά (0) 3 Διαφυγή από jail κτλ Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 14 / 30

Εντοπισμός της δομής διεργασίας Τα προνόμια είναι αποθηκευμένα στη δομή proc http://fxrwatsonorg/fxr/source/sys/proch?v=freebsd70#l484 Η διεύθυνση της οποίας βρίσκεται στη δομή kinfo_proc http://fxrwatsonorg/fxr/source/sys/userh?v=freebsd70#l115 Εύρεση της διεύθυνσης της proc μέσω του sysctl(9) interface του πυρήνα και της δομής kinfo_proc Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 15 / 30

sysctlnametomib(3) Η καταχώρηση kernprocpid του MIB παρέχει τη δομή kinfo_proc u_long get_proc(void) { int mib[4]; size_t len; struct kinfo_proc kp; len = 4; sysctlnametomib("kernprocpid", mib, &len); mib[3] = getppid(); len = sizeof(struct kinfo_proc); if(sysctl(mib, 4, &kp, &len, NULL, 0) == -1) { perror("sysctl"); exit(1); } } return (u_long)kpki_paddr; Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 16 / 30

Κλιμάκωση προνομίων Τα προνόμια είναι αποθηκευμένα σε δομή τύπου ucred η οποία υπάρχει στη δομή proc http://fxrwatsonorg/fxr/source/sys/ucredh?v=freebsd70#l45 # η διεύθυνση της δομής proc στον ECX mov $0x12345678, %ecx # EBX = ucred mov 0x30(%ecx), %ebx # EAX = 0 xor %eax, %eax # effective user ID = cr_uid = 0 mov %eax, 0x4(%ebx) # real user ID = cr_ruid = 0 mov %eax, 0x8(%ebx) Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 17 / 30

Συνέχιση πυρήνα Το βασικότερο πρόβλημα κατά την εκμετάλλευση τρωτοτήτων του πυρήνα Η στοίβα, οι καταχωρητές και συνεπώς το σύστημα γενικότερα βρίσκονται σε ασταθή κατάσταση μετά την επικάλυψη της στοίβας για την αντικατάσταση της διεύθυνσης επιστροφής Για να αποφύγουμε κατάρρευση του συστήματος πρέπει να διορθώσουμε την κατάσταση της στοίβας και των καταχωρητών Και να επιστρέψουμε τη ροή εκτέλεσης σε κατάλληλο σημείο Δεν είναι πάντα απαραίτητο, εξαρτάται από την τρωτότητα και το σύστημα Σε Linux συνήθως μπορούμε απλά να αγνοήσουμε αυτό το βήμα αφού ο πυρήνας απλά τερματίζει τη διεργασία Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 18 / 30

Τεχνικές συνέχισης πυρήνα Εξομοίωση της διαδικασίας επιστροφής από τον πυρήνα Δεν μετατρέπεται εύκολα σε αξιόπιστο αυθαίρετο κώδικα μηχανής http://fxrwatsonorg/fxr/source/i386/i386/exceptions?v=freebsd70#l186 Αλλαγή δομών πυρήνα, εκκρεμή σήματα/κλειδώματα Μπορούμε ``απλά'' να επιστρέψουμε τη ροή της εκτέλεσης στο σημείο που θα επέστρεφε εάν δεν υπήρχε η εκμετάλλευση της τρωτότητας (και ο αυθαίρετος κώδικάς μας) Η σύμβαση κλήσης κάθε αρχιτεκτονικής ορίζει ποιοι καταχωρητές πρέπει να επαναφερθούν στις αρχικές τους τιμές (σε x86: EBX, ESI, EDI) Επίσης πρέπει να δώσουμε κάποια έγκυρη τιμή στον EBP ώστε μετά την επιστροφή του αυθαίρετου κώδικά μας να δείχνει στο προηγούμενο πλαίσιο στη στοίβα πυρήνα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 19 / 30

Επιστροφή από τον πυρήνα push %ebx push %esi push %edi # αυθαίρετος κώδικας, πχ κλιμάκωση προνομίων pop %edi pop %esi pop %ebx # αποκατάσταση %ebp xor %eax, %eax push $διεύθυνση_επιστροφής_πυρήνα ret Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 20 / 30

Αποκατάσταση EBP EBP = ESP + VAL => VAL = EBP ESP Ο EBP πρέπει να δείχνει στο προηγούμενο πλαίσιο στη στοίβα πυρήνα Καταγράφουμε την τιμή του EBP κατά τον πρόλογο της προβληματικής συνάρτησης και από αυτή αφαιρούμε την τιμή του ESP μετά την επιστροφή της προβληματικής συνάρτησης στην προηγούμενη συνάρτηση Συνεπώς για να αποκαταστήσουμε τον EBP στη σωστή τιμή του μπορούμε να προσθέσουμε την τιμή VAL που υπολογίσαμε στον ESP lea 0xVAL(%esp), %ebp Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 21 / 30

Αποφυγή στατικής διεύθυνσης επιστροφής Κατά την εκτέλεση του αυθαίρετου κώδικά μας πρέπει να υπολογίσουμε δυναμικά τις διευθύνσεις των syscall και στη συνέχεια του σημείου στη συνάρτηση syscall στο οποίο πρέπει να επιστρέψει η ροή εκτέλεσης Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 22 / 30

Εύρεση της syscall Ο στόχος μας είναι να υπολογίσουμε δυναμικά τη διεύθυνση του χειριστή διακοπών int $0x80 syscall Το Interrupt Descriptor Table (IDT) χρησιμοποιείται για την διαχείριση διακοπών από το λειτουργικό σύστημα Όταν έχουμε διακοπή τύπου int $0x80 αρχικά καλείται ο χειριστής διακοπών Xint0x80_syscall, ο οποίος στη συνέχεια καλεί τον πραγματικό χειριστή syscall Η εντολή sidt παρέχει τη διεύθυνση του IDT (idt0 στο FreeBSD) Εξαιτίας του τρόπου με τον οποίο υλοποιείται σε συστήματα εικονικοποίησης δεν λειτουργεί πάντα όπως περιμένουμε idt0 => Xint0x80_syscall => syscall Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 23 / 30

Εύρεση της διεύθυνσης επιστροφής Στόχος μας είναι να αποφύγουμε τι στατική μετατόπιση των 0x335 bytes Στο FreeBSD 70 η syscall διεκπεραιώνει κλήσεις συστήματος με την εντολή call *%edx Σε δεκαεξαδική κωδικοποίηση: ffd2 Συνεπώς εντοπίζουμε τη διεύθυνση της syscall μέσω του idt0 και στη συνέχεια από αυτή τη διεύθυνση ως σημείο εκκίνησης αναζητούμε την εντολή call *%edx Αφού την εντοπίσουμε απλά αυξάνουμε την τιμή της κατά ένα για να πάρουμε τη διεύθυνση επιστροφής του πυρήνα Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 24 / 30

Ολοκληρωμένος αλγόριθμος εκμετάλλευσης (1) 1 Εκτροπή της ροής εκτέλεσης του πυρήνα Οπουδήποτε στον ιδεατό χώρο διευθύνσεων του χρήστη Περιοχή μνήμης προέλευσης, μνήμη από mmap(2), μεταβλητές περιβάλλοντος, ορίσματα γραμμής εντολών, Εάν η τρωτότητα επιτρέπει αυθαίρετη επικάλυψη μνήμης: δείκτη συνάρτησης (ioctl), καταχώρηση του πίνακα sysent http://fxrwatsonorg/fxr/source/kern/init_sysentc?v=freebsd70#l31 2 Αυθαίρετος κώδικας πυρήνα Μπορεί να υλοποιηθεί σε C ή εξολοκλήρου σε Assembly 3 Απενεργοποίηση μέτρων ασφάλειας, αλλαγή securelevel, κτλ 4 Διαφυγή από jail, chroot, κτλ Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 25 / 30

Ολοκληρωμένος αλγόριθμος εκμετάλλευσης (2) 5 Κλιμάκωση προνομίων Εντοπισμός της δομής διεργασίας: sysctlnametomib(3) kernprocpid, mov %fs:0x0, %ecx, allproc http://fxrwatsonorg/fxr/source/sys/proch?v=freebsd70#l803 Εντοπισμός της δομής ucred και αλλαγή των effective και real user ID 6 Εγκατάσταση κερκόπορτας 7 Συνέχιση πυρήνα Δεν είναι πάντα απαραίτητο βήμα Εξομοίωση της διαδικασίας επιστροφής από τον πυρήνα Επιστροφή της ροής εκτέλεσης στο κατάλληλο σημείο, αποκατάσταση καταχωρητών Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 26 / 30

Πραγματικές τρωτότητες πυρήνα (1) } Mac OS X 104 -- bsd/netat/ddp_rtmptablec (Tobias Klein) zt_add_zone(name, length) char *name; short length; { at_nvestr_t zname; bcopy(name, &znamestr, length); znamelen = length; return (zt_add_zonename(&zname)); Linux 249 -- drivers/isdn/act2000/capic (Dawson Engler) isdn_ctrl cmd; while((skb = skb_dequeue(&card->rcvq))) { msg = skb->data; memcpy(cmdparmsetupphone, msg->msgconnect_indaddrnum, msg->msgconnect_indaddrlen - 1); Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 27 / 30

Πραγματικές τρωτότητες πυρήνα (2) Linux 2216 -- arch/i386/kernel/mtrrc (Silvio Cesare) static ssize_t mtrr_write(struct file *file, const char *buf, size_t len, loff_t *ppos) { int i, err; memset(line, 0, LINE_SIZE); if(len > LINE_SIZE) len = LINE_SIZE; if(copy_from_user(line, buf, len - 1)) return -EFAULT; Madwifi 092 -- net80211/ieee80211_wirelessc (Laurent Butti) static void giwscan_cb(void *arg, const struct ieee80211_scan_entry *se) { struct iwscanreq *req = arg; memset(&iwe, 0, sizeof(iwe)); memcpy(buf, se->se_wpa_ie, se->se_wpa_ie[1] + 2); iwecmd = IWEVGENIE; Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 28 / 30

Όχι τέλος αλλά αρχή Ανάλυση πραγματικών τρωτοτήτων Υλοποίηση προγραμμάτων εκμετάλλευσης για δημοσιευμένα προβλήματα Εύρεση τρωτοτήτων σε πυρήνες ανοικτού κώδικα Υπερχείλιση μεταβλητών στο σωρό του πυρήνα BSD -- zone allocator Linux -- buddy allocator Wargame/CTF Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 29 / 30

Παραπομπές Kirk McKusick and George Neville-Neil The design and implementation of the FreeBSD operating system Addison-Wesley, 2004 Esa Etelavuori Exploiting kernel buffer overflows FreeBSD style fbsdjailtxt, 2000 Last Stage of Delirium research group Kernel level vulnerabilities 5th Argus Hacking Challenge, 2001 Sinan "noir" Eren Smashing the kernel stack for fun and profit Phrack, Volume 0x0b, Issue 0x3c, 2002 Bitsec team Kernel wars Black Hat Europe, 2007 sgrakkyu and twiz Attacking the core: kernel exploiting notes Phrack, Volume 0x0c, Issue 0x40, 2007 Πάτροκλος Αργυρούδης (argp) Διερευνώντας το FreeBSD May, 2008 30 / 30