Skip to content

Unobtanium Core - Review of dbus entries with port forwarding #54

Description

@padenmoss

I've monitored Unobtanium, Bitcoin, Primecoin, (and many other forks of Bitcoin Core), and I've found that there is an exploit. Remote attackers can access system services, such as system-tmpfiles log entries to review.

I recently synced the entire Unobtanium blockchain and opened the default port for peer access. As soon as I did I noticed access to the system in the following logs:
signal time=1777437996.557278 sender=:1.20 -> destination=(null destination) serial=42483 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2etimer; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Timer" array [ dict entry( string "NextElapseUSecRealtime" variant uint64 0 ) dict entry( string "NextElapseUSecMonotonic" variant uint64 4323021512151 ) dict entry( string "LastTriggerUSec" variant uint64 1777437996555922 ) dict entry( string "LastTriggerUSecMonotonic" variant uint64 4323081510956 ) dict entry( string "Result" variant string "success" ) ] array [ string "TimersMonotonic" string "TimersCalendar" ] signal time=1777437996.557337 sender=:1.20 -> destination=(null destination) serial=42484 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2etimer; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Unit" array [ dict entry( string "ActiveState" variant string "active" ) dict entry( string "SubState" variant string "running" ) dict entry( string "InactiveExitTimestamp" variant uint64 1773114916793756 ) dict entry( string "InactiveExitTimestampMonotonic" variant uint64 2949664 ) dict entry( string "ActiveEnterTimestamp" variant uint64 1773114916793756 ) dict entry( string "ActiveEnterTimestampMonotonic" variant uint64 2949664 ) dict entry( string "ActiveExitTimestamp" variant uint64 0 ) dict entry( string "ActiveExitTimestampMonotonic" variant uint64 0 ) dict entry( string "InactiveEnterTimestamp" variant uint64 0 ) dict entry( string "InactiveEnterTimestampMonotonic" variant uint64 0 ) dict entry( string "Job" variant struct { uint32 0 object path "/" } ) dict entry( string "ConditionResult" variant boolean true ) dict entry( string "AssertResult" variant boolean true ) dict entry( string "ConditionTimestamp" variant uint64 1773114916793727 ) dict entry( string "ConditionTimestampMonotonic" variant uint64 2949639 ) dict entry( string "AssertTimestamp" variant uint64 1773114916793731 ) dict entry( string "AssertTimestampMonotonic" variant uint64 2949640 ) ] array [ ] signal time=1777437996.557440 sender=:1.20 -> destination=(null destination) serial=42485 path=/org/freedesktop/systemd1; interface=org.freedesktop.systemd1.Manager; member=JobNew uint32 8157 object path "/org/freedesktop/systemd1/job/8157" string "systemd-tmpfiles-clean.service" signal time=1777437996.559849 sender=:1.20 -> destination=(null destination) serial=42486 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2eservice; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Service" array [ dict entry( string "MainPID" variant uint32 16973 ) dict entry( string "ControlPID" variant uint32 0 ) dict entry( string "StatusText" variant string "" ) dict entry( string "StatusErrno" variant int32 0 ) dict entry( string "Result" variant string "success" ) dict entry( string "ExecMainStartTimestamp" variant uint64 1777437996557796 ) dict entry( string "ExecMainStartTimestampMonotonic" variant uint64 4323081512829 ) dict entry( string "ExecMainExitTimestamp" variant uint64 0 ) dict entry( string "ExecMainExitTimestampMonotonic" variant uint64 0 ) dict entry( string "ExecMainPID" variant uint32 16973 ) dict entry( string "ExecMainCode" variant int32 0 ) dict entry( string "ExecMainStatus" variant int32 0 ) ] array [ string "ExecStartPre" string "ExecStart" string "ExecStartPost" string "ExecReload" string "ExecStop" string "ExecStopPost" ] signal time=1777437996.559940 sender=:1.20 -> destination=(null destination) serial=42487 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2eservice; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Unit" array [ dict entry( string "ActiveState" variant string "activating" ) dict entry( string "SubState" variant string "start" ) dict entry( string "InactiveExitTimestamp" variant uint64 1777437996557869 ) dict entry( string "InactiveExitTimestampMonotonic" variant uint64 4323081512902 ) dict entry( string "ActiveEnterTimestamp" variant uint64 0 ) dict entry( string "ActiveEnterTimestampMonotonic" variant uint64 0 ) dict entry( string "InactiveEnterTimestamp" variant uint64 1777351536569222 ) dict entry( string "InactiveEnterTimestampMonotonic" variant uint64 4236621524288 ) dict entry( string "Job" variant struct { uint32 8157 object path "/org/freedesktop/systemd1/job/8157" } ) dict entry( string "ConditionResult" variant boolean true ) dict entry( string "AssertResult" variant boolean true ) dict entry( string "ConditionTimestamp" variant uint64 1777437996557068 ) dict entry( string "ConditionTimestampMonotonic" variant uint64 4323081512100 ) dict entry( string "AssertTimestamp" variant uint64 1777437996557068 ) dict entry( string "AssertTimestampMonotonic" variant uint64 4323081512101 ) ] array [ ] signal time=1777437996.560066 sender=:1.20 -> destination=(null destination) serial=42488 path=/org/freedesktop/systemd1/job/8157; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Job" array [ dict entry( string "State" variant string "running" ) ] array [ ] signal time=1777437996.576200 sender=:1.20 -> destination=(null destination) serial=42489 path=/org/freedesktop/systemd1; interface=org.freedesktop.systemd1.Manager; member=JobRemoved uint32 8157 object path "/org/freedesktop/systemd1/job/8157" string "systemd-tmpfiles-clean.service" string "done" signal time=1777437996.576643 sender=:1.20 -> destination=(null destination) serial=42490 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2eservice; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Service" array [ dict entry( string "MainPID" variant uint32 0 ) dict entry( string "ControlPID" variant uint32 0 ) dict entry( string "StatusText" variant string "" ) dict entry( string "StatusErrno" variant int32 0 ) dict entry( string "Result" variant string "success" ) dict entry( string "ExecMainStartTimestamp" variant uint64 1777437996557796 ) dict entry( string "ExecMainStartTimestampMonotonic" variant uint64 4323081512829 ) dict entry( string "ExecMainExitTimestamp" variant uint64 1777437996575198 ) dict entry( string "ExecMainExitTimestampMonotonic" variant uint64 4323081530231 ) dict entry( string "ExecMainPID" variant uint32 16973 ) dict entry( string "ExecMainCode" variant int32 1 ) dict entry( string "ExecMainStatus" variant int32 0 ) ] array [ string "ExecStartPre" string "ExecStart" string "ExecStartPost" string "ExecReload" string "ExecStop" string "ExecStopPost" ] signal time=1777437996.576732 sender=:1.20 -> destination=(null destination) serial=42491 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2eservice; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Unit" array [ dict entry( string "ActiveState" variant string "inactive" ) dict entry( string "SubState" variant string "dead" ) dict entry( string "InactiveExitTimestamp" variant uint64 1777437996557869 ) dict entry( string "InactiveExitTimestampMonotonic" variant uint64 4323081512902 ) dict entry( string "ActiveEnterTimestamp" variant uint64 0 ) dict entry( string "ActiveEnterTimestampMonotonic" variant uint64 0 ) dict entry( string "ActiveExitTimestamp" variant uint64 0 ) dict entry( string "ActiveExitTimestampMonotonic" variant uint64 0 ) dict entry( string "InactiveEnterTimestamp" variant uint64 1777437996575513 ) dict entry( string "InactiveEnterTimestampMonotonic" variant uint64 4323081530546 ) dict entry( string "Job" variant struct { uint32 0 object path "/" } ) dict entry( string "ConditionResult" variant boolean true ) dict entry( string "AssertResult" variant boolean true ) dict entry( string "ConditionTimestamp" variant uint64 1777437996557068 ) dict entry( string "ConditionTimestampMonotonic" variant uint64 4323081512100 ) dict entry( string "AssertTimestamp" variant uint64 1777437996557068 ) dict entry( string "AssertTimestampMonotonic" variant uint64 4323081512101 ) ] array [ ] signal time=1777437996.576835 sender=:1.20 -> destination=(null destination) serial=42492 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2etimer; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Timer" array [ dict entry( string "NextElapseUSecRealtime" variant uint64 0 ) dict entry( string "NextElapseUSecMonotonic" variant uint64 4409481512902 ) dict entry( string "LastTriggerUSec" variant uint64 1777437996555922 ) dict entry( string "LastTriggerUSecMonotonic" variant uint64 4323081510956 ) dict entry( string "Result" variant string "success" ) ] array [ string "TimersMonotonic" string "TimersCalendar" ] signal time=1777437996.576874 sender=:1.20 -> destination=(null destination) serial=42493 path=/org/freedesktop/systemd1/unit/systemd_2dtmpfiles_2dclean_2etimer; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "org.freedesktop.systemd1.Unit" array [ dict entry( string "ActiveState" variant string "active" ) dict entry( string "SubState" variant string "waiting" ) dict entry( string "InactiveExitTimestamp" variant uint64 1773114916793756 ) dict entry( string "InactiveExitTimestampMonotonic" variant uint64 2949664 ) dict entry( string "ActiveEnterTimestamp" variant uint64 1773114916793756 ) dict entry( string "ActiveEnterTimestampMonotonic" variant uint64 2949664 ) dict entry( string "ActiveExitTimestamp" variant uint64 0 ) dict entry( string "ActiveExitTimestampMonotonic" variant uint64 0 ) dict entry( string "InactiveEnterTimestamp" variant uint64 0 ) dict entry( string "InactiveEnterTimestampMonotonic" variant uint64 0 ) dict entry( string "Job" variant struct { uint32 0 object path "/" } ) dict entry( string "ConditionResult" variant boolean true ) dict entry( string "AssertResult" variant boolean true ) dict entry( string "ConditionTimestamp" variant uint64 1773114916793727 ) dict entry( string "ConditionTimestampMonotonic" variant uint64 2949639 ) dict entry( string "AssertTimestamp" variant uint64 1773114916793731 ) dict entry( string "AssertTimestampMonotonic" variant uint64 2949640 ) ] array [ ] signal time=1777437996.577004 sender=:1.20 -> destination=(null destination) serial=42494 path=/org/freedesktop/systemd1/agent; interface=org.freedesktop.systemd1.Agent; member=Released string "/system.slice/systemd-tmpfiles-clean.service"

These are logs of access to the tmpfiles clean service. I also have logs of access to smartd, fprintf, anacron, ModemManager, rtkit-daemon (pulseaudio), polkit, and apt services.

There is a library Bitcoin Core shares which allows access to these files.
[edit 1777444413]
Reviewing these logs seems alarming but everything appears unharmed. If you see anything out of the ordinary, let me know.
[/edit]

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions