]> git.ipfire.org Git - thirdparty/shadow.git/log
thirdparty/shadow.git
2 years agochage: add --prefix/-P options
Jaroslav Jindrak [Fri, 21 Apr 2023 20:24:36 +0000 (22:24 +0200)] 
chage: add --prefix/-P options

2 years agopasswd: Respect --prefix/-P options
Jaroslav Jindrak [Fri, 21 Apr 2023 18:50:41 +0000 (20:50 +0200)] 
passwd: Respect --prefix/-P options

Add prefix_getpwnam_r() and xprefix_getpwnam() and make passwd
use prefix-aware functions when handling the database.

2 years agoprefix: add prefix support
Michael Vetter [Mon, 17 Apr 2023 13:39:47 +0000 (15:39 +0200)] 
prefix: add prefix support

2 years agostrtoday: remove unnecessary cast
Iker Pedrosa [Wed, 7 Jun 2023 12:58:34 +0000 (14:58 +0200)] 
strtoday: remove unnecessary cast

Resolves: https://github.com/shadow-maint/shadow/issues/704

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoUse temporary variable
Alejandro Colomar [Sat, 27 May 2023 13:56:08 +0000 (15:56 +0200)] 
Use temporary variable

-  Use the temporary variable more, as it helps readability: it removes
   a derefecence, which itself allows removing some parentheses.

-  Use a shorter name, which is more common with temporaries, and so
   there's less to read.

-  Assign to *ranges at the end of the function.  It's the same, but
   with the other changes, I think this makes it slightly clearer.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agorealloc(NULL, ...) is equivalent to malloc(...)
Alejandro Colomar [Sat, 27 May 2023 13:35:13 +0000 (15:35 +0200)] 
realloc(NULL, ...) is equivalent to malloc(...)

Don't have a branch for when the old pointer is NULL.  realloc(3) can
handle that case just fine.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoSimplify allocation APIs
Alejandro Colomar [Wed, 5 Apr 2023 19:17:38 +0000 (21:17 +0200)] 
Simplify allocation APIs

If we consider simple objects as arrays of size 1, we can considerably
simplify these APIs, merging the *ARRAY and the non-array variants.

That will produce more readable code, since lines will be shorter (by
not having ARRAY in the macro names, as all macros will consistently
handle arrays), and the allocated size will be also more explicit.

The syntax will now be of the form:

    p = MALLOC(42, foo_t);  // allocate 42 elements of type foo_t.
    p = MALLOC(1, bar_t);   // allocate 1 element of type foo_t.

The _array() allocation functions should _never_ be called directly, and
instead these macros should be used.

The non-array functions (e.g., malloc(3)) still have their place, but
are limited to allocating structures with flexible array members.  For
any other uses, the macros should be used.

Thus, we don't use any array or ARRAY variants in any code any more, and
they are only used as implementation details of these macros.

Link: <https://software.codidact.com/posts/285898/288023#answer-288023>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoDrop alloca(3)
Christian Göttsche [Tue, 28 Feb 2023 14:50:20 +0000 (15:50 +0100)] 
Drop alloca(3)

alloca(3) fails silently if not enough memory can be allocated on the
stack.  Use checked dynamic allocation instead.

Also drop unnecessary manual NUL assignment, ensured by snprintf(3).

Co-developed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agousermod: fix off-by-one issues
Christian Göttsche [Thu, 2 Mar 2023 15:18:45 +0000 (16:18 +0100)] 
usermod: fix off-by-one issues

Allocate enough memory for the strings, two slashes and the NUL
terminator.

Reported-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc/csrand.c: Update comments
Alejandro Colomar [Sat, 3 Jun 2023 17:25:00 +0000 (19:25 +0200)] 
libmisc/csrand.c: Update comments

Those comments were written when this function used 64 bits (and
temporary variables of 128 bits).  Now it uses 32 bits, with temporaries
of 64 bits, so some values have changed.

Fixes: 2a61122b5e8f ("Unoptimize the higher part of the domain of csrand_uniform()")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolib/nss.c: Fix use of invalid p
Alejandro Colomar [Wed, 31 May 2023 10:24:14 +0000 (12:24 +0200)] 
lib/nss.c: Fix use of invalid p

getline(3) might have succeeded in a previous iteration, in which case
p points to an offset that is not valid.  Make p NULL at the end of the
loop, to make sure it doesn't hold old stuff.

Link: <https://github.com/shadow-maint/shadow/pull/737#issuecomment-1568948769>
Reported-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolib/nss.c: Fix use of uninitialized p
Alejandro Colomar [Wed, 31 May 2023 10:19:33 +0000 (12:19 +0200)] 
lib/nss.c: Fix use of uninitialized p

getline(3) might have never succeeded, in which case p is uninitialized
when used in strtok_r(3).

Link: <https://github.com/shadow-maint/shadow/pull/737#discussion_r1206007358>
Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoCentralize error handling
Alejandro Colomar [Fri, 26 May 2023 10:16:13 +0000 (12:16 +0200)] 
Centralize error handling

This makes the function fit in less screens.  This is to avoid consuming
more natural resources than we have available, and everyone knows the
supply of new-lines on a screen is not a renewable source[1].

Some transformations have been done thanks to free(NULL) being an alias
for loopity_loop(), as defined three comits ago.  The real definition of
free(3) that everyone has been hiding is this:

void
free(void *p)
{
if (p == NULL)
loopity_loop();
else
real_free(p);
}

Link: [1] <https://www.kernel.org/doc/html/v6.3/process/coding-style.html#placing-braces-and-spaces>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoSecond verse, it gets worse; it gets no better than this
Alejandro Colomar [Fri, 26 May 2023 09:34:10 +0000 (11:34 +0200)] 
Second verse, it gets worse; it gets no better than this

Just in case it's not obious:

strlen("") < 8
isalpha('\0') == false
isdigit('\0') == false
isspace('\0') == false

Link: <https://github.com/shadow-maint/shadow/pull/737>
Easter-egg: 8492dee6632e ("subids: support nsswitch")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoROFL: Rolling on the floor looping
Alejandro Colomar [Thu, 25 May 2023 20:24:30 +0000 (22:24 +0200)] 
ROFL: Rolling on the floor looping

Please tell me this was an easter egg :P

 #define go_banana() ({ goto nowhere; nowhere: 0-0; })

Closes: <https://github.com/shadow-maint/shadow/issues/736>
Easter-egg: 8492dee6632e ("subids: support nsswitch")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoThis ain't no loop
Alejandro Colomar [Thu, 25 May 2023 20:13:36 +0000 (22:13 +0200)] 
This ain't no loop

This was to a loop, as "1234" is to computer security.

No really; a loop that ends in a (forward) goto, and has no continue in it.

Still want a loop?  Take two:

 #define loopity_loop() do { for (;;) { break; } continue; } while (0-0)

Closes: <https://github.com/shadow-maint/shadow/issues/736>
Easter-egg: 8492dee6632e ("subids: support nsswitch")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agonewusers: Improve error message
Iker Pedrosa [Wed, 31 May 2023 07:38:12 +0000 (09:38 +0200)] 
newusers: Improve error message

Fixes: b422e3c31691: Check if crypt_method null before dereferencing
Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoch(g)passwd: Check selinux permissions upon startup
Martin Kletzander [Fri, 3 Mar 2023 10:46:33 +0000 (11:46 +0100)] 
ch(g)passwd: Check selinux permissions upon startup

The permission also need to be checked before process_root_flag() since
that can chroot into non-selinux environment (unavailable selinux mount
point for example).

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2 years agoCheck if crypt_method null before dereferencing
Skyler Ferrante [Tue, 30 May 2023 19:00:12 +0000 (15:00 -0400)] 
Check if crypt_method null before dereferencing

Make sure crypto_method set before sha-rounds. Only affects newusers.

2 years agoxgetXXbyYY: Simplify elifs
Alejandro Colomar [Sat, 27 May 2023 01:26:52 +0000 (03:26 +0200)] 
xgetXXbyYY: Simplify elifs

-  Use SIZE_MAX rather than (size_t)-1, to improve readability.

-  Move the only branch that breaks to the first place, so that we
   remove an else.  This reduces nesting while parsing the code.

-  Now that we only have a 2-branch conditional where both branches
   assign to the same variable, rewrite it as a ternary, to shorten.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoxgetXXbyYY: Centralize error handling
Alejandro Colomar [Sat, 27 May 2023 01:24:49 +0000 (03:24 +0200)] 
xgetXXbyYY: Centralize error handling

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoxgetXXbyYY: tfix
Alejandro Colomar [Sat, 27 May 2023 01:19:26 +0000 (03:19 +0200)] 
xgetXXbyYY: tfix

It seems obvious that it was a typo.

Link: <https://github.com/shadow-maint/shadow/pull/729#discussion_r1207551013>
Fixes: e73a2194b3d2 ("xgetXXbyYY: Handle DUP_FUNCTION failure")
Cc: Samanta Navarro <ferivoz@riseup.net>
Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoxgetXXbyYY: Avoid duplicated error handling block
Samanta Navarro [Mon, 15 May 2023 11:59:23 +0000 (11:59 +0000)] 
xgetXXbyYY: Avoid duplicated error handling block

The error handling is performed after the loop. By just calling break it
is possible to reuse the error handling if status is not ERANGE.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoxgetXXbyYY: Handle DUP_FUNCTION failure
Samanta Navarro [Mon, 15 May 2023 11:58:04 +0000 (11:58 +0000)] 
xgetXXbyYY: Handle DUP_FUNCTION failure

A failure of DUP_FUNCTION is already handled for non-reentrant
function wrapper. Perform the check for reentrant version as well.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agosub_[ug]id_{add,remove}: fix return values
Serge Hallyn [Fri, 26 May 2023 03:00:36 +0000 (22:00 -0500)] 
sub_[ug]id_{add,remove}: fix return values

On failure, these are meant to return 0 with errno set.  But if
an nss module is loaded, they were returning -ERRNO instead.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agousermod: Small optimization using memmove for password unlock
Martin Kletzander [Fri, 3 Mar 2023 10:57:23 +0000 (11:57 +0100)] 
usermod: Small optimization using memmove for password unlock

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2 years agoReorder logic to improve comprehensibility
Alejandro Colomar [Sun, 5 Feb 2023 00:29:06 +0000 (01:29 +0100)] 
Reorder logic to improve comprehensibility

-  Don't else after return or fail_exit().
-  Prefer == over != (negated logic is more complex to think about it).
-  Reduce nesting when reasonable.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agonewusers: Fail early
Alejandro Colomar [Sat, 4 Feb 2023 19:54:43 +0000 (20:54 +0100)] 
newusers: Fail early

There's no reason to report all errors.  Bail out at the first one,
which is simpler.

Suggested-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agonewusers: Add missing error handling
Alejandro Colomar [Sat, 4 Feb 2023 19:52:54 +0000 (20:52 +0100)] 
newusers: Add missing error handling

Some errors were being reported in stderr, but then they weren't really
being treated as errors.

If mkdir(2) for EEXIST, it's possible that the sysadmin pre-created the
user dir; don't fail.  However, let's keep a log line, for having some
notice that it happened.

Also, run chmod(2) if mkdir(2) failed for EEXIST (so transform the
'else if' into an 'if').

Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc: Use safer chroot/chdir sequence
Samanta Navarro [Tue, 23 May 2023 11:57:50 +0000 (11:57 +0000)] 
libmisc: Use safer chroot/chdir sequence

OpenSSH and coreutils' chroot call chroot first and then chdir. Doing it
this way is a bit safer because otherwise something could happen between
chdir and chroot to the specified path (like exchange of links) so the
working directory would not end up within the chroot environment.

This is a purely defensive measure.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agosu: Prevent stack overflow in check_perms
Samanta Navarro [Tue, 23 May 2023 11:55:09 +0000 (11:55 +0000)] 
su: Prevent stack overflow in check_perms

This is no real world security fix.

The overflow could occur if too many layered subsystems are encountered
because the function check_perms calls itself recursively.

It would already take a misconfigured system for this to achieve it.

Use an iterative approach by calling the do_check_perms in a loop
instead of calling itself recursively.

As a side note: At least GCC 13 optimized this code and already uses
a jmp in its assembler code. I could only see the stack overflow by
activating address sanitizer which prevented the optimization.

Co-developed-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agosubsystem: Prevent endless loop
Samanta Navarro [Tue, 23 May 2023 11:53:53 +0000 (11:53 +0000)] 
subsystem: Prevent endless loop

If a user has home directory "/" and login shell "*" then login and su
enter an endless loop by constantly switching to the next subsystem.

This could also be achieved with a layered approach so just checking
for "/" as home directory is not enough to protect against such a
misconfiguration.

Just break the loop if it progressed too far. I doubt that this has
negative impact on any real setup.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agodef_load: avoid NULL deref
Serge Hallyn [Fri, 19 May 2023 19:49:04 +0000 (14:49 -0500)] 
def_load: avoid NULL deref

If econf_getStringValue() fails, it will return an error and
set value to NULL.  Look for the error and avoid dereferencing
value in that case.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agodef_load: split the econf from non-econf definition
Serge Hallyn [Fri, 19 May 2023 19:42:04 +0000 (14:42 -0500)] 
def_load: split the econf from non-econf definition

The function is completely different based on USE_CONF.  Either copy
will be easier to read if we just keep them completely separate.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoPlug econf memory leaks
Tobias Stoeckmann [Thu, 18 May 2023 15:25:35 +0000 (17:25 +0200)] 
Plug econf memory leaks

You can see the memory leaks with address sanitizer if shadow is
compiled with `--enable-vendordir=/usr/etc`.

How to reproduce:

1. Prepare a custom shell file as root
```
mkdir -p /etc/shells.d
echo /bin/myshell > /etc/shells.d/custom
```

2. Run chsh as regular user
```
chsh
```

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
2 years agochsh: Verify that login shell path is absolute
Samanta Navarro [Thu, 18 May 2023 11:58:19 +0000 (11:58 +0000)] 
chsh: Verify that login shell path is absolute

The getusershell implementation of musl returns every line within the
/etc/shells file, which even includes comments. Only consider absolute
paths for login shells.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoprocess_prefix_flag: Drop privileges
Samanta Navarro [Thu, 18 May 2023 11:56:17 +0000 (11:56 +0000)] 
process_prefix_flag: Drop privileges

Using --prefix in a setuid binary is quite dangerous. An unprivileged
user could prepare a custom shadow file in home directory. During a data
race the user could exchange directories with links which could lead to
exchange of shadow file in system's /etc directory.

This could be used for local privilege escalation.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoUpdate French translations
bubu [Thu, 11 May 2023 22:04:22 +0000 (17:04 -0500)] 
Update French translations

Please find attached the french updated translation of shadow-man-page,
proofread by the debian-l10n-french mailing list contributors.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoget_pid.c: Use tighter validation checks
Samanta Navarro [Fri, 12 May 2023 11:59:47 +0000 (11:59 +0000)] 
get_pid.c: Use tighter validation checks

Neither a pid_t below 1 nor a negative fd could be valid in this context.

Proof of Concept:

$ newuidmap -1 1 1 1
newuidmap: Could not open proc directory for target 4294967295

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoreplace inadequate German translation of login error message
Markus Hiereth [Thu, 11 May 2023 22:00:51 +0000 (17:00 -0500)] 
replace inadequate German translation of login error message

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoUpdate German translations
Markus Hiereth [Wed, 10 May 2023 14:21:09 +0000 (09:21 -0500)] 
Update German translations

find the attached German message catalogue proofread by the German
language team.

Best regards
Markus

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoRemove some static char arrays
Samanta Navarro [Tue, 9 May 2023 11:59:20 +0000 (11:59 +0000)] 
Remove some static char arrays

Some strings are first written into static char arrays before passed to
functions which expect a const char pointer anyway.

It is easier to pass these strings directly as arguments.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agocommonio: Use do_lock_file again
Samanta Navarro [Wed, 10 May 2023 11:57:20 +0000 (11:57 +0000)] 
commonio: Use do_lock_file again

This avoids regressions introduced with do_fcntl_lock.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoFix broken docbook translations
Serge Hallyn [Tue, 9 May 2023 12:56:38 +0000 (07:56 -0500)] 
Fix broken docbook translations

its by default does not support xml tags inside translatable
units.  Use custom its rules from

https://www.w3.org/TR/xml-i18n-bp/#relating-docbook-plus-its

to enable the tags which are in use by docbook.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoopen with O_CREAT when lock path does not exist
ed neville [Sat, 6 May 2023 09:05:47 +0000 (10:05 +0100)] 
open with O_CREAT when lock path does not exist

Reported in #686, by wyj611 when trying to lock a file that is not
present

Lock method should be F_SETLKW rather than open file descriptor

2 years agocommonio_open: Remove fcntl call
Samanta Navarro [Fri, 5 May 2023 11:59:07 +0000 (11:59 +0000)] 
commonio_open: Remove fcntl call

The fcntl call to set FD_CLOEXEC can be performed directly with the
previously performed open call by using the O_CLOEXEC flag.

O_CLOEXEC is required by POSIX.1-2008.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agocommonio_lock_nowait: Remove deprecated code
Samanta Navarro [Fri, 5 May 2023 11:57:06 +0000 (11:57 +0000)] 
commonio_lock_nowait: Remove deprecated code

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agologin_prompt: Simplify login_prompt API
Samanta Navarro [Fri, 28 Apr 2023 11:57:23 +0000 (11:57 +0000)] 
login_prompt: Simplify login_prompt API

The only user of login_prompt is the login tool. This implies that the
first argument is always the same.

It is much easier to verify printf's format string and its argument if
both are next to each other.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agologin_prompt: Use _exit in signal handler
Samanta Navarro [Fri, 28 Apr 2023 11:56:42 +0000 (11:56 +0000)] 
login_prompt: Use _exit in signal handler

Calling exit is not signal safe.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agologin_prompt: Do not parse environment variables
Samanta Navarro [Fri, 28 Apr 2023 11:55:14 +0000 (11:55 +0000)] 
login_prompt: Do not parse environment variables

Parsing optional environment variables after a login name is a feature
which is neither documented nor available in util-linux or busybox
login which are other wide spread login utilities used in Linux
distributions as reference.

Removing this feature resolves two issues:

- A memory leak exists if variables without an equal sign are used,
  because set_env creates copies on its own. This could lead to OOM
  situations in privileged part of login or may lead to heap spraying.
- Environment variables are not reset between login attempts. This
  could lead to additional environment variables set for a user who
  never intended to do so.

Proof of Concept on a system with shadow login without PAM and
util-linux agetty:

1. Provoke an invalid login, e.g. user `noone` and password `invalid`.
   This starts shadow login and subsequent inputs are passed through
   the function login_prompt.
2. Provoke an invalid login with environment variables, e.g.
   user `noone HISTFILE=/tmp/owo` and password `invalid`.
3. Log in correctly with user `root`.

Now you can see with `echo $HISTFILE` that `/tmp/owo` has been set for
the root user.

This requires a malicious failed login attempt and a successful login
within the configured login timeout (default 60 seconds).

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agolibmisc/yesno.c: Fix regression
Samanta Navarro [Fri, 28 Apr 2023 11:54:38 +0000 (11:54 +0000)] 
libmisc/yesno.c: Fix regression

The getline function does not return a pointer but the amount of read
characters. The error return value to check for is -1.

Set buf to NULL to avoid dereference of an uninitialized stack value.

The getline function returns -1 if size argument is NULL. Always use
a valid pointer even if size is unimportant.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agolibmisc, man: Drop old check and advice for complex character sets in passwords
Alejandro Colomar [Fri, 24 Mar 2023 17:23:59 +0000 (18:23 +0100)] 
libmisc, man: Drop old check and advice for complex character sets in passwords

Add the relevant XKCD to the passwd(1) manual page.  It already explains
most of the rationale behind this patch.

Add also reference to makepasswd(1), which is a good way to generate
strong passwords.  Personally, I commonly run `makepasswd --chars 64` to
create my passwords, or 32 for passwords I need to type interactively
often.

The strength of a password is an exponential formula, where the base is
the size of the character set, and the exponent is the length of the
password.  That already shows why long passwords of just lowercase
letters are better than short Pa$sw0rdZ3.  But an even more important
point is that humans, when forced to use symbols in a password, are more
likely to do trivial substitutions on simple passwords, which doesn't
increase strength, and can instead give a false sense of strength, which
is dangerous.

Closes: <https://github.com/shadow-maint/shadow/issues/688>
Link: <https://xkcd.com/936/>
Cc: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agosemanage: disconnect to free libsemanage internals
Christian Göttsche [Sat, 1 Apr 2023 12:11:06 +0000 (14:11 +0200)] 
semanage: disconnect to free libsemanage internals

Destroying the handle does not actually disconnect, see [1].
Also free the key on user removal.

[1]: https://github.com/SELinuxProject/selinux/blob/e9072e7d45f4559887d11b518099135cbe564163/libsemanage/src/direct_api.c#L330

Example adduser leak:

    Direct leak of 1008 byte(s) in 14 object(s) allocated from:
        #0 0x5638f2e782ae in __interceptor_malloc (./src/useradd+0xee2ae)
        #1 0x7fb5cfffad09 in dbase_file_init src/database_file.c:170:45

    Direct leak of 392 byte(s) in 7 object(s) allocated from:
        #0 0x5638f2e782ae in __interceptor_malloc (./src/useradd+0xee2ae)
        #1 0x7fb5cfffc929 in dbase_policydb_init src/database_policydb.c:187:27

    Direct leak of 144 byte(s) in 2 object(s) allocated from:
        #0 0x5638f2e782ae in __interceptor_malloc (./src/useradd+0xee2ae)
        #1 0x7fb5cfffb519 in dbase_join_init src/database_join.c:249:28

    [...]

2 years agocommonio: free removed database entries
Christian Göttsche [Sat, 1 Apr 2023 11:36:51 +0000 (13:36 +0200)] 
commonio: free removed database entries

Free the actual struct of the removed entry.

Example userdel report:

    Direct leak of 40 byte(s) in 1 object(s) allocated from:
        #0 0x55b230efe857 in reallocarray (./src/userdel+0xda857)
        #1 0x55b230f6041f in mallocarray ./lib/./alloc.h:97:9
        #2 0x55b230f6041f in commonio_open ./lib/commonio.c:563:7
        #3 0x55b230f39098 in open_files ./src/userdel.c:555:6
        #4 0x55b230f39098 in main ./src/userdel.c:1189:2
        #5 0x7f9b48c64189 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16

2 years agorun_parts for groupadd and groupdel
ed neville [Mon, 27 Mar 2023 19:23:03 +0000 (20:23 +0100)] 
run_parts for groupadd and groupdel

run_parts currently exists in useradd and userdel, this commit mirrors
the functionality with groupadd and groupdel

Hook for group{add,del} to include killing processes that have group
membership that would no longer exist to avoid membership ID reuse.

2 years agofix typos
lilinjie [Thu, 6 Apr 2023 09:08:17 +0000 (17:08 +0800)] 
fix typos

Signed-off-by: lilinjie <lilinjie@uniontech.com>
2 years agolibmisc/yesno.c: Use getline(3) and rpmatch(3)
Alejandro Colomar [Fri, 21 Apr 2023 23:59:33 +0000 (01:59 +0200)] 
libmisc/yesno.c: Use getline(3) and rpmatch(3)

getline(3) is much more readable than manually looping.  It has some
overhead due to the allocation of a buffer, but that shouldn't be a
problem here.  If that was a problem, we could reuse the buffer (thus
making the function non-reentrant), but I don't think that's worth the
extra complexity.

Using rpmatch(3) instead of a simple y/n test provides i18n to the
response checking.  We have a fall-back minimalistic implementation for
systems that lack this function (e.g., musl libc).

While we're at it, apply some other minor improvements to this file:

-  Remove comment saying which files use this function.  That's likely
   to get outdated.  And anyway, it's just a grep(1) away, so it doesn't
   really add any value.

-  Remove unnecessary casts to (void) that were used to verbosely ignore
   errors from stdio calls.  They add clutter without really adding much
   value to the code (or I don't see it).

-  Remove comments from the function body.  They make the function less
   readable.  Instead, centralize the description of the function into a
   man-page-like comment before the function definition.  This keeps the
   function body short and sweet.

-  Add '#include <stdbool.h>', which was missing.

-  Minor whitespace style changes (it doesn't hurt the diff at this
   point, since most of the affected lines were already touched by other
   changes, so I applied my preferred style :).

Acked-by: Samanta Navarro <ferivoz@riseup.net>
Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agonewgrp/useradd: always set SIGCHLD to default
Samanta Navarro [Wed, 26 Apr 2023 11:59:51 +0000 (11:59 +0000)] 
newgrp/useradd: always set SIGCHLD to default

The tools newgrp and useradd expect waitpid to behave as described in
its manual page. But the notes indicate that if SIGCHLD is ignored,
waitpid behaves differently.

A user could set SIGCHLD to ignore before starting newgrp through exec.
Children of newgrp would not become zombies and their PIDs could be
reassigned before newgrp could call kill with the child pid and SIGCONT.

The useradd tool is not installed setuid, but I have added the default
there as well (copied from vipw).

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
2 years agoUpdate AUTHORS to add Marek Michałkiewicz
Serge Hallyn [Wed, 19 Apr 2023 16:41:16 +0000 (11:41 -0500)] 
Update AUTHORS to add Marek Michałkiewicz

Closes #708

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoRead whole line in yes_or_no
Samanta Navarro [Fri, 27 Jan 2023 11:53:57 +0000 (11:53 +0000)] 
Read whole line in yes_or_no

Do not stop after 79 characters. Read the complete line to avoid
arbitrary limitations.

Proof of Concept:

```
cat > passwd-poc << EOF
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
EOF
python -c "print(80*'y')" | pwck passwd-poc
```

Two lines should still be within the file because we agreed only once
to remove a duplicated line.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
Reviewed-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Serge Hallyn <serge@hallyn.com>
2 years agouseradd/usermod: add --selinux-range argument
Christian Göttsche [Sat, 1 Apr 2023 12:34:56 +0000 (14:34 +0200)] 
useradd/usermod: add --selinux-range argument

Add a command line argument to useradd(8) and usermod(8) to specify the
MLS range for a SELinux user mapping.

Improves: #676

2 years agoCI: Make build logs more readable
Alejandro Colomar [Wed, 5 Apr 2023 19:50:28 +0000 (21:50 +0200)] 
CI: Make build logs more readable

If make fails in a multi-process invocation, the log is pretty much
unreadable.  To make it readable, build as much as can be built without
failing.  Then run a single-process make again.  If we succeeded
previously, this should be a no-op.  If not, this run will stop at the
first error, which should be more readable, and will only print the few
lines we're interested in.

This has some side effects:  Now we build as much as we can, instead of
failing as early as possible; this may make CI a bit slower.  However,
it also has the benefit that you see _all_ the error messages that could
be given, instead of needing to fix the first error to see the next and
so on.

Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoci: remove explicit fedora dependencies
Iker Pedrosa [Thu, 13 Apr 2023 10:49:31 +0000 (12:49 +0200)] 
ci: remove explicit fedora dependencies

libbsd-devel libeconf-devel have already been added to the spec file and
they should be installed by the `dnf builddep` command.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoREADME: add reference to contribution guidelines
Iker Pedrosa [Tue, 14 Mar 2023 15:45:25 +0000 (16:45 +0100)] 
README: add reference to contribution guidelines

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add contributions introduction
Iker Pedrosa [Tue, 14 Mar 2023 15:44:33 +0000 (16:44 +0100)] 
doc: add contributions introduction

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add license
Iker Pedrosa [Tue, 14 Mar 2023 15:44:12 +0000 (16:44 +0100)] 
doc: add license

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add releases
Iker Pedrosa [Tue, 14 Mar 2023 15:43:57 +0000 (16:43 +0100)] 
doc: add releases

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add Continuous Integration
Iker Pedrosa [Tue, 14 Mar 2023 15:43:23 +0000 (16:43 +0100)] 
doc: add Continuous Integration

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add tests
Iker Pedrosa [Tue, 14 Mar 2023 15:42:22 +0000 (16:42 +0100)] 
doc: add tests

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add coding style
Iker Pedrosa [Tue, 14 Mar 2023 15:41:53 +0000 (16:41 +0100)] 
doc: add coding style

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agodoc: add build & install
Iker Pedrosa [Tue, 14 Mar 2023 15:41:30 +0000 (16:41 +0100)] 
doc: add build & install

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agotrivial: vipw.8: fix grammar
Serge Hallyn [Fri, 31 Mar 2023 23:00:12 +0000 (18:00 -0500)] 
trivial: vipw.8: fix grammar

Signed-off-by: Serge Hallyn <shallyn@cisco.com>
2 years agosssd: skip flushing if executable does not exist
Christian Göttsche [Sat, 1 Apr 2023 11:44:48 +0000 (13:44 +0200)] 
sssd: skip flushing if executable does not exist

Avoid unnecessary syslog output, like:

    Apr 01 13:35:09 dlaptop userdel[45872]: userdel: sss_cache exited with status 1
    Apr 01 13:35:09 dlaptop userdel[45872]: userdel: Failed to flush the sssd cache.

2 years agoOverhaul valid_field()
Christian Göttsche [Fri, 31 Mar 2023 12:46:50 +0000 (14:46 +0200)] 
Overhaul valid_field()

e5905c4b ("Added control character check") introduced checking for
control characters but had the logic inverted, so it rejects all
characters that are not control ones.

Cast the character to `unsigned char` before passing to the character
checking functions to avoid UB.

Use strpbrk(3) for the illegal character test and return early.

2 years agosemanage: Do not set default SELinux range
Martin Kletzander [Fri, 3 Mar 2023 14:09:19 +0000 (15:09 +0100)] 
semanage: Do not set default SELinux range

Both semanage and libsemanage actually set the user's mls range to the
default of the seuser, which makes more sense and removes a bit of code
for usermod and useradd.  More fine-grained details must always be set
with some other tool
(semanage) anyway.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2 years agoFix typo in groupadd usage
Michael Vetter [Fri, 31 Mar 2023 09:47:40 +0000 (11:47 +0200)] 
Fix typo in groupadd usage

2 years agoci: update Differential ShellCheck
Christian Göttsche [Fri, 31 Mar 2023 12:56:23 +0000 (14:56 +0200)] 
ci: update Differential ShellCheck

Run on pushes and drop unnecessary write access.

Should avoid pull-requests comments like
https://github.com/shadow-maint/shadow/pull/695#issuecomment-1491876950

2 years agoAdded control character check
tomspiderlabs [Thu, 23 Mar 2023 23:39:38 +0000 (23:39 +0000)] 
Added control character check

Added control character check, returning -1 (to "err") if control characters are present.

2 years agousermod: respect --prefix for --gid option
Mike Gilbert [Sun, 26 Mar 2023 01:16:55 +0000 (21:16 -0400)] 
usermod: respect --prefix for --gid option

The --gid option accepts a group name or id. When a name is provided, it
is resolved to an id by looking up the name in the group database
(/etc/group).

The --prefix option overides the location of the passwd and group
databases. I suspect the --gid option was overlooked when wiring up the
--prefix option.

useradd --gid already respects --prefix; this change makes usermod
behave the same way.

Fixes: b6b2c756c91806b1c3e150ea0ee4721c6cdaf9d0
Signed-off-by: Mike Gilbert <floppym@gentoo.org>
2 years agoFix su(1) silent truncation
Alejandro Colomar [Mon, 13 Mar 2023 00:21:42 +0000 (01:21 +0100)] 
Fix su(1) silent truncation

*  src/su.c (check_perms): Do not silently truncate user name.

Reported-by: Paul Eggert <eggert@cs.ucla.edu>
Co-developed-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoSimplify is_my_tty()
Alejandro Colomar [Sun, 12 Mar 2023 23:59:22 +0000 (00:59 +0100)] 
Simplify is_my_tty()

This commit will serve to document why we shouldn't worry about the
truncation in the call to strlcpy(3).  Since we have one more byte in
tmptty than in full_tty, truncation will produce a string that is at
least one byte longer than full_tty.  Such a string could never compare
equal, so we're actually handling the truncation in a clever way.  Maybe
too clever, but that's why I'm documenting it here.

Now, about the simplification itself:

Since we made sure that both full_tty and tmptty are null-terminated, we
can call strcmp(3) instead of strncmp(3).  We can also simplify the
return logic avoiding one branch.

Cc: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoFix is_my_tty() buffer overrun
Alejandro Colomar [Sun, 12 Mar 2023 23:41:00 +0000 (00:41 +0100)] 
Fix is_my_tty() buffer overrun

*  libmisc/utmp.c (is_my_tty): Declare the parameter as a char array,
   not char *, as it is not necessarily null-terminated.
   Avoid a read overrun when reading 'tty', which comes from
   'ut_utname'.

Reported-by: Paul Eggert <eggert@cs.ucla.edu>
Co-developed-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoAdd STRLEN(): a constexpr strlen(3) for string literals
Alejandro Colomar [Mon, 13 Mar 2023 00:51:12 +0000 (01:51 +0100)] 
Add STRLEN(): a constexpr strlen(3) for string literals

Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoFix crash with large timestamps
Alejandro Colomar [Sun, 12 Mar 2023 23:05:04 +0000 (00:05 +0100)] 
Fix crash with large timestamps

*  libmisc/date_to_str.c (date_to_str): Do not crash if gmtime(3)
   returns NULL because the timestamp is far in the future.

Reported-by: Paul Eggert <eggert@cs.ucla.edu>
Co-developed-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoPrefer strcpy(3) to strlcpy(3) when either works
Paul Eggert [Sat, 11 Mar 2023 08:02:45 +0000 (00:02 -0800)] 
Prefer strcpy(3) to strlcpy(3) when either works

* lib/gshadow.c (sgetsgent): Use strcpy(3) not strlcpy(3),
since the string is known to fit.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoFix change_field() buffer underrun
Paul Eggert [Sat, 11 Mar 2023 21:43:36 +0000 (13:43 -0800)] 
Fix change_field() buffer underrun

* lib/fields.c (change_field): Don't point
before array start; that has undefined behavior.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoOmit unneeded test in change_field()
Paul Eggert [Sat, 11 Mar 2023 21:41:54 +0000 (13:41 -0800)] 
Omit unneeded test in change_field()

* fields.c (change_field): Omit unnecessary test.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoSimplify change_field() by using strcpy
Paul Eggert [Sat, 11 Mar 2023 08:01:02 +0000 (00:01 -0800)] 
Simplify change_field() by using strcpy

* lib/fields.c (change_field): Since we know the string fits,
use strcpy(3) rather than strlcpy(3).

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoFix null dereference in basename
skyler-ferrante [Wed, 22 Mar 2023 16:46:56 +0000 (12:46 -0400)] 
Fix null dereference in basename

On older kernels (<=linux-5.17), argv[0] can be null. Basename would
call strrchr with null if argc==0. Fixes issue #680

2 years agoCI: script for local container build
Iker Pedrosa [Tue, 14 Mar 2023 11:23:50 +0000 (12:23 +0100)] 
CI: script for local container build

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoCI: build project in containers
Iker Pedrosa [Fri, 3 Mar 2023 14:30:55 +0000 (15:30 +0100)] 
CI: build project in containers

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agocontainer: add fedora
Iker Pedrosa [Fri, 3 Mar 2023 11:44:10 +0000 (12:44 +0100)] 
container: add fedora

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agocontainer: add debian
Iker Pedrosa [Fri, 3 Mar 2023 14:20:41 +0000 (15:20 +0100)] 
container: add debian

Signed-off-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agocontainer: add alpine
Iker Pedrosa [Fri, 3 Mar 2023 12:10:12 +0000 (13:10 +0100)] 
container: add alpine

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoSECURITY.md: add Iker Pedrosa
Iker Pedrosa [Mon, 20 Mar 2023 15:46:43 +0000 (16:46 +0100)] 
SECURITY.md: add Iker Pedrosa

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoselinux: use type safe function pointer assignment
Christian Göttsche [Mon, 6 Mar 2023 15:50:47 +0000 (16:50 +0100)] 
selinux: use type safe function pointer assignment

2 years agoUse strict prototype in definition
Christian Göttsche [Mon, 6 Mar 2023 15:50:30 +0000 (16:50 +0100)] 
Use strict prototype in definition

    gettime.c:25:30: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
    /*@observer@*/time_t gettime ()
                                 ^
                                  void

2 years agoAdd .editorconfig
Vinícius dos Santos Oliveira [Sat, 25 Feb 2023 14:35:05 +0000 (11:35 -0300)] 
Add .editorconfig

2 years agorun_some: fix shellcheck warning
Serge Hallyn [Tue, 28 Feb 2023 03:16:38 +0000 (21:16 -0600)] 
run_some: fix shellcheck warning

shellcheck warns against using echo with flags, as posix sh won't
support it.  It suggests using printf, so let's do that.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agofail on any run_some test failure
Serge Hallyn [Tue, 28 Feb 2023 02:33:12 +0000 (20:33 -0600)] 
fail on any run_some test failure

Signed-off-by: Serge Hallyn <serge@hallyn.com>