Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel A Sicherheit unter Linux
  gp A.1 Viren und Trojaner
  gp A.2 Der Superuser (su)
  gp A.3 Überlaufen von Logfiles
  gp A.4 Zugriffsrechte auf Dateien
  gp A.5 Das SUID-Bit
  gp A.6 Programme ohne Ausführrechte
  gp A.7 Buffer Overflow (Pufferüberlauf)
  gp A.8 Race Condition
  gp A.9 Temporäre Dateien
  gp A.10 chroot
  gp A.11 Umgebungsvariablen
  gp A.12 Zugriffsrechte – häufig gemachte Fehler
  gp A.13 system() und popen()
  gp A.14 Offene Filedeskriptoren
  gp A.15 Core Dump
  gp A.16 SQL Injection
  gp A.17 Filedeskriptor-Überlauf mit select()


Rheinwerk Computing

A.11 Umgebungsvariablen  toptop

Für jede Anwendung stehen gewisse Umgebungsvariablen zur Verfügung, die das Verhalten der Anwendung beeinflussen können. Da diese Umgebung allerdings von jedem lokalen Benutzer nach Belieben verändert werden kann, sollten Sie als Programmierer einer Anwendung zuerst immer die komplette Umgebung löschen und eine neue sicherere Umgebung aufbauen. Da die Umgebungsvariablen zum Teil auch von System zu System variieren, ist deren Verwendung als Informationsquelle sowieso weniger portabel.

Ein Beispiel wäre die Umgebungsvariable PATH, welche eine Liste von Verzeichnisnamen enthält, die bei der Angabe in einer Anwendung nach dem richtigen Pfad sucht. Die Funktionen execvp(), execlp(), system() und popen() nutzen diese Variable, wenn Sie hiermit eine Anwendung aufrufen. Daher sollte man aus Sicherheitsgründen immer den kompletten Pfad mit diesen Funktionen verwenden, sofern man diese Funktionen, besonders popen() und system(), unbedingt verwenden muss. Sind hierbei böse Absichten vorhanden, muss ein Benutzer nur die PATH-Variablen verändern, um eine andere Anwendung mit demselben Namen zur Ausführung zu bringen.

Weitere kritische Umgebungsvariablen wären LD_PRELOAD oder LD_LIBRARY_PATH. Lenkt hierbei ein Angreifer den Pfad zu einer eigenen entsprechenden und mit bösen Absichten präparierten Standard C Bibliothek um, so kann hiermit das Verhalten diverser Funktionen verändert werden. LD_LIBRARY_PATH und LD_PRELOAD treten nicht bei SUID-Programmen in Kraft.

Natürlich gibt es noch weitere Umgebungsvariablen, welche bei böswilligen Absichten entsprechend manipuliert werden können. Diese beiden Beispiele alleine demonstrieren aber schon, dass die Verwendung dieser Variablen in Anwendungen möglichst ausgeschlossen werden sollte.

Ein einfaches Beispiel, wo z. B. die Umgebungsvariable HOME manipuliert wurde:

$ cp init.txt $HOME
 reguläre Datei /home/jack/init.txt kann nicht angelegt werden:
 Keine Berechtigung
$ echo $HOME
/home/jack
$ whoami
tot

Hier sollte eigentlich /home/tot in der Umgebungsvariablen HOME stehen. Irgendwie wurde allerdings dieser Wert manipuliert oder vielleicht vom Elternprozess verändert und eben weitervererbt. In diesem Fall hat es nur eine Fehlermeldung zur Folge. Aber ein Beweis, nicht immer zu Glauben, dass schon alles stimmen wird, was in der Umgebungsvariablen steht. Im Falle der HOME-Variablen ist dies allerdings kein Problem, den richtigen Pfad zum Heimat-Verzeichnis des aktuellen Users zu ermitteln. Hierauf wurde bereits mit der Funktion getpwuid() eingegangen. Zuerst ermittelt man mit getuid() die eigene User-ID und übergibt diese anschließen an die Funktion getpwuid(), welche die Passwortdatei /etc/passwd einliest und falls ein entsprechender User vorhanden ist, entsprechenden Pfad zurückgibt. Hier das Beispiel:

/* myhome.c */
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd. h.>
#include <stdlib.h>
#include <pwd. h.>
    
int main(int argc, char **argv) { 
  uid_t         uid; 
  struct passwd *pwd; 
    
  uid = getuid( ); 
  printf("UID des Users ist:  %d.\n", (int)uid); 
  if (!(pwd = getpwuid(uid))) {
    printf("Kann nicht aus der Passwort-Datei lesen ...\n"); 
    endpwent( ); 
    exit(EXIT_FAILURE); 
  } 
  printf("Heimverzeichnis nach Passwort-Datei ist: %s\n",
    pwd->pw_dir); 
  printf("Heimverzeichnis nach getenv(\"HOME\") ist: %s\n",
    getenv("HOME"));
  if(strcmp( pwd->pw_dir, getenv("HOME")) != 0 ) {
     printf("Umgebungsvariablen \"HOME\" wurde manipuliert\n");
     exit(EXIT_FAILURE);
  }
  endpwent();
  return EXIT_SUCCESS; 
}

Das Programm bei der Ausführung:

$ gcc -o myhome myhome.c
$ ./myhome
UID des Users ist:  1000.
Heimverzeichnis nach Passwort-Datei ist: /home/tot
Heimverzeichnis nach getenv("HOME") ist: /home/jack
Umgebungsvariablen "HOME" wurde manipuliert

Am Anfang habe ich Sie darauf hingewiesen, wenn Sie auf Nummer sicher gehen wollen, immer die komplette Umgebung zu löschen und ggf. die benötigten Umgebungsvariablen (neu) zu setzen. Allerdings ist dies nicht ganz unproblematisch. Sofern Sie das komplette Environment löschen sollten Sie auf zwei Variablen ein besonderes Augenmerk legen. Dies wäre IFS UND PATH.

Für denjenigen, der sich noch nicht mit der Shell auseinander gesetzt hat ist IFS ein wenig seltsam. Allerdings verwenden die Shells diese Variablen zum Trennen der Kommandozeilenargumente. Gewöhnlich ist diese Variable mit einem Leerzeichen, Tabulator-Zeichen und einem Newline-Zeichen gesetzt. Daher sei empfohlen, entweder diese Variable gar nicht zu löschen oder eben wieder mit den entsprechenden Werten zu setzen (" \t\n"), da man hiermit die komplette Shell in einen unbrauchbaren Zustand setzen kann.

Auch wenn PATH ein beliebtes Angriffziel ist, so ist das neu setzen dieser Variable doch Recht mühsam. Dann kommen noch die unterschiedlichen Systeme und Plattformen hinzu. Nur weil auf Ihrem System bspw. folgende PATH-Angabe gesetzt ist

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

bedeutet dies nicht, dass auf einer anderen Plattform derselbe Zustand vorzufinden ist. Der sichere Weg ist es, die PATH-Variable mit der Variablen _PATH_STDPATH zu setzen. Diese Variable ist in der Headerdatei <paths.h> definiert. Diesen Wert verwenden auch die Shells beim Initialisieren dieser Variablen. Die Definition von _PATH_STDPATH variiert von Plattform zu Platzform und so verwendet man gewöhnlich immer den richtigen Wert und auch den richtigen Standard-Pfad für das System wo das Programm ausgeführt wird.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern