]> git.ipfire.org Git - thirdparty/shadow.git/log
thirdparty/shadow.git
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>
2 years agoignore first test in run_some
Serge Hallyn [Mon, 27 Feb 2023 21:05:47 +0000 (15:05 -0600)] 
ignore first test in run_some

bc github...

For some reason, the first test - ONLY on github - seems to not
give the '$ ' prompt expected when you spawn 'su testsuite'.
So just run the first test twice, and ignore the first failure.

2 years agoswap first two tests - does the first one still fail?
Serge Hallyn [Mon, 27 Feb 2023 20:24:11 +0000 (14:24 -0600)] 
swap first two tests - does the first one still fail?

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agotests: remove some github runner PATH tweaking
Serge Hallyn [Sat, 25 Feb 2023 04:25:58 +0000 (22:25 -0600)] 
tests: remove some github runner PATH tweaking

It messes with the expected results.

We can do better than this in the expect scripts, but let's
get things running for now.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agotests: Support git-worktree(1)
Alejandro Colomar [Sun, 26 Feb 2023 14:39:15 +0000 (15:39 +0100)] 
tests: Support git-worktree(1)

git-worktree(1) uses a regular file for <.git>, instead of a directory.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agotests: newuidmap and newgidmap: update expected fail message
Serge Hallyn [Sat, 25 Feb 2023 03:26:01 +0000 (21:26 -0600)] 
tests: newuidmap and newgidmap: update expected fail message

The failure message got changed, but the tests looking for it did
not.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agolibsubid: include alloc.h
Serge Hallyn [Sat, 25 Feb 2023 03:10:57 +0000 (21:10 -0600)] 
libsubid: include alloc.h

Fixes: efbbcade43: Use safer allocation macros
Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agorun_some: log stderr
Serge Hallyn [Fri, 24 Feb 2023 23:52:25 +0000 (17:52 -0600)] 
run_some: log stderr

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoValidate fds created by the user
Vinícius dos Santos Oliveira [Fri, 24 Feb 2023 21:06:02 +0000 (18:06 -0300)] 
Validate fds created by the user

write_mapping() will do the following:

openat(proc_dir_fd, map_file, O_WRONLY);

An attacker could create a directory containing a symlink named
"uid_map" pointing to any file owned by root, and thus allow him to
overwrite any root-owned file.

2 years agoget_pidfd_from_fd: return -1 on error, not 0
Serge Hallyn [Fri, 24 Feb 2023 19:52:32 +0000 (13:52 -0600)] 
get_pidfd_from_fd: return -1 on error, not 0

Fixes: 6974df39a: newuidmap and newgidmap: support passing pid as fd
Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agog-h-a workflow: workaround
Serge Hallyn [Fri, 24 Feb 2023 19:17:42 +0000 (13:17 -0600)] 
g-h-a workflow: workaround

Skip updating grub packages that are currently breaking
apt-get dist-upgrade.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoFix regression in some translation strings
Serge Hallyn [Fri, 24 Feb 2023 18:51:54 +0000 (12:51 -0600)] 
Fix regression in some translation strings

Fixes: d80df2c8a: Update translation
Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agolib: bit_ceil_wrapul(): stop recursion
Iker Pedrosa [Wed, 22 Feb 2023 09:54:28 +0000 (10:54 +0100)] 
lib: bit_ceil_wrapul(): stop recursion

It should call bit_ceilul() instead of itself.

Fixes: 0712b236c3bc ("Add bit manipulation functions")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agolib: define ULONG_WIDTH if non-existent
Iker Pedrosa [Tue, 21 Feb 2023 16:35:48 +0000 (17:35 +0100)] 
lib: define ULONG_WIDTH if non-existent

Signed-off-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
2 years agoUpdate translation
maqi [Thu, 23 Feb 2023 10:21:13 +0000 (18:21 +0800)] 
Update translation

2 years agonewuidmap and newgidmap: support passing pid as fd
Serge Hallyn [Tue, 7 Feb 2023 04:49:42 +0000 (22:49 -0600)] 
newuidmap and newgidmap: support passing pid as fd

Closes #635

newuidmap and newgidmap currently take an integner pid as
the first argument, determining the process id on which to
act.  Accept also "fd:N", where N must be an open file
descriptor to the /proc/pid directory for the process to
act upon.  This way, if you

exec 10</proc/99
newuidmap fd:10 100000 0 65536

and pid 99 dies and a new process happens to take pid 99 before
newuidmap happens to do its work, then since newuidmap will use
openat() using fd 10, it won't change the mapping for the new
process.

Example:

// terminal 1:
serge@jerom ~/src/nsexec$ ./nsexec -W -s 0 -S 0 -U
about to unshare with 10000000
Press any key to exec (I am 129176)

// terminal 2:
serge@jerom ~/src/shadow$ exec 10</proc/129176
serge@jerom ~/src/shadow$ sudo chown root src/newuidmap src/newgidmap
serge@jerom ~/src/shadow$ sudo chmod u+s src/newuidmap
serge@jerom ~/src/shadow$ sudo chmod u+s src/newgidmap
serge@jerom ~/src/shadow$ ./src/newuidmap fd:10 0 100000 10
serge@jerom ~/src/shadow$ ./src/newgidmap fd:10 0 100000 10

// Terminal 1:
uid=0(root) gid=0(root) groups=0(root)

Signed-off-by: Serge Hallyn <serge@hallyn.com>
2 years agoFix use-after-free of pointer after realloc(3)
Alejandro Colomar [Sat, 4 Feb 2023 23:01:13 +0000 (00:01 +0100)] 
Fix use-after-free of pointer after realloc(3)

We can't use a pointer that was input to realloc(3), nor any pointers
that point to reallocated memory, without making sure that the memory
wasn't moved.  If we do, the Behavior is Undefined.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse safer allocation macros
Alejandro Colomar [Sat, 4 Feb 2023 21:41:18 +0000 (22:41 +0100)] 
Use safer allocation macros

Use of these macros, apart from the benefits mentioned in the commit
that adds the macros, has some other good side effects:

-  Consistency in getting the size of the object from sizeof(type),
   instead of a mix of sizeof(type) sometimes and sizeof(*p) other
   times.

-  More readable code: no casts, and no sizeof(), so also shorter lines
   that we don't need to cut.

-  Consistency in using array allocation calls for allocations of arrays
   of objects, even when the object size is 1.

Cc: Valentin V. Bartenev <vbartenev@gmail.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc: Add safer allocation macros
Alejandro Colomar [Wed, 1 Feb 2023 15:30:52 +0000 (16:30 +0100)] 
libmisc: Add safer allocation macros

This macros have several benefits over the standard functions:

-  The type of the allocated object (not the pointer) is specified as an
   argument, which improves readability:
   -  It is directly obvious what is the type of the object just by
      reading the macro call.
   -  It allows grepping for all allocations of a given type.

   This is admittedly similar to using sizeof() to get the size of the
   object, but we'll see why this is better.

-  In the case of reallocation macros, an extra check is performed to
   make sure that the previous pointer was compatible with the allocated
   type, which can avoid some mistakes.

-  The cast is performed automatically, with a pointer type derived from
   the type of the object.  This is the best point of this macro, since
   it does an automatic cast, where there's no chance of typos.

   Usually, programmers have to decide whether to cast or not the result
   of malloc(3).  Casts usually hide warnings, so are to be avoided.
   However, these functions already return a void *, so a cast doesn't
   really add much danger.  Moreover, a cast can even add warnings in
   this exceptional case, if the type of the cast is different than the
   type of the assigned pointer.  Performing a manual cast is still not
   perfect, since there are chances that a mistake will be done, and
   even ignoring accidents, they clutter code, hurting readability.
   And now we have a cast that is synced with sizeof.

-  Whenever the type of the object changes, since we perform an explicit
   cast to the old type, there will be a warning due to type mismatch in
   the assignment, so we'll be able to see all lines that are affected
   by such a change.  This is especially important, since changing the
   type of a variable and missing to update an allocation call far away
   from the declaration is easy, and the consequences can be quite bad.

Cc: Valentin V. Bartenev <vbartenev@gmail.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse xreallocarray() instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 22:43:26 +0000 (23:43 +0100)] 
Use xreallocarray() instead of its pattern

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse reallocarrayf() instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 21:52:13 +0000 (22:52 +0100)] 
Use reallocarrayf() instead of its pattern

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse *array() allocation functions where appropriate
Alejandro Colomar [Sat, 4 Feb 2023 20:47:01 +0000 (21:47 +0100)] 
Use *array() allocation functions where appropriate

This prevents overflow from multiplication.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse xcalloc(3) instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 20:43:43 +0000 (21:43 +0100)] 
Use xcalloc(3) instead of its pattern

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc: Add safer allocation functions
Alejandro Colomar [Sat, 4 Feb 2023 20:13:59 +0000 (21:13 +0100)] 
libmisc: Add safer allocation functions

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc: Move xmalloc.c to alloc.c
Alejandro Colomar [Sun, 19 Feb 2023 19:40:16 +0000 (20:40 +0100)] 
libmisc: Move xmalloc.c to alloc.c

We'll expand the contents in a following commit, so let's move the file
to a more generic name, have a dedicated header, and update includes.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
Use the new header for xstrdup()

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse calloc(3) instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 20:43:43 +0000 (21:43 +0100)] 
Use calloc(3) instead of its pattern

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse reallocarray(3) instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 22:20:38 +0000 (23:20 +0100)] 
Use reallocarray(3) instead of its pattern

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoUse reallocf(3) instead of its pattern
Alejandro Colomar [Sat, 4 Feb 2023 20:25:04 +0000 (21:25 +0100)] 
Use reallocf(3) instead of its pattern

In addition, don't set local variables just before return.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agomalloc(3) already sets errno to ENOMEM
Alejandro Colomar [Sat, 4 Feb 2023 22:37:55 +0000 (23:37 +0100)] 
malloc(3) already sets errno to ENOMEM

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agoRely on realloc(NULL, ...) being equivalent to malloc(...)
Alejandro Colomar [Sat, 4 Feb 2023 20:21:36 +0000 (21:21 +0100)] 
Rely on realloc(NULL, ...) being equivalent to malloc(...)

This is guaranteed by ISO C.  Now that we require ISO C (and even POSIX)
to compile, we can simplify this code.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agolibmisc: agetpass(): Fix bug detecting truncation
Alejandro Colomar [Sun, 19 Feb 2023 18:26:56 +0000 (19:26 +0100)] 
libmisc: agetpass(): Fix bug detecting truncation

On 2/19/23 18:09, David Mudrich wrote:
> I am working on a RAM based Linux OS from source, and try to use
> latest versions of all software.  I found shadow needs libbsd's
> readpassphrase(3) as superior alternative to getpass(3).  While
> considering if I a) include libbsd, or include libbsd's code of
> readpassphrase(3) into shadow, found, that libbsd's readpassphrase(3)
> never returns \n or \r
> <https://cgit.freedesktop.org/libbsd/tree/src/readpassphrase.c>
> line 122, while agetpass() uses a check for \n in agetpass.c line 108.
> I assume it always fails.

Indeed, it always failed.  I made a mistake when writing agetpass(),
assuming that readpassphrase(3) would keep newlines.

>
> I propose a check of len == PASS_MAX - 1, with false positive error for
> exactly PASS_MAX - 1 long passwords.

Instead, I added an extra byte to the allocation to allow a maximum
password length of PASS_MAX (which is the maximum for getpass(3), which
we're replacing.

While doing that, I notice that my previous implementation also had
another bug (minor): The maximum password length was PASS_MAX - 1
instead of PASS_MAX.  That's also fixed in this commit.

Reported-by: David Mudrich <dmudrich@gmx.de>
Fixes: 155c9421b935 ("libmisc: agetpass(), erase_pass(): Add functions for getting passwords safely")
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2 years agofind_new_[gu]id(): Skip over IDs that are reserved for legacy reasons
Martin Kletzander [Wed, 1 Feb 2023 14:36:41 +0000 (15:36 +0100)] 
find_new_[gu]id(): Skip over IDs that are reserved for legacy reasons

Some programs don't support `(uint16_t) -1` or `(uint32_t) -1` as user
or group IDs.  This is because `-1` is used as an error code or as an
unspecified ID, e.g. in `chown(2)` parameters, and in the past, `gid_t`
and `uid_t` have changed width.  For legacy reasons, those values have
been kept reserved in programs today (for example systemd does this; see
the documentation in the link below).

This should not be confused with catching overflow in the ID values,
since that is already caught by our ERANGE checks.  This is about not
using reserved values that have been reserved for legacy reasons.

Link: <https://systemd.io/UIDS-GIDS/>
Reviewed-by: Alejandro Colomar <alx@kernel.org>
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2 years agoFix comments
Samanta Navarro [Thu, 16 Feb 2023 11:57:03 +0000 (11:57 +0000)] 
Fix comments

These comments should indicate which functions they really wrap.
An alternative would be to remove the line completely to avoid
future copy&paste mistakes.

Signed-off-by: Samanta Navarro <ferivoz@riseup.net>