# TODO
# * check for possibly newly introduced buses?
-BUS_LIST=(
- org.freedesktop.home1
- org.freedesktop.hostname1
- org.freedesktop.import1
- org.freedesktop.locale1
- org.freedesktop.login1
- org.freedesktop.machine1
- org.freedesktop.portable1
- org.freedesktop.resolve1
- org.freedesktop.timedate1
+NAME_LIST=(
+ home
+ hostname
+ import
+ locale
+ login
+ machine
+ portable
+ resolve
+ timedate
)
-# systemd-oomd requires PSI
-if tail -n +1 /proc/pressure/{cpu,io,memory}; then
- BUS_LIST+=(
- org.freedesktop.oom1
- )
-fi
-
# Some services require specific conditions:
+# - systemd-oomd requires PSI
# - systemd-timesyncd can't run in a container
# - systemd-networkd can run in a container if it has CAP_NET_ADMIN capability
+if tail -n +1 /proc/pressure/{cpu,io,memory}; then
+ NAME_LIST+=( oom )
+fi
+
if ! systemd-detect-virt --container; then
- BUS_LIST+=(
- org.freedesktop.network1
- org.freedesktop.timesync1
- )
-elif busctl introspect org.freedesktop.network1 / &>/dev/null; then
- BUS_LIST+=(
- org.freedesktop.network1
- )
+ NAME_LIST+=( timesync )
+fi
+
+if ip link add dummy-fuzz type dummy; then
+ # if a dummy interface is created, then let's also setup it for resolved
+ ip link set dummy-fuzz up
+ ip address add 192.0.2.1/24 dev dummy-fuzz
+
+ # When we can create a dummy interface, we definitely have CAP_NET_ADMIN
+ NAME_LIST+=( network )
+
+ # Create unit files for another dummy interface for networkd
+ mkdir -p /run/systemd/network
+ cat >/run/systemd/network/10-dummy-fuzz2.netdev <<EOF
+[NetDev]
+Kind=dummy
+Name=dummy-fuzz2
+EOF
+ cat >/run/systemd/network/10-dummy-fuzz2.network <<EOF
+[Match]
+Name=dummy-fuzz2
+[Network]
+Address=192.0.2.2/24
+EOF
fi
# Maximum payload size generated by dfuzzer (in bytes) - default: 50K
# Next, test the system service buses, as the services may be in a spurious
# state after fuzzing the system service manager bus.
-for bus in "${BUS_LIST[@]}"; do
+for name in "${NAME_LIST[@]}"; do
+ bus="org.freedesktop.${name}1"
+ service="systemd-${name}d.service"
+
echo "Bus: $bus"
+
+ # Unmask and enable the service.
+ systemctl unmask "$service"
+ systemctl enable "$service"
+
+ # enable debugging logs
+ systemctl service-log-level "$service" debug || :
+
systemd-run --pipe --wait \
-- dfuzzer -b "$PAYLOAD_MAX" -n "$bus"
+
+ # disable debugging logs
+ systemctl service-log-level "$service" info || :
done
umount /var/lib/machines