Symlink-Angriffe: Wenn A -> B folgt B == A?

avatar

window941625_1920.jpg
Um Daten über die Programmlaufzeit hinaus zu behalten, werden diese oft in Dateien gespeichert. Doch was sind überhaupt Dateien und wie interagiert ein Programm mit einer solchen?


Dateien - oder File Descriptors?

The UNIX philosophy is often quoted as "everything is a file", but that
really means "everything is a stream of bytes". [Linus Torvalds, fa.linux.kernel mailing list]

Wenn von Dateien gesprochen wird, muss grundsätzlich zwischen den Dateien selbst (Abstraktion von Nullen und Einsen auf einer Festplatte) und File Descriptors unterschieden werden.
Wenn ein Programm auf eine Datei zugreifen möchte (sei es lesend oder schreibend), muss dieses einen "Handler" oder "Zeiger" auf die Datei anfordern. An diesen "Zeiger" können nun Daten gesendet, oder von diesem gelesen werden. Solch ein "Zeiger" auf eine offene Datei wird unter Linux als File Descriptor bezeichnet und dem Prozess vom Betriebssystem (dem Linux Kernel) übergeben.

Symlinks

Ein Symlink ist eine Datei, die auf eine andere Datei zeigt (eine Verknüpfung). In der Regel kann jeder Nutzer des Systems kann einen Symlink auf eine andere Datei erstellen.


(Ein einfacher) Symlink-Angriff

Hierfür habe ich einen kleines Beispiel-Programm erstellt. Dieses schreibt zum Start und Ende in eine Log-Datei. Weiterhin wird Nutzer-Input gelesen und ebenfalls in die Log-Datei geschrieben.

#include <iostream>
#include <fstream>
#include <string>

int main(){
    // Opening procedure
    std::ofstream file;
    file.open("logfile.txt");

    // Initialize logic
    file << "Daemon initialized\n";
    std::string input;
    for (int i = 0; i < 10; i++){
        std::cout << "Write something: ";
        std::getline(std::cin, input);
        file << input;
    }

    // Closing procedure 
    file << "Daemon stopped. Have a nice day!\n";
    file.close();
    return 0;
}

Das Programm wird nun übersetzt und ein erster Testlauf gestartet:

g++ -Wall -o daemon daemon.cpp
./daemon
Write something: Lorem ipsum
...

RegularExec.png

Wenn wir nun die Datei logfile.txt betrachten, so steht (wenig überraschend) unter anderem unser Text in der Datei.

Nun erstellen wir (in unserem Fall bevor logfile.txt und der File Descriptor darauf existiert, allerdings gibt es auch andere, prominentere Symlink-Angriffe auf Basis von Race Conditions) einen Symlink namens logfile.txt, der auf die Datei passwd zeigt:

rm logfile.txt
touch passwd
ln -s passwd logfile.txt

Wenn daemon nun nach logfile.txt schreibt, schreibt er stattdessen nach passwd. Sollte daemon nun mit höheren Privilegien (z.B. als root-Nutzer) laufen, könnten wir beliebige Zeichenfolgen auch in Konfigurations- und Systemdateien (auf die root hier ja Zugriff hat) schreiben.

SymlinkExec.png


Schutzmaßnahmen

Auf einigen Distributionen (hier Ubuntu) folgen Prozesse keinen Symlinks in offene Ordner wie /tmp, falls diese von einem anderen (weniger privilegierten) User erstellt wurden.



1 comments
avatar

He said, 'Stop doing wrong things and turn back to God! The kingdom of heaven is almost here.'(Matthew 3:2)

Bro. Eli Challenges Atheism Belief, There is No God

Watch the Video below to know the Answer...
(Sorry for sending this comment. We are not looking for our self profit, our intentions is to preach the words of God in any means possible.)


Comment what you understand of our Youtube Video to receive our full votes. We have 30,000 #SteemPower. It's our little way to Thank you, our beloved friend.
Check our Discord Chat
Join our Official Community: https://steemit.com/created/hive-182074

0
0
0.000