mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-06 21:48:30 -04:00
core: fix security and concurrency issues found in a backend audit (#2805)
* core: fix security and concurrency issues found in backend audit
Security:
- privesc: pipe the sudo password via stdin (sudo -S) instead of
embedding it in the command string, so it no longer appears in argv
(readable by any local user via /proc/<pid>/cmdline or ps)
- greeter: tokenize a session .desktop Exec= line into argv and execve
directly instead of running it through /bin/sh -c, closing a command-
injection path via user-writable ~/.local/share/wayland-sessions
- plugins: reject path-separator/.. in plugin id/name before joining
into a filesystem path, closing an arbitrary-directory-delete in the
uninstall/update fallback
- keybinds/hyprland: always quote unrecognized bind actions/keys when
writing generated Lua; only re-emit genuine round-tripped custom Lua
verbatim (tracked via an explicit flag), closing a Lua-injection path
- desktop/mimeapps: reject newline/bracket in mime/desktop-id fields so
they can't inject fake sections into the shared mimeapps.list
Robustness / concurrency:
- server: recover panics in the request-dispatch path so one bad
handler can't crash the daemon and drop every client
- go-wayland: recover panics in the shared dispatch choke point so a
malformed compositor event can't crash CLI tools / the daemon
- server: per-connection D-Bus client ID instead of a shared constant,
fixing cross-client signal delivery and subscription teardown
- network: guard the NetworkManager device maps with a mutex (a
concurrent map read/write here is an unrecoverable fatal error)
- cups: close the event channel on Stop() so Unsubscribe() of the last
subscriber no longer deadlocks; allocate the fresh channel in Start()
- freedesktop: reuse the shared session conn for the settings watcher
and tear it down in Close(), fixing a per-Manager conn+goroutine leak
- clipboard: mutex-guard lazy dbusConn creation
- geolocation: use WithMatchMember for the GeoClue2 LocationUpdated
signal (was WithMatchSender with an interface.member string, so the
match never fired and live location updates never arrived)
- screenshot: set failed=true on buffer/pool creation errors so the
dispatch loop doesn't wait forever for a ready/failed that never comes
* apply code review comments
---------
Co-authored-by: bbedward <bbedward@gmail.com>
(cherry picked from commit ca89e12963)
This commit is contained in:
@@ -137,22 +137,25 @@ func (m *Manager) consumeSelfEcho(value uint32) bool {
|
||||
}
|
||||
|
||||
func (m *Manager) watchSettingsChanges() {
|
||||
conn, err := dbus.ConnectSessionBus()
|
||||
if err != nil {
|
||||
log.Warnf("color-scheme watcher: session bus connect: %v", err)
|
||||
// reuse the shared session connection; a dedicated one was unreachable
|
||||
// from Close() and leaked with this goroutine
|
||||
if m.sessionConn == nil {
|
||||
return
|
||||
}
|
||||
conn := m.sessionConn
|
||||
|
||||
if err := conn.AddMatchSignal(
|
||||
dbus.WithMatchInterface(dbusPortalSettingsInterface),
|
||||
dbus.WithMatchMember("SettingChanged"),
|
||||
); err != nil {
|
||||
log.Warnf("Failed to watch portal settings changes: %v", err)
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
|
||||
signals := make(chan *dbus.Signal, 64)
|
||||
m.stateMutex.Lock()
|
||||
m.settingsSignals = signals
|
||||
m.stateMutex.Unlock()
|
||||
conn.Signal(signals)
|
||||
|
||||
for sig := range signals {
|
||||
@@ -309,6 +312,18 @@ func (m *Manager) Close() {
|
||||
m.systemConn.Close()
|
||||
}
|
||||
if m.sessionConn != nil {
|
||||
m.sessionConn.RemoveMatchSignal(
|
||||
dbus.WithMatchInterface(dbusPortalSettingsInterface),
|
||||
dbus.WithMatchMember("SettingChanged"),
|
||||
)
|
||||
m.stateMutex.Lock()
|
||||
signals := m.settingsSignals
|
||||
m.settingsSignals = nil
|
||||
m.stateMutex.Unlock()
|
||||
if signals != nil {
|
||||
m.sessionConn.RemoveSignal(signals)
|
||||
close(signals)
|
||||
}
|
||||
m.sessionConn.Close()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,4 +71,6 @@ type Manager struct {
|
||||
screensaverGnomeClaimed bool
|
||||
selfEchoMu sync.Mutex
|
||||
selfEchoes []colorSchemeEcho
|
||||
// registered on sessionConn by watchSettingsChanges; guarded by stateMutex
|
||||
settingsSignals chan *dbus.Signal
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user