DFUZZER(1)

πŸ“¦
version 2.6 Β· 2 versions
, in epel 10, epel 9, fedora 43, fedora 44

πŸ¦‹ DFUZZER β€” the D-Bus fuzzer, bestie edition πŸ’…

okay so this is the manual for dfuzzer (that's the tool name, it's a command, it lives in section 1 of the manual, iykyk). It's a D-Bus fuzzer and it is genuinely so much fun. Let's get into it.


✨ SYNOPSIS ✨

dfuzzer {--bus=BUS_NAME} [OPTIONS...]

🌸 DESCRIPTION 🌸

dfuzzer is the D-Bus fuzzer β€” it's the tool for fuzz testing processes that talk to each other through D-Bus. It works on processes connected to both the session bus and the system bus daemon, so no matter which vibe your service is on, you're covered. πŸ’–

The fuzzer works as a client: first it connects to the bus daemon, then it traverses and fuzz tests all the methods a D-Bus service provides. Which service? The one you name with the -n/--bus-name= option, obviously. 🫢

By default it only prints failures and warnings (very demure, very mindful). Want the whole story? Use -v/--verbose for verbose mode. ✨

So the fuzz tests happen on methods of a chosen interface(s) and object(s) for the given bus name. The fuzzer generates random arguments for each method of an interface and calls those methods every single time with different generated arguments. It's giving chaos, but make it productive. πŸŽ€

dfuzzer is also monitoring the tested process state the entire time it's fuzzing. If the tested process crashes, that gets printed on dfuzzer's output. And the fuzzer always prints the exit status (see the "Exit status" section below) before it exits. No sneaky exits here. πŸ‘‘

ngl, if you're getting exceptions like org.freedesktop.DBus.Error.AccessDenied or org.freedesktop.DBus.Error.AuthFailed during testing (these only print in verbose mode, so with the -v/--verbose option), try running dfuzzer as root. ⚠️ warning: this is dangerous, proceed with caution. fr fr, be careful.

πŸŽ€ OPTIONS πŸŽ€

Here's everything it understands, bestie:

  • -b NAME, --bus-name=NAME β€” the D-Bus name you want to test. πŸ¦‹
  • -o PATH, --object=PATH β€” the D-Bus object path you want to test. All children objects get traversed too, so it goes deep. 🌈
  • -i NAME, --interface=NAME β€” the D-Bus interface name to test. Heads up: this one needs -o/--object= to be set as well. πŸ‘€
  • -t NAME, --method=NAME β€” if you give this, only the method named NAME gets tested. Requires -o/--object= and -i/--interface= to be set as well. Implies --skip-properties. πŸ’…
  • -p NAME, --property=NAME β€” if you give this, only the property named NAME gets tested. Requires -o/--object= and -i/--interface= to be set as well. Implies --skip-methods. ✨
  • --skip-methods β€” skip method testing entirely, test only properties. πŸ“
  • --skip-properties β€” skip property testing entirely, test only methods. 🧚
  • -e COMMAND, --command=COMMAND β€” a command to execute after each method call. If the given command finishes unsuccessfully, a fail message is printed along with its return value. πŸ’€
  • --show-command-output β€” don't suppress stdout/stderr of a COMMAND specified via --command=. Let it yap. πŸ“’
  • -f FILENAME, --dictionary=FILENAME β€” name of a file with a custom dictionary, which is used as input for fuzzed methods before generating random data. Currently supports only strings (one per line). 🌸
  • -x ITERATIONS, --max-iterations=ITERATIONS β€” set the upper limit for the number of iterations done for each method. This limit only kicks in if the automatically calculated number of iterations would exceed it. At least 1 iteration is required, periodt.
  • -y ITERATIONS, --min-iterations=ITERATIONS β€” same as -x/--max-iterations= but for the lower limit. Again, the limit only comes into effect if the automatically calculated number of iterations would fall below ITERATIONS. 🫢
  • -I ITERATIONS, --iterations=ITERATIONS β€” sets both -y/--min-iterations= and -x/--max-iterations= to ITERATIONS, which effectively sets the number of iterations for each method to ITERATIONS. One option, both jobs. iconic. πŸ‘‘
  • -L DIRNAME, --log-dir=DIRNAME β€” if set, dfuzzer writes a machine-readable CSV log into DIRNAME/BUSNAME. The directory must exist. πŸ—‚οΈ
  • -b SIZE, --buffer-limit=DIRNAME β€” maximum buffer size for generated strings, in bytes. Defaults to 50000. Minimal accepted value is 256. 🧡
  • -l, --list β€” list all available services on both the system and the session buses. window shopping, basically. πŸ›οΈ
  • -s, --no-suppressions β€” do not load suppression file(s). Default behavior is to locate and load suppression files in standard locations, in this order:
    1. ./dfuzzer.conf
    2. ~/.dfuzzer.conf
    3. /etc/dfuzzer.conf

For info about the format of the suppression file, see the "Suppression file format" section. πŸ“„

  • -v, --verbose β€” enable verbose logging. πŸ—£οΈ
  • -d, --debug β€” enable debug logging. Implies -v/--verbose. This option should not normally be used during testing. 🚧
  • -V, --version β€” print dfuzzer version and exit. ⭐
  • -h, --help β€” print a short help text and exit. πŸ™ˆ

πŸ’€ EXIT STATUS πŸ’€

dfuzzer may return these codes:

  • 0 β€” testing ended successfully πŸŽ‰
  • 1 β€” an error occured (either an internall error, or a D-Bus related error) 😭
  • 2 β€” testing detected failures (including warnings) πŸ”₯
  • 3 β€” testing detected only warnings ⚠️

🌷 SUPPRESSION FILE FORMAT 🌷

The suppression file is divided into sections, one for each service. Each section contains a path to the suppressed method and an optional description β€” and that description gets printed to the output when such a method is suppressed. cute, right?

[org.foo.bar]
hello   potentially destructive
world   also destructive

In this example, methods hello and world will be suppressed on the org.foo.bar bus, no matter under which object/interface they appear. πŸ¦‹

For more granular suppression, the method name can be given in the format

object_path:interface_name:method

where each part can be omited (omitted parts behave like a wildcard, i.e. they match any object/interface/method). For example:

[org.foo.baz]
hello                   suppress the method 'hello' on any interface
::hello                 ditto, since object and interface are empty
:hello                  ditto

/org::world             suppress the method 'world' on any interface under the object '/org'
/org:boo:world          suppress the methdo 'world' on interface 'boo' and under object '/org'
:org.freedesktop.Foo:   suppress all methods on interface 'org.freedesktop.Foo' under any object
/org::                  suppress all methods on any interface under object '/org'

✨ EXAMPLES ✨

List all services on system/session bus:

dfuzzer -l

Test all methods of GNOME Shell. Be verbose:

dfuzzer -v -n org.gnome.Shell

Test only a specific method on given bus name, object path, and interface:

dfuzzer -n org.freedesktop.Avahi -o / -i org.freedesktop.Avahi.Server -t GetAlternativeServiceName

Test all methods of Avahi and be verbose. Redirect all log messages including failures and warnings into avahi.log:

dfuzzer -v -n org.freedesktop.Avahi |& tee avahi.log

Test name org.freedesktop.Avahi, be verbose, and do not use suppression file:

dfuzzer -v -s -n org.freedesktop.Avahi

πŸ‘‘ AUTHOR πŸ‘‘

Matus Marhefka (mmarhefk@redhat.com)


πŸ› BUGS πŸ›

Please report all bugs to the upstream tracker at https://github.com/dbus-fuzzer/dfuzzer. πŸ’Œ


🌈 SEE ALSO 🌈

gdbus(1)


πŸ“ NOTES πŸ“

  1. https://github.com/dbus-fuzzer/dfuzzer

and that's the whole page, bestie πŸ’– this dfuzzer manual page came to you courtesy of the dfuzzer source, version dated 01/21/2026, and yeah, it's DFUZZER(1) β€” the same name up top and down here, symmetry slay βœ¨πŸ¦‹πŸ’…

πŸ“¦ where this page comes from