Symlink-Angriffe: Wenn A -> B folgt B == A?
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
...
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.
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.
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