PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : system()



klinsel
23-10-2007, 11:23
Warum ist ein simples Programm wie


int main()
{
system("ls /temp");

return 0;
}

anfällig für Angriffe?

locus vivendi
23-10-2007, 12:08
Es ist nicht korrekt das ein Programm welches system benutzt von vorneherein anfällig für Angriffe wäre. Allerdings hängt es von der konkreten C- bzw. C++-Implementierung ab, was system macht. Ohne die verwendete Implementierung zu kennen kann man system also eigentlich nicht sinnvoll (und sicher) verwenden.

Abhängig von der Implementierung kann sich ein Programm unerwartet verhalten, wenn die Eingabewerte für system nicht ausreichend überprüft werden. Und die Eingabewerte beschränken sich laut C und C++ nicht auf das Funktionsargument, sondern können z. B. auch Umgebungsvariablen sein, oder von einem anderen plattformspezifischen Mechanismus kommen.

P.S.: Damit dein Code ein "Programm" wird, fehlt noch die Einbindung eines Headers.

klinsel
23-10-2007, 13:11
Hallo,

Das mit dem Headerfile ist klar. Sollte nur ein Beispiel sein.

Nehmen wir an, dass mein Progrämmchen nicht länger ist als obiges Codeschnipsel. In diesem Fall ist es doch keineswegs angreifbar, oder doch?

locus vivendi
23-10-2007, 16:58
Nehmen wir an, dass mein Progrämmchen nicht länger ist als obiges Codeschnipsel. In diesem Fall ist es doch keineswegs angreifbar, oder doch?
Ich setze mal voraus das es sich um eine Posix kompatible Platform handelt. Dann lässt sich das Program nicht ohne weiteres für einen Angriff ausnutzen. Es lässt sich aber unter Umständen für einen Angriff ausnutzen, und zwar zumindest dann wenn jemand das Binary mit Suid-Rechten versieht. Denn system wertet intern den Suchpfad für Binarys aus. Wenn ein Angreifer den manipuliert kann er ein eigenes Binary namens "ls" ausführen.

Natürlich kann der Suchpfad auch verändert werden ohne das dein Binary mit Suid-Rechten ausgestattet ist. Dies würde ich allerdings nicht als eine ausgenutzte Sicherheitslücke bezeichnen.

Du kannst das ja selbst mal ausprobieren, wenn du GNU/Linux, Solaris, BSD, etc... hast. Setze PATH = . + danach alter PATH. Dann lege ein Skript namens "ls" in dem Verzeichnis in dem du dein "system"-Programm aufrufst. Lass dein "ls" z.b. mit echo eine Nachricht ausgeben. Dann starte dein Programm. Tu in dein "ls" nichts Gefährliches rein.

Falls du diese Ressource noch nicht kennst:
http://www.opengroup.org/onlinepubs/009695399/

klinsel
24-10-2007, 09:14
Achja, vielen Danke. Also immer absolute Pfade verwenden!

klinsel
24-10-2007, 19:54
Wobei absolute Pfade wohl auch nicht unangreifbar sind:
Wenn man mit


export IFS="/"

den Separator auf "/" stellt, dann interpretiert die shell z.B. "/bin/ls" als "bin ls", würde also "bin" lokal suchen.

Die Frage ist jetzt, ob


system("export IFS=' \t\n'; /bin/ls");

unantastbar ist (vorausgesetzt man filtert spezielle Zeichen wie ";" und "|" aus der Usereingabe).

panzi
25-10-2007, 00:21
Aber das alles ist eher mehr theoretischer Natur. Die wirklich schlimmern Sicherheitslücken sind andere. Und zwar Pufferüberläufe, Integerüberläufe, nicht geprüfte Eingabewerte (z.B. SQL-injections) und event. printf exploits.

klinsel
25-10-2007, 08:01
Das heißt, dass obiges Beispiel immer noch angreifbar ist?:(

panzi
25-10-2007, 15:28
Das heißt, dass obiges Beispiel immer noch angreifbar ist?:(

Was verstehst du unter agreifbar? Ein remote exploit ist definitiv nicht drinn. I.d.R. ist auch kein root-Rechte-erlangen-exploit möglich, wenn das Programm das suid bit nicht gesetzt hat. Hat es denn das bit gesetzt? Was für Angriffszenarien da sind hängt auch davon ab was das Programm machen soll. Wozu ist es denn da?

klinsel
25-10-2007, 18:18
JA, es wird SUID gesetzt, aber zum Glück sind keine root-Rechte notwendig.

Ich habe da herumprobiert, finde aber keine Möglichkeit das Progrämmchen zu knacken und unter der ID des Besitzers etwas auszuführen.