summaryrefslogtreecommitdiffstats
path: root/src/shared/userdb.h
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-06-04 11:46:36 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-06-23 17:24:24 +0200
commit037b0a47b0d7df09d720dda6703135117e7e0472 (patch)
tree02f4357dba6acbc08afd4a32cc7683047e81a324 /src/shared/userdb.h
parentnss-systemd: skip /etc/gshadow look-ups when we just need the GID of a group (diff)
downloadsystemd-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.h3
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);