diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-06-04 11:46:36 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-06-23 17:24:24 +0200 |
commit | 037b0a47b0d7df09d720dda6703135117e7e0472 (patch) | |
tree | 02f4357dba6acbc08afd4a32cc7683047e81a324 /src/shared/userdb.h | |
parent | nss-systemd: skip /etc/gshadow look-ups when we just need the GID of a group (diff) | |
download | systemd-037b0a47b0d7df09d720dda6703135117e7e0472.tar.xz systemd-037b0a47b0d7df09d720dda6703135117e7e0472.zip |
userdb: replace recursion lock
Previously we'd used the existance of a specific AF_UNIX socket in the
abstract namespace as lock for disabling lookup recursions. (for
breaking out of the loop: userdb synthesized from nss → nss synthesized
from userdb → userdb synthesized from nss → …)
I did it like that because it promised to work the same both in static
and in dynmically linked environments and is accessible easily from any
programming language.
However, it has a weakness regarding reuse attacks: the socket is
securely hashed (siphash) from the thread ID in combination with the
AT_RANDOM secret. Thus it should not be guessable from an attacker in
advance. That's only true if a thread takes the lock only once and
keeps it forever. However, if a thread takes and releases it multiple
times an attacker might monitor that and quickly take the lock
after the first iteration for follow-up iterations.
It's not a big issue given that userdb (as the primary user for this)
never released the lock and we never made the concept a public
interface, and it was only included in one release so far, but it's
something that deserves fixing. (moreover it's a local DoS only, only
permitting to disable native userdb lookups)
With this rework the libnss_systemd.so.2 module will now export two
additional symbols. These symbols are not used by glibc, but can be used
by arbitrary programs: one can be used to disable nss-systemd, the other
to check if it is currently disabled.
The lock is per-thread. It's slightly less pretty, since it requires
people to manually link against C code via dlopen()/dlsym(), but it
should work safely without the aforementioned weakness.
Diffstat (limited to 'src/shared/userdb.h')
-rw-r--r-- | src/shared/userdb.h | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/src/shared/userdb.h b/src/shared/userdb.h index 8af31aa86c..2464f54c3e 100644 --- a/src/shared/userdb.h +++ b/src/shared/userdb.h @@ -38,5 +38,4 @@ int membershipdb_all(UserDBFlags flags, UserDBIterator **ret); int membershipdb_iterator_get(UserDBIterator *iterator, char **user, char **group); int membershipdb_by_group_strv(const char *name, UserDBFlags flags, char ***ret); -int userdb_nss_compat_is_enabled(void); -int userdb_nss_compat_disable(void); +int userdb_block_nss_systemd(int b); |