Commit Graph

19512 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult 9225a25b59 Xnamespace: whitelist some XI operations
Whitelisting some XI operations in various hooks.

Note that some additional filtering needs to be done in send or
receive hook in order to prevent clients to receive possibly sensible
input data from the root window.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 4e26000641 Xnamespace: filter access on other clients
Restrict access to other clients within same namespace.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 2ccb405593 Xnamespace: filter client-to-client message sending
Filter message sending by clients. Only sending within the same
namespace is allowed (except for clients in a NS with superpowers,
e.g. root)

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 6b7fc78a6a Xnamespace: filter server access
Whitelisting several server access calls that are safe, rejecting the rest.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult ab9b93168e Xnamespace: filter device access
Filter device access, whitelist several commonly used operations that
should be safe (eg. query keyboard layout).

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 5a21fb3d89 Xnamespace: whitelist access to namespace virtual root window
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 3414e41b0e Xnamespace: whitelist certain operations on (real) root window
CreateWindow() needs access to root window, in order to create
top level windows. Whitelisting this operation.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 4b3f284c04 Xnamespace: whitelist resource access for serverClient
The server itself is allowed to access anything w/o restrictions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult fa0fca73c6 Xnamespace: whitelist resource access within same namespace
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult b48aca8539 Xnamespace: filter transparency
Silently drop transparency flag if namespace isn't allowed to use it.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 856b0e0292 Xnamespace: filter extension access
Whitelist several extension calls that are safe. Also allow namespaces
to be configured for unrestricted access.

TBD: doesn't actually reject yet

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 20ccb6ec9d Xnamespace: filter raw mouse motion and keyboard access
Only namespaces with allowMouseOption flag enabled can receive
raw mouse motion events. Raw key press events are always blocked.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult c281a8a44f Xnamespace: isolate root window property access
Redirecting access to root window properties to the per-namespace
virtual root windows. This isolates a lot of communication via root
window, e.g. the cut buffers.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 6646a7b4f3 Xnamespace: create per-namespace fake root windows
For each namespace creating a fake (invisible) root window, which can be
used for storing per-namespace properties (eg. cut buffers), etc.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 13f0e53659 Xnamespace: add selection isolation
Selection names (as seen by the client) are internally prefixed with the
namespace ID, so each client can only access those within it's namespace.

If a client within namespace "foo" want's to operate on "PRIMARY",
it actually will be doing so on "<foo>PRIMARY", w/o ever noticing it.
Events will sent back to the client still pointing to "PRIMARY".

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 0398858521 Xnamespace: assign incoming clients to namespaces
The association is done by matching client's and namespace's
authentication token.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 33a66a7810 Xnamespace: add per-client private data
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult bc4c35d045 Xnamespace: add basic namespace config structures
Adding data structure and initial data for namespace configuration.

Built-in namespaces are ROOT and ANONYMOUS.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult f6e190f3a9 Xnamespace: namespace extension skeleton
Add tiny skeleton for the namespace extension. Disabled by default,
can be enabled via +extension arg, but doesn't actually do something yet.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 425bfab6cb Xi: allow hooks to silently ignore SelectEvents request
When looking up the window to select on and security hook returns
BadAccess, the request is just silently ignored, instead of rejected.

This way, security hook can prevent untrusted clients to listen on
arbitrary windows, without the client even noticing. The client won't
get this BadAccess error, but instead thinking everything's fine,
just not getting the actual events.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult b3d6fd7613 include: list.h: add duplicate checking add/append functions
Simplify cases where callers need to check whether an entry already is
in a list before adding / appending.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 5a1d3a0813 include: list.h: add xorg_list_present()
This function walks through the list and checks whether an entry is already
present. This check sometimes is neccessary, since trying to add an entry
twice has catastrophic consequences: iteration will become endless loop.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult d39722d416 include: list.h: allow zero-initialization of struct xorg_list
Up until now, xorg_list's always need to be explicitly initialized by
calling xorg_list_init(), otherwise next access attempt will segfault.
This is adding extra complexity and risk of subtle bugs.

Adding some extra NULL check are trivial and their cost is so tiny
that it's even hard to practically measure.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 9c36dfcaa2 include: list.h: document things that must not be done
Add some warnings that list entries must not be added twice.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 46e35287bc include: list.h: fix inline docs for xorg_list_append()
The docs stated it's prepending, while it's actually appending.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult d3750f0a3a dix: helper for checking whether window ID belongs to a root window
This helper checks whether a given XID belongs to some screen's
root window. It does so by looking up the window and comparing that
with the window's screen's root window pointer. The resource lookup
is intentionally being on behalf of the serverClient, so the fired
XACE hook doesn't treat it as an actual client's request.

It's explicitly designed for being used by callback handlers.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult be465abc36 dix: helper for retrieving client owning a XID
Add a little helper that's looking up the ClientPtr to the client
of the owner of given XID. The lookup is solely done on the ID space,
the actual resource doesn't even need to exist.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 8a3401c94c dix: add selection filtering hooks
Add hooks for filtering and fully rewrite rewrite selection requests
and events (what existing XACE hooks cannot do), e.g. for supporting
separate selection name spaces.

The hook can change individual fields in the parameter struct, so
operation continues with these changed values (eg. replace the original
selection name atom by a different one). It's also possible to stop
operations completely (with given result code) - in that case the
hook needs to take care of the remaining work to do (eg. sending events)

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 824a78e8fc dix: add dixAllocServerXID()
Adding a separate function for allocating server-client's XIDs.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult d6d510ca61 dix: refine docs on DeliverDeviceEvents()
Adding a bit more explaination on how events are passed upwards.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 09781e8710 dix: hook for intercepting window property calls
This hook allows extensions to intercept client requests for changing
window attributes. It can either change the parameters or skip the
entire call (eg. handle all itself) so just the hook provided result
code is returned to the client.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 28b7bdf84a dix: clean up MakeWindowOptional() calls and add alloc fault checks
a) no need to checking for win->optional == NULL before calling
   MakeWindowOptional(), because it checks itself
   (except some cases where it's presence has it's own semantics,
   or prevent unnecessary allocations)
b) lots of call sites didn't check for allocation failure.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 3d53ec7ed3 dix: unexport MakeWindowOptional()
Really internal, should not be used by drivers.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 08cca901d4 dix: window: use calloc() instead of malloc()
In general safer programming practise to always zero-out newly
allocated chunks.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult f16d448722 dix: registry: add LookupDixAccessName()
Helper for converting Xace access masks to human-readable text.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 154ed75e5c dix: add callback for post root window init
Allow extensions to catch in right after a screen's root window has
been finally initialized

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 029f965dd9 (!1867) dix: unexport and rename CreateWindow()
a) an internal function that's not used by any drivers
b) conflicting with function/define of same name on win32

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult aa7b846c80 (!1871) damage: fix resource access flag on destroy
When destroying a resource, the lookup needs to be done with
DixDestroyAccess (instead of DixWriteAccess) flag - otherwise
xace hooks can't properly differenciate what's happening.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Fixes: 6c46645cfc
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 3b4997b2eb (!1880) Xi: use fixed define for extenion base opcode
Several places outside Xi (eg. dix, security hooks, ...) need to know the
actual XI base opcode. This formerly had been done by a global variable,
which is filled on XI init. This has some drawbacks, eg. requires that
XI really is initialized before anybody else attempting to access this
variable - changes in extension init order could be dangerous.

Since extension opcodes are now (compile-time) fixed for all known
extensions (including XI), this isn't needed anymore. We can really
rely on the XI extension always having the same opcode base. So we
can drop that variable entirely and use the corresponding define instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult bb77b8406d (!1880) dix: reserve fixed extension opcodes for known extensions
Assign fixed opcodes for known (in-tree) extensions and add
defines for them. Other places (eg. security extensions) that
need to know those opcodes now can directly use those defines
not having to look them up at runtime.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 8d29cb9f68 (!1880) dix: add support for reserved extension slots
In order to allow extensions being registered at fixed opcodes,
there need to be a reserved slot range. Thus `NumExtensions` needs
to start out with the upper ceiling of the reserved slot space.
Thus it cannot tell whether the array already had been allocated,
and some slots now may be NULL, so we need some extra checks.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 13a9436a85 (!1880) dix: AddExtension: simplify error return path
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 49faf3ca53 (!1880) dix: simplify extension query
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult c8604a144d (!1888) present: simplify dispatching
Using simple case statements with actual opcode define's instead
of call vector arrays where the exact order matters.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 3aee9faba7 (!1901) os: auth: protect against duplicate auth keys
Protect the Add() proto funcs from adding duplicate auth keys.
If adding a duplicate is attempted, the XID of the already
existing one is returned instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult a901def824 (!1901) os: xdmcp: simplify AddAuth handler call
No need for loading the address into temporary variable and later doing
indirect call, since we can easily do direct call in each branch.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 080ed7afbf (!1901) os: auth: let GenerateAuthorization() return 0 on error
XID = 0 already is used as sign for error in several places,
so let's use that here, too.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult b303527705 (!1901) os: auth: generate XIDs in proto funcs only on success
Generate the auth object XIDs inside the proto funcs and only
on success, so we don't unnecessarily allocate XIDs.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult 4e635978bb (!1901) os: auth: move GenerateRandomData() and make it static
Only used in mitauth.c, so we can move it there and make it static.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00
Enrico Weigelt, metux IT consult ab87d0ea7a (!1901) os: auth: factor out auth proto names into defines
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-06-30 20:39:05 +02:00