Neue Schwachstelle im Fedora Systemdesign?

Travis Ormandy, genau der vom Google Security Team, hat bei Red Hat und Fedora im April 2019 einen Securityreport eingebracht, daß eine Änderung zum Setzen von Bootflags, jetzt die Tendenz hat, extrem leicht dem Bootprozess zu stören.

SUID für grub2-set-bootflag

„grub2-set-bootflag“ ist ein Befehl aus der Bootloaderedition, der zwei Argumente annimmt. Aufrgund der Argumente verorte ich das mal im FastBootBereich des Systemstarts, weil es augenscheinlich um so Sachen wie schnelleres Laden, wenn Booten schon einmal erfolgreich war, geht.

Das Problem

$ ls -l `which grub2-set-bootflag`
-rwsr-xr-x. 1 root root 20272 Oct 10 00:35 /usr/sbin/grub2-set-bootflag

Wie man unschwer sehen kann, ist das ein Programm, daß man als User ausführen kann und dann Dinge als Root tut. Um genau zu sein, es schreibt eine Bootoption in die grubenv abhängig vom Argument. Ohne erst einmal ein halbes Dutzend Bugreports zu lesen, die grubenv enthält so Sachen wie „welchen Kernel soll ich booten“ und ist extrem anfälliger Bockmist.

Ja,Ja, ich hörs schon wieder, ich soll nicht so auf anderer Leute Arbeit rumhacken 🙂 Also erkläre ich das mal, dann verstummt Ihr von alleine 😉 Das ist Bockmist weil, die grubenv muß EXAKT 1024 Zeichen lang sein, um vom Bootloader verarbeitet werden zu können. Ist sie kleiner oder größer, wird sie ignoriert … und auch nie wieder beim Update der Bootconfig gefixt.

Woher ich das weiß, na von dem halben Dutzend Bugreports über die letzten Jahre, die Andere und ich zu dem Thema bei Red Hat abgesetzt haben und Ihr könnt mir glauben, die ziehen sich extrem unnötig in die Länge.

Immer mal wieder passiert es nämlich, daß grubby die grubenv selbst sabotiert. Unwissentlich passiert das, wenn jemand von Hand an der grubenv rumeditiert um z.b. einen anderen Kernel einzustellen. Macht das nicht! Nehmt Grubby dafür! Grubby: wie man wieder einen Default Kernel setzen kann

Um die exakte Dateilänge von 1024 zu erreichen, wird in die grubenv eine Reihe von abgezählten „#“ Padzeichen eingefügt. Könnt ja mal reinsehen. Wenn jetzt also jemand dort Optionen einbringt und der Grubenv-Block wird zu groß, oder zu klein, dann fällt das System auf die Defaults zurück.

Was im Zweifel bedeutet: Es bootet nicht mehr!

Welchen Grund wird es wohl gehabt haben, daß jemand einen anderen Kernel eingetragen hat? Genau 😉

Boot Loader Specification

Mit Fedora 30 wurde im Bootbereich auch Einiges geändert, so stehen die Kernels nicht mehr in der grub.conf drin, sondern finden sich jetzt in /boot/loader/entries/ als einzelne Dateien wieder und die saved_entry Variable in der grubenv referenziert nur noch einen dortigen Dateinamen.

Jetzt kommt Travis ins Spiel

Travis hat also aufmerksam die Publikationen von Fedora verfolgt und stolperte über das Problem mit dem Setuid. Damit kann nämlich jeder Benutzer, und damit Programm, diesen Grub2 Befehl ausführen. Würde das mit der grubenv stabil laufen, wäre das noch kein Problem.

Jetzt hat Travis aber einen Weg ersonnen, wie man als User die grubenv unbrauchbar machen kann, indem man z.b. das Padding zerstört ( siehe Bockmist oben ).

$ sudo egrep -bo ‚^##‘ /boot/grub2/grubenv
322:##

Zum Ermitteln wieviele ## da als Padding drin sind. Es geht aber auch pauschal mal eine 10 Byte lange Datei , kommt aufs gleiche raus.

python
Python 2.7.16 (default, Apr 30 2019, 15:54:43)
[GCC 9.0.1 20190312 (Red Hat 9.0.1-0.10)] on linux2
Type \“help\“, \“copyright\“, \“credits\“ or \“license\“ for more information.
>>> import resource
>>> import os
>>> resource.setrlimit(resource.RLIMIT_FSIZE, (323,323))
>>> os.execlp(\“grub2-set-bootflag\“, \“grub2-set-bootflag\“, \“menu_show_once\“)
Error flushing /boot/grub2/grubenv: File too large

Das Pythonbeispiel begrenzt also die Filelänge für sich und alle Subprozesse und Ihr ahnt es schon, das wirkt sich auch auf den per SUID aufgerufenen Prozess von Grub aus.

Ergebnis: Grubenv zerstört, Booteinstellungen auf Defaults zurückgesetzt und ggf. System damit unbrauchbar gemacht.

Und weil man das auch absichtlich zerstörerisch einsetzen kann, hat Travis das an Security@Redhat geschickt. Fedora und Red Hat haben es bis heute ignoriert. Heute lief der Full-Disclosure Timer aus, mal sehen ob jetzt was passiert.

Für Grubunzulänglichkeiten können Red Hat und Fedora natürlich nichts, aber man muß ja nicht noch Öl ins Feuer kippen. Vor F30 wurde es mit mit pkexec ausgeführt, was sich besser auf bestimmte Prozesse oder Benutzer einschränken läßt. Warum das geändert wurde bleibt in einer dunklen Developer-Mailingliste verborgen 😉

 

 

Firefox, die Fritz!Box & der SEC_ERROR_INADEQUATE_KEY_USAGE Fehler – Teil 2

Heute geht es um die Fortsetzung von Firefox, die Fritz!Box & der SEC_ERROR_INADEQUATE_KEY_USAGE Fehler. Kurzfassung: AVM ist ratlos, aber es gibt Hilfe.

Wie man das Zert der Box erneuert

Von AVM gibt es da leider keine Hilfe, also müssen wir selbst ran. Da ich das ganze Wochenende über mit dem Support gemailt habe, bestätigt sich mal wieder: Am besten man macht es komplett selbst 🙁

Kennt zufällig jemand einen Jail-Break für die Fritz!Box? Nein, dann bauen wir uns jetzt mal ein neues Zert:

Wie vom AVM Support zu hören war, gibt es neuerdings noch andere Domainnamen, daher wäre folgendes ratsam:

Ihr könnt entweder im Browser nachsehen, welche zusätzlichen Domainnamen das Zert enthält, oder Ihr ladet es aus der Box auf Euren PC -> „Zertifikat herunterladen“. Man erhält eine Datei namens „boxcert.cer“. Diese kann man nun mit OpenSSL aufschlüsseln lassen:

openssl x509 -text < boxcert.cer | grep -E „(CN |DNS)“

Beispiel:

Issuer: CN = fritz.box, O = PRIVAT, C = DE, ST = unkown, L = unkown
Subject: CN = fritz.box, O = PRIVAT, C = DE, ST = unkown, L = unkown
DNS:www.fritz.box, DNS:fritz.box, DNS:www.myfritz.box, DNS:myfritz.box, DNS:www.fritz.nas, DNS:fritz.nas

DISCLAIMER:

Das ist für RED HAT basierte Distributionen, bei Debian & Co sieht der Pfad zur openssl.cnf anders aus, falls Eure Distri überhaupt OpenSSL einsetzt. Ferner kann eure Box eine andere IP im LAN haben, als hier angegeben.  Bitte erst herausfinden oder einfach weglassen: (Achtung: Einzeiler!)

openssl req -x509 -nodes -sha256 -newkey rsa:4096 -keyout fritz.box.key -out fritz.box.crt -days 3650 -subj „/CN=fritz.box/O=PRIVAT/C=DE/ST=unkown/L=unkown/“ -reqexts SAN -extensions SAN -reqexts SAN -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf „\n[SAN]\nsubjectAltName=DNS:www.fritz.box,DNS:fritz.box,DNS:www.myfritz.box,DNS:myfritz.box,DNS:www.fritz.nas,DNS:fritz.nas,IP:192.178.1.1„))

Hinweis: WordPress ist der Meinung doppelte Anführungszeichen in Zitatzeichen umzuwandeln, also nicht 1:1 in die Shell kopieren, das klappt nicht.

Nun haben wir ein Zwischenergebnis mit Key und Cert, brauchen aber noch die PEM für die Box, denn nur das Cert hochladen reicht natürlich nicht 😉

cat fritz.box.key > box.pem
cat fritz.box.crt >> box.pem

Jetzt kann man die „box.pem“ Datei über die oben sichtbare Uploadfunktion in die Box laden, diese verarbeitet es kurz und dann hat man schon sein Problem mit dem doppelten Schlüssel behoben.

Da es keine „Regenerieren“ Funktion gibt, bleibt einem da leider nicht viel anderes übrig. Featurerequest wurde übermittelt 😉

Fedora wird DoH nicht in Firefox aktivieren

Guten Nachrichten von Fedora. Wie wir so eben einer relevanten Fedora Mailingliste entnehmen konnten, planen die Fedora Entwickler das DoH in Firefox nicht zu aktivieren, wenn es kommt.

DNS over HTTPS in Firefox

Das Thema hat ganz schön für Wellen gesorgt. Ohne mich zu wiederholen, ist die Essenz über DoH, daß es vom Prinzip her ok ist, aber eben durch die Zentralisierung im Firefox auf Cloudflare so nicht akzeptabel ist. Da der Bundesdatenschutz ähnliche Bedenken gezeigt hat, wie sie auch mir und Anderen gekommen sind, würde das in Europa für Mozilla vermutlich nicht besonders gut ausgehen, um nicht zu sagen, daß es ein sehr teures Experiment würde.

Ein Fedora Entwickler bekundete in der ML dann auch, daß es in der Form nicht defaultmäßig aktiviert sein wird. Zieht  man sich aber Firefox von der Mozillaseite direkt, z.b. wegen einer ESR Version, wäre das natürlich anders.

Ich für meinen Teil sage, daß jemand, der am DNS rumspielt, extrem viel Ahnung davon haben sollte, was DNS für alle bedeutet, um sinnvolle Entscheidungen zu treffen. Mozilla und Cloudflare zähle ich jetzt nicht zu dem Kreis, sonst wäre diese Entscheidung so nicht gefallen. Da ich das Thema erst heute in einem 90 Minütigen Vortrag mal von mehreren Seiten beleuchtet habe, kann ich sagen, daß so „simple“ der Dienst auch erscheinen mag, alle nachträglichen Security Erweiterungen sind daran gescheitert. DNS SEC z.b. hat zwar für Vertrauen in das Ergebnis gesorgt, ist aber auch nicht in allen Ecken und Enden der Server und Desktopanwendungen angekommen. Man mag es nicht glauben, aber das Fedora Repo kennt gerade mal eine Handvoll Pakete und die meisten davon sehen aus, als wenn es nur Teile ein und desselben Programms sind.

DNS-over-TLS, was technisch DNS-over-HTTPS sehr nahe kommen wird, ist auch so ein Krisenfall. Die Ursache dafür liegt darin, daß gute Krypto immer bedeutet, daß mehr in Aufwand, Rechenleistung,Zeit und Datengröße investiert werden muß, was es insgesamt teuer und langsam macht. Das wollte Mozilla mit dem Alleingang vermutlich vermeiden, aber dafür die Privatsphäre opfern geht ja mal gar nicht. Aber vielleicht meinten sie das ja auch ironisch, weil die Verschlüsselung sollte ja genau das verbessern, was es faktisch natürlich nicht tut 🙂

Gegen die Idee, daß auch der Inhalt von DNS gegen abhören gesichert ist, spricht außer der Rechenleistung, dem Keymanagement, der Datenblockgröße eigentlich nichts.  Allerdings habe ich so meine Zweifel, ob das in den 1 $US IoT Chips jemals sauber implementiert sein wird.

Bleibt nur zu hoffen, daß das Ziel Encrypted DNS irgendwann mal funktioniert.