Firefox

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der Security Sammlung.
Firewall Dienste absichern Verschlüsselung alphabetischer Security Index


Inhaltsverzeichnis

[Bearbeiten] Vorwort

Wer kennt sie nicht, Sicherheitslücken in Netzwerkanwendungen? Oft erlauben solche Lücken auf verschiedenen Wegen, fremden Code im Kontext des Benutzers auszuführen. Das heißt Angreifer Alice kann über eine manipulierte Webseite dem Betroffenen Bob Spionagesoftware und/oder Spyware unterschieben oder erhält einfach nur Zugriff auf Bobs Dateien. Lange Zeit war dies hauptsächlich ein Windows-spezifisches Phänomen, in Zeiten von plattformübergreifenden Frameworks und darauf basierenden Anwendungen, lassen sich viele Sicherheitslücken (leider) auch plattformübergreifend ausnutzen.

Solche Angriffe lassen sich in der Regel sehr leicht automatisieren, so dass Alice mit relativ geringem Aufwand tausende (oder noch mehr) Rechner, die anfällig für den Angriff sind, infizieren kann. Ein Hauptaugenmerk liegt dabei auf Anwendungen, die besonders verbreitet und vor allem für den Angreifer leicht erreichbar sind. Paradebeispiel für eine solche Anwendung ist der Internet-Browser, mit dem so mancher achtloser Surfer Opfer von Alice werden kann. Nicht immer ist allerdings das Opfer mit schuld, denn selbst renommierte Webseiten/Portale wurden in der Vergangenheit von Hackern missbraucht, um Besuchern Werbetrojaner unterzujubeln. Die Gefahr ist also überall vorhanden, man muss sich gar nicht in schmutzigen Winkeln des Netzes herumtreiben.

Gerade aus letzterem Grund und bedingt durch die Tatsache, dass oft schon Exploits für Sicherheitslücken im Internet die Runde machen, bevor der Autor der betroffenen Anwendung einen Patch zur Verfügung stellen kann, ist besonders beim Surfen besondere Vorsicht geboten (Stichwort: Onlinebanking). Viele Linux-Nutzer glauben, dass Linux aufgrund seines durchdachten Sicherheitskonzeptes keine so große Angriffsplattform für Malware bietet wie Windows. Das ist zwar durchaus korrekt, jedoch muss man die vielfältigen Möglichkeiten, die Linux bietet, um Sicherheitslecks zu minimieren, auch nutzen!

Im Folgenden will ich am Beispiel des Browsers Firefox erläutern, wie man unter Gentoo eine X11-Anwendung isoliert mit reduzierten Benutzerrechten laufen lassen kann.

[Bearbeiten] Voraussetzungen

Ich nehme an, der normale Benutzername ist bob und mozilla-firefox ist bereits auf dem Rechner installiert.

[Bearbeiten] Gruppen und Benutzer

Als root müssen zunächst die Gruppen drop und internet angelegt werden, deren Funktion ich später erläutern werde. Dann fügen wir den Benutzer browser hinzu, der später Firefox starten soll, legen das Heimverzeichnis für diesen Benutzer an und setzen die Rechte für die erstellten Ordner.

groupadd internet
groupadd drop

mkdir /home/drop
mkdir -m 700 /home/drop/browser
useradd browser -d /home/drop/browser -g internet
chown browser:internet /home/drop/browser

Browser sind nicht nur zum "Browsen" da, sondern auch zum Herunterladen von Dateien. Dafür richten wir einen Ordner ein, auf den sowohl bob als auch browser Zugriff haben, weil beide in der Gruppe internet sind. Später sollte man Firefox so konfigurieren, dass er die heruntergeladenen Dateien automatisch in diesem Ordner ablegt.

mkdir -m 770 /home/drop/download
chgrp internet /home/drop/download

Nun muss bob Mitglied in der Gruppe internet werden, damit er Zugriff auf den download-Ordner bekommt. Benutzer browser hingegen wird zusätzlich Mitglied in Gruppe drop (warum erkläre ich später).

gpasswd -a bob internet
gpasswd -a browser drop

WARNUNG:
Wenn von dieser Prozedur mehrere Nutzer profitieren sollen, die alle separate Firefox-Profile und Benutzeraccounts haben, muss aus Sicherheitsgründen nach dem eben beschriebenen Muster für jeden Nutzer ein eigener Benutzeraccount browser angelegt werden (z.B. browser1,browser2,browser3, etc.), sonst kann jeder Benutzer auf die Profile der anderen zugreifen!

[Bearbeiten] Gentoo-Erweiterungen für Firefox

Es gibt diverse bereits fertige Suchmaschinen für gentoo.org (z.B.: bugs.gentoo.org, packages.gentoo.org).

[Bearbeiten] Ausführung durch sudo erlauben

Jetzt muss bob noch die Möglichkeit bekommen, Firefox als Benutzer browser zu starten. Dafür bietet sich das Programm sudo an – falls noch nicht vorhanden, muss es installiert werden:

emerge -av sudo

Nun können mit visudo für bob die notwendigen Rechte gesetzt werden. Folgende Zeile einfach einfügen und abspeichern:

Datei: /etc/sudoers
bob ALL=(browser) NOPASSWD: /usr/local/sbin/droprights.sudo

Das heißt soviel wie: Benutzer bob darf den Befehl /usr/local/sbin/droprights.sudo via sudo als Benutzer browser ausführen ohne das Passwort für browser angeben zu müssen.

[Bearbeiten] Firefox als anderer Benutzer starten

[Bearbeiten] Sudo-Skript

Nun fehlt nur noch das Skript, das wir bob erlaubt haben. Leider ist es nämlich aus Sicherheitsgründen Nutzern nicht möglich, auf den X11-Server zuzugreifen, den ein anderer Nutzer gestartet hat - dies muss letzterer explizit erlauben, und genau das ermöglicht dieses Skript.

Datei: /usr/local/sbin/droprights.sudo
 #!/bin/bash
 #
 # This script runs firefox (and other applications) from the context of another user
 # via sudo (if allowed)
 #
 # License: GPL V2 or later
 #
 # params: $1 DISPLAY, $2 AUTH $3 APP $4 APP_PARAM (optional, be careful!)
 if [ $# -lt 3 ]; then
   echo "usage: $0 <display> <authority> <application>"
   echo "  i.e. droprights.sudo :0.0 2f055673dddb9f53ee2991e0c321dc66 firefox"
   exit
 fi
 
 # check if display matches pattern
 if [[ "$1" =~ ^:[0-9](\.[0-1])?$ ]]; then
   DIS="$1"
 else
   echo "Wrong DISPLAY format $1"
   exit
 fi
 
 # check if xauth parameter matches pattern
 x=($2)
 if [[ ${#x[*]} -eq 3 &&
       "${x[0]}" =~ ^[a-zA-Z0-9]+\/unix:[0-9]$ &&
       "${x[1]}" = "MIT-MAGIC-COOKIE-1" &&
       "${x[2]}" =~ ^[a-f0-9]{32}$ ]]
 then
   AUTH="${x[0]} ${x[1]} ${x[2]}"
 else
   echo "Wrong AUTH format $2"
   exit
 fi
 
 # allow only specified applications for specified user
 case "$3" in
 "firefox")
   APP="/usr/bin/firefox"
   ALLOWED_USER="browser"

   # check if its really an url (sorry, no IDN supported, cannot be matched by regex)
   if [[ -n "$4" && "$4" =~ ^((f|ht)tps?:\/\/)?([a-zA-Z0-9_-]+\.)+([a-zA-Z0-9_-])+(\/|\/[a-zA-Z0-9~#%@\&=?+\/\:;.,_-]+)*$ ]]; then
     APP="$APP $4"
   else
     echo "starting without URL"
   fi
   ;;
 #"thunderbird")
 #  APP="/usr/bin/thunderbird"
 #  ALLOWED_USER="mailclient"
 #  ;;
 *)
   echo "APP $3 not allowed for use with this script"
   exit
   ;;
 esac
 
 # check if user is allowed to run application
 unset user_ok
 for i in $ALLOWED_USER; do
   [ "$i" = "$USER" ] && user_ok="yes"
 done
 if [ "$user_ok" != "yes" ]; then
   echo "You are not allowed to run $3 as user $USER,"
   echo "check variable ALLOWED_USER for application $3 in $0"
   exit
 fi

 # check if user wants to kill application
 if [ "$4" = "SIGKILL" ]; then
   pkill -U $USER
   exit
 fi
 
 # checks completed, start
 HOME=$(grep "^$USER:" /etc/passwd|cut -d: -f 6)  # find HOME
 export DISPLAY=$DIS
 xauth -q -f $HOME/.Xauthority add $AUTH
 unset AUTH user_ok
 $APP &>/dev/null &
 


Dieses Skript muss nach /usr/local/sbin kopiert und droprights.sudo genannt werden (wenn man den Namen oder den Pfad ändern möchte, muss man die sudoers entsprechend anpassen).
Im Skript wird für jede Anwendung einzeln über die Variable ALLOWED_USER angegeben, welche Nutzer diese Anwendung starten dürfen. In unserem Beispiel darf lediglich Benutzer browser das Programm firefox starten, es können aber auch mehrere Nutzer festgelegt werden (z.B. ALLOWED_USER="browser1 browser2 browser3").
Damit andere Nutzer möglichst wenig Einblicke in das Skript bekommen, setzen wir die Rechte so, dass nur root und Benutzer der Gruppe drop Lese- und Ausführrechte haben (der Benutzer bob braucht in der Tat keinerlei Rechte für dieses Skript, da es von sudo im Namen von browser ausgeführt wird. Dass bob sudo den Auftrag gibt ist hierfür ohne Bedeutung).

chmod 750 /usr/local/sbin/droprights.sudo
chgrp drop /usr/local/sbin/droprights.sudo

bob kann Firefox jetzt mit diesem Befehl starten:

sudo -u browser droprights.sudo $DISPLAY "$(xauth list $DISPLAY)" firefox

oder wenn die Webseite de.gentoo-wiki.com/Firefox geöffnet werden soll:

sudo -u browser droprights.sudo $DISPLAY "$(xauth list $DISPLAY)" firefox de.gentoo-wiki.com/Firefox

[Bearbeiten] Abkürzungen

Um nicht jedes Mal einen derart langen Befehl eingeben zu müssen, empfiehlt sich, einen Alias in der /home/bob/.bashrc anzulegen

Datei: /home/bob/.bashrc
alias firefox='sudo -u browser /usr/local/sbin/droprights.sudo $DISPLAY "$(xauth list $DISPLAY)" firefox'


Möchte man hingegen Firefox aus anderen Anwendungen heraus nutzen, um Webadressen zu öffnen, so funktioniert die Methode mit dem Alias leider nicht. Stattdessen kann man aber ein kleines Skript verwenden, das eine ähnliche Funktion ausübt wie der Alias. Dazu erzeugt Nutzer bob in seinem Heimverzeichnis ein Unterverzeichnis namens "bin" und legt dort folgendes Skript ab:

mkdir /home/bob/bin
Datei: /home/bob/bin/dropfirefox
#!/bin/sh
# param: $1 URL

case $1 in
bank)
  WEBSITE="https://webseite-meiner-bank.de/index.shtml"
  /usr/bin/firefox "$WEBSITE"
  ;;
webmin)
  WEBSITE="http://localhost:10000"
  /usr/bin/firefox "$WEBSITE"
  ;;
cups)
  WEBSITE="http://localhost:631"
  /usr/bin/firefox "$WEBSITE"
  ;;
your_example_here)
  WEBSITE="http://www.example.test"
  /usr/bin/firefox "$WEBSITE"
  ;;
*)
  sudo -u browser droprights.sudo $DISPLAY "$(xauth list $DISPLAY)" firefox $1
  ;;
esac


Benutzt man für die Steuerung des eigenen oder eines entfernten Rechners eine Web-Schnittstelle, kann browser im schlimmsten Fall an Passwörter, in der Regel sogar an das Root-Passwort für den betroffenen Rechner gelangen, und dann ist "Polen offen"! (Das setzt natürlich voraus, dass browser bereits von Alice kompromittiert wurde, aber nur für diesen Fall machen wir die ganze Spielerei überhaupt!).
Man kann diese Schwäche vermeiden, indem man für solche administrativen Zugriffe (und das Onlinebanking) den Browser auf dem klassischen Weg, also ganz normal im Kontext von bob, startet (wie man das bisher auch gemacht hat) und nur für das normale Surfen auf die in diesem Wiki beschriebene Methode zurückgreift. Da es sich lediglich um ein paar Ausnahmen handelt, sollte das relativ einfach zu bewerkstelligen sein. Das obige Skript dropfirefox sieht Ausnahmen schon vor, es muss allerdings bei Bedarf individuell angepasst/ergänzt werden.

  • Mit ~/bin/dropfirefox cups wird die Web-Schnittstelle von [CUPS] im Kontext des Nutzers bob geladen.
  • ~/bin/drop/dropfirefox webmin lädt Firefox als Benutzer bob und öffnet die Seite http://localhost:10000 (auf der Webmin, so es denn installiert ist, standardmäßig lauscht).
  • Ein Aufruf von ~/bin/dropfirefox bank startet Firefox im Kontext des Benutzers bob und öffnet die Webseite https://webseite-meiner-bank.de/index.shtml.
  • Es lassen sich nach diesem Schema beliebig viele weitere Ausnahmen definieren.
  • Alle nicht definierten Ausnahmen werden im Kontext des Benutzers browser geladen.

Zu diesen Ausnahmen lassen sich je nach verwendetem Desktop Verknüpfungen erstellen.

WARNUNG:
Diese Auswahlkriterien finden generell nur beim Start des Browsers Anwendung. Ist der Browser erst einmal gestartet, läuft er in dem Kontext weiter, in dem er gestartet wurde. Man kann jedoch Firefox als bob und als browser gefahrlos gleichzeitig starten, das sind dann zwei unabhängig laufende Anwendungen. Ich rate allerdings dringend dazu, unterschiedliche Themes zu installieren, um beide "Versionen" auseinanderhalten zu können.

[Bearbeiten] Einbinden in andere Programme

In den Programmen, die Urls an Firefox weiterleiten sollen, muss nur noch dieses Skript angegeben werden. Der Rest läuft dann transparent ab. Die URL wird als Parameter übergeben.

Beispiel:
/home/bob/bin/dropfirefox de.gentoo-wiki.com/Firefox

In Thunderbird lässt sich Firefox nun einbinden, indem man folgende Zeilen in die prefs.js von Thunderbird einträgt (Thunderbird sollte vorher beendet werden):

Datei: /home/bob/.thunderbird/z3i23fdh98.default/prefs.js
user_pref("network.protocol-handler.app.ftp", "~/bin/dropfirefox");
user_pref("network.protocol-handler.app.http", "~/bin/dropfirefox");


[Bearbeiten] Aufgehängtes Programm

Ein Programm kann sich auch "aufhängen" bzw. einfach längere Zeit nicht mehr reagieren. In diesem Fall muss/möchte bob die Programme, die im Kontext von browser laufen, mit Gewalt beenden (und eventuell anschließend neu starten). Unter Linux darf ein Benutzer aber nur seine eigenen Anwendungen "killen". Das Sudo-Skript von oben erlaubt bob aber auch das Beenden der Anwendungen, die im Kontext von browser laufen. Dazu muss das Programm wie gewohnt gestartet werden, anstelle der (optionalen) URL übergeben wir jedoch SIGKILL. Es werden alle Prozesse, die unter der Benutzer-ID von 'browser' laufen, gewaltsam beendet.

[Bearbeiten] Für ganz Paranoide

1) Wer es gern noch sicherer hätte, der sollte als root, unmittelbar nachdem alles eingerichtet wurde, eine Sicherungskopie des Ordners /home/drop/browser anlegen.

mkdir /home/bob/mozilla-settings
cd /home/bob/mozilla-settings
tar cjvpf mozilla-base.tar.bz2 /home/drop/browser

2) Die Basiseinstellungen befinden sich nun gesichert im Homeverzeichnis von bob. Es empfiehlt sich, je nach Grad der Paranoia, die Änderungen an den Einstellungen 1x pro Woche/Monat/Jahr zu sichern (Liste der angegebenen Dateien unvollständig).

cd /home/drop/browser/.mozilla/firefox/z3i23fdh98.default/
cp -pf bookmarks.html chrome/userContent.css chrome/userChrome.css cookies.txt formhistory.dat history.dat mimeTypes.rdf prefs.js user.js XUL.mfasl /home/bob/mozilla-settings

3) Jetzt ist es wichtig, alle Prozesse, die browser gestartet hat, zu beenden. Das kann, wie im Abschnitt Aufgehängtes Programm beschrieben, sogar bob erledigen (root natürlich auch).

4) Anschließend löscht man den gesamten Ordner /home/drop/browser, stellt das Archiv mozilla-base.tar.bz2 wieder her und kopiert alle manuell gesicherten Dateien zurück. Damit auch bei den Benutzerrechten nichts schiefgeht, zur Sicherheit noch:

chown -R browser:internet /home/drop/browser/

Nun ist der Account wieder "sicher". :-)

[Bearbeiten] Nutzen

Es fällt nicht auf Anhieb jedem auf, warum das Ganze nun sicherer ist, allerdings wird nun die Anwendung vollständig im Kontext des Benutzers browser ausgeführt. Sprich: Alles, was der Benutzer browser nicht darf, darf auch eine etwaige Schadsoftware nicht, die man sich beim Surfen einfangen könnte (einfangen kann man sich die nämlich nach wie vor!). Insbesondere Dokumente von bob sind so vor dem Zugriff von browser und damit auch vor einem potenziellen Angreifer "Alice" geschützt. Im Interesse der Sicherheit sollte bob allerdings sein Heimverzeichnis nur für sich selbst les-, schreib- und ausführbar machen und so vor neugierigen Blicken anderer generell versperren.

chmod 700 /home/bob

[Bearbeiten] Bekannte Probleme

  • Sound (z.B. in Flash oder mit mplayerplug-in) funktioniert nur, wenn sich der Benutzer browser auch in der Gruppe audio befindet (gpasswd -a browser audio als root). Hier gilt das gleiche wie für jeden anderen Nutzer auch.
  • Durch einen Klick auf "mailto:"-Links ist es nicht möglich, ein E-Mail-Programm zu starten, das wieder in einem anderen Kontext als dem von browser läuft (es sei denn, man bemüht auch hierfür wieder sudo - davon ist aber strikt abzuraten). Als Workaround sollte man den Link kopieren und die E-Mail-Adresse manuell einfügen. Auf keinen Fall aber sollte man das E-Mail-Programm von browser ausführen lassen, da das Ziel der Arbeit schließlich war, den Browser weitestgehend zu isolieren.

[Bearbeiten] Verbleibende Sicherheitsrisiken

  • Wir waren gezwungen, browser Zugriff auf den X11-Server zu geben. Diesen Zugriff könnte ein Angreifer ausnutzen, um (z.B. mit unsichtbaren Fenstern) dennoch an Informationen wie Tastatureingaben von Benutzer bob zu gelangen, die dieser unter X11 macht.
  • Vorhandene Sicherheitslücken im Firefox auszunutzen, wird durch diese Maßnahmen nicht erschwert. Immer auf dem aktuellen Stand zu sein ist also unabdinglich. Der entstehende Schaden ist jedoch wesentlich geringer und lässt sich deutlich leichter beseitigen (siehe #Für ganz Paranoide).

Allerdings wäre all das ebenso möglich, wenn der Browser mit den Rechten des Nutzers bob selbst liefe. Es werden also keine zusätzlichen Schlupflöcher geschaffen. Ich möchte jedoch Nutzer dieses Howtos ausdrücklich davor warnen, sich angesichts der hier beschriebenen Maßnahmen in (falsche) Sicherheit zu wiegen, getreu dem Motto "Mir kann ja nichts passieren, schließlich läuft mein Browser mit reduzierten Rechten!".
Die Mühe lohnt sich dennoch, denn die Sicherheit wird drastisch erhöht. Das Ausnutzen der verbliebenen Sicherheitsrisiken ist alles andere als trivial.
Es gibt noch zusätzliche Möglichkeiten, die Rechte des Benutzers browser weiter einzuschränken. Grsecurity, SELinux, aber auch iptables (insbesondere das "owner"-Modul) bieten umfangreiche Möglichkeiten, das System weiter abzudichten (Liste unvollständig).

'Persönliche Werkzeuge
Andere Sprachen