使用 dbus-send 来处理 127.0.0.1 的自定义方法

Posted

技术标签:

【中文标题】使用 dbus-send 来处理 127.0.0.1 的自定义方法【英文标题】:Using dbus-send to address 127.0.0.1 for a custom method 【发布时间】:2014-12-01 08:37:57 【问题描述】:

我正在尝试让dbus-send --address 在地址 127.0.0.1 端口 10010 上使用我为自己编写的自定义方法 (com.example.Test.TestMethod)。它本身并不是一件有用的事情,但我正在尝试完成更多的事情,这是一个测试步骤。


首先,我已经说服自己我的测试方法可以正常工作。我的方法在本地使用系统总线成功:

$ dbus-send --system --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo
method return sender=:1.0 -> dest=:1.17 reply_serial=2
   string "returning foo"

其次,使用--address 失败(我不明白为什么会失败):

$ dbus-send --address=tcp:host=127.0.0.1,port=10010 --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo
Error org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

dbus-monitor 完全没有显示:

$ DBUS_VERBOSE=1 dbus-monitor --system
(nothing)

第三,在org.freedesktop.DBus.Hello 上使用--address 成功。我不知道为什么会成功,而我的方法却失败了:

$ dbus-send --address=tcp:host=127.0.0.1,port=10010 --print-reply --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.Hello
method return sender=org.freedesktop.DBus -> dest=:1.15 reply_serial=1
   string ":1.15"

我对配置文件/etc/dbus-1/system.conf做了一些修改:

  <auth>ANONYMOUS</auth>
  <allow_anonymous/>

<listen>tcp:host=127.0.0.1,port=10010</listen>

    <allow send_destination="com.example.Test"/>
    <allow own="com.example.Test"/>

为了调试,我在dbus-send 上使用了DBUS_VERBOSE=1,但我在输出中看不到任何用处。失败案例和成功案例的输出差别很小:

成功案例(org.freedesktop.DBus.Hello):

[dbus/dbus-transport-socket.c(879):do_reading]  read 89 bytes
[dbus/dbus-marshal-header.c(745):_dbus_header_have_message_untrusted] have 89 bytes, need body 9 + header 80 = 89
[dbus/dbus-marshal-validate.c(723):_dbus_validate_body_with_reason] validating body from pos 0 len 89 sig 'yyyyuua(yv)'

失败案例 (com.example.Test.TestMethod):

[dbus/dbus-transport-socket.c(873):do_reading] Disconnected from remote app
[dbus/dbus-transport.c(502):_dbus_transport_disconnect] start
[dbus/dbus-transport-socket.c(1017):socket_disconnect] 
[dbus/dbus-transport-socket.c(76):free_watches] start
[dbus/dbus-watch.c(628):dbus_watch_set_data] Setting watch fd -1 data to data = (nil) function = (nil) from data = (nil) function = (nil)
[dbus/dbus-watch.c(628):dbus_watch_set_data] Setting watch fd -1 data to data = (nil) function = (nil) from data = (nil) function = (nil)
[dbus/dbus-transport-socket.c(98):free_watches] end
[dbus/dbus-transport.c(513):_dbus_transport_disconnect] end

我还用DBUS_VERBOSE=1 启动了调试模式dbus-daemon,但我在任何地方都找不到输出。它不在系统日志中。我可能没有调试版本,但我发现这不太可能,因为 dbus-senddbus-monitor 显然是调试版本。


我在会话总线上尝试了相同的实验,结果相同。


版本信息:

$ dbus-daemon --version
D-Bus Message Bus Daemon 1.6.8

$ cat /etc/debian_version
7.6

我的最终目标是使用 D-bus 在计算机之间传递消息。让dbus-send --address 为当地案件工作只是我迈出的第一步。


2014 年 10 月 16 日更新:我能够让它工作。解决方案是违反直觉的。

有两个要求。

您必须使用 SYSTEM 总线进行通信。 您必须设置 SESSION 总线地址环境变量。

$ DBUS_SESSION_BUS_ADDRESS=tcp:host=192.168.56.101,port=10010 dbus-send --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo

【问题讨论】:

【参考方案1】:

我认为这是因为 dbus 守护进程要求 local secret 而您的客户不知道如何阅读它。你可以尝试用wireshirk转储整个握手吗? (或者,您可以使用我的dbus-dissect 脚本,但可能需要对源代码进行一些调整)

【讨论】:

以上是关于使用 dbus-send 来处理 127.0.0.1 的自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 dbus-send 设置/获取属性

CVE-2021-3560 Polkit权限提升漏洞复现

CVE-2021-3560 Polkit权限提升漏洞复现

CVE-2021-3560 Polkit权限提升漏洞复现

使用 dbus-send 关闭 Linux

python 使用ipy 模块处理出现错误 ValueError: IP('127.0.0.1/30') has invalid prefix length (30)