On Wed, Apr 3, 2024 at 2:29 AM Hugo Simeliere via
lists.openembedded.org
<[email protected]> wrote:
>
> From: Hugo SIMELIERE <[email protected]>
>
> Upstream-Status: Backport 
> [https://github.com/shadow-maint/shadow/commit/65c88a43a23c2391dcc90c0abda3e839e9c57904]
>
> Signed-off-by: Hugo SIMELIERE <[email protected]>
> ---
>  .../shadow/files/CVE-2023-4641.patch          | 145 ++++++++++++++++++
>  meta/recipes-extended/shadow/shadow.inc       |   1 +
>  2 files changed, 146 insertions(+)
>  create mode 100644 meta/recipes-extended/shadow/files/CVE-2023-4641.patch
>
> diff --git a/meta/recipes-extended/shadow/files/CVE-2023-4641.patch 
> b/meta/recipes-extended/shadow/files/CVE-2023-4641.patch
> new file mode 100644
> index 0000000000..709813ab31
> --- /dev/null
> +++ b/meta/recipes-extended/shadow/files/CVE-2023-4641.patch
> @@ -0,0 +1,145 @@
> +From 51731b01fd9a608397da22b7b9164e4996f3d4c6 Mon Sep 17 00:00:00 2001
> +From: Alejandro Colomar <[email protected]>
> +Date: Sat, 10 Jun 2023 16:20:05 +0200
> +Subject: [PATCH] gpasswd(1): Fix password leak
> +
> +CVE: CVE-2023-4641
> +Upstream-Status: Backport 
> [https://github.com/shadow-maint/shadow/commit/65c88a43a23c2391dcc90c0abda3e839e9c57904]

Missing Signed-off-by in the patch file, please submit a V2

Thanks,

Steve

> +
> +How to trigger this password leak?
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +When gpasswd(1) asks for the new password, it asks twice (as is usual
> +for confirming the new password).  Each of those 2 password prompts
> +uses agetpass() to get the password.  If the second agetpass() fails,
> +the first password, which has been copied into the 'static' buffer
> +'pass' via STRFCPY(), wasn't being zeroed.
> +
> +agetpass() is defined in <./libmisc/agetpass.c> (around line 91), and
> +can fail for any of the following reasons:
> +
> +-  malloc(3) or readpassphrase(3) failure.
> +
> +   These are going to be difficult to trigger.  Maybe getting the system
> +   to the limits of memory utilization at that exact point, so that the
> +   next malloc(3) gets ENOMEM, and possibly even the OOM is triggered.
> +   About readpassphrase(3), ENFILE and EINTR seem the only plausible
> +   ones, and EINTR probably requires privilege or being the same user;
> +   but I wouldn't discard ENFILE so easily, if a process starts opening
> +   files.
> +
> +-  The password is longer than PASS_MAX.
> +
> +   The is plausible with physical access.  However, at that point, a
> +   keylogger will be a much simpler attack.
> +
> +And, the attacker must be able to know when the second password is being
> +introduced, which is not going to be easy.
> +
> +How to read the password after the leak?
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +Provoking the leak yourself at the right point by entering a very long
> +password is easy, and inspecting the process stack at that point should
> +be doable.  Try to find some consistent patterns.
> +
> +Then, search for those patterns in free memory, right after the victim
> +leaks their password.
> +
> +Once you get the leak, a program should read all the free memory
> +searching for patterns that gpasswd(1) leaves nearby the leaked
> +password.
> +
> +On 6/10/23 03:14, Seth Arnold wrote:
> +> An attacker process wouldn't be able to use malloc(3) for this task.
> +> There's a handful of tools available for userspace to allocate memory:
> +>
> +> -  brk / sbrk
> +> -  mmap MAP_ANONYMOUS
> +> -  mmap /dev/zero
> +> -  mmap some other file
> +> -  shm_open
> +> -  shmget
> +>
> +> Most of these return only pages of zeros to a process.  Using mmap of an
> +> existing file, you can get some of the contents of the file demand-loaded
> +> into the memory space on the first use.
> +>
> +> The MAP_UNINITIALIZED flag only works if the kernel was compiled with
> +> CONFIG_MMAP_ALLOW_UNINITIALIZED.  This is rare.
> +>
> +> malloc(3) doesn't zero memory, to our collective frustration, but all the
> +> garbage in the allocations is from previous allocations in the current
> +> process.  It isn't leftover from other processes.
> +>
> +> The avenues available for reading the memory:
> +> -  /dev/mem and /dev/kmem (requires root, not available with Secure Boot)
> +> -  /proc/pid/mem (requires ptrace privileges, mediated by YAMA)
> +> -  ptrace (requires ptrace privileges, mediated by YAMA)
> +> -  causing memory to be swapped to disk, and then inspecting the swap
> +>
> +> These all require a certain amount of privileges.
> +
> +How to fix it?
> +~~~~~~~~~~~~~~
> +
> +memzero(), which internally calls explicit_bzero(3), or whatever
> +alternative the system provides with a slightly different name, will
> +make sure that the buffer is zeroed in memory, and optimizations are not
> +allowed to impede this zeroing.
> +
> +This is not really 100% effective, since compilers may place copies of
> +the string somewhere hidden in the stack.  Those copies won't get zeroed
> +by explicit_bzero(3).  However, that's arguably a compiler bug, since
> +compilers should make everything possible to avoid optimizing strings
> +that are later passed to explicit_bzero(3).  But we all know that
> +sometimes it's impossible to have perfect knowledge in the compiler, so
> +this is plausible.  Nevertheless, there's nothing we can do against such
> +issues, except minimizing the time such passwords are stored in plain
> +text.
> +
> +Security concerns
> +~~~~~~~~~~~~~~~~~
> +
> +We believe this isn't easy to exploit.  Nevertheless, and since the fix
> +is trivial, this fix should probably be applied soon, and backported to
> +all supported distributions, to prevent someone else having more
> +imagination than us to find a way.
> +
> +Affected versions
> +~~~~~~~~~~~~~~~~~
> +
> +All.  Bug introduced in shadow 19990709.  That's the second commit in
> +the git history.
> +
> +Fixes: 45c6603cc86c ("[svn-upgrade] Integrating new upstream version, shadow 
> (19990709)")
> +Reported-by: Alejandro Colomar <[email protected]>
> +Cc: Serge Hallyn <[email protected]>
> +Cc: Iker Pedrosa <[email protected]>
> +Cc: Seth Arnold <[email protected]>
> +Cc: Christian Brauner <[email protected]>
> +Cc: Balint Reczey <[email protected]>
> +Cc: Sam James <[email protected]>
> +Cc: David Runge <[email protected]>
> +Cc: Andreas Jaeger <[email protected]>
> +Cc: <~hallyn/[email protected]>
> +Signed-off-by: Alejandro Colomar <[email protected]>
> +---
> + src/gpasswd.c | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/src/gpasswd.c b/src/gpasswd.c
> +index 4d75af96..a698b32a 100644
> +--- a/src/gpasswd.c
> ++++ b/src/gpasswd.c
> +@@ -918,6 +918,7 @@ static void change_passwd (struct group *gr)
> +               strzero (cp);
> +               cp = getpass (_("Re-enter new password: "));
> +               if (NULL == cp) {
> ++                      memzero (pass, sizeof pass);
> +                       exit (1);
> +               }
> +
> +--
> +2.42.0
> +
> diff --git a/meta/recipes-extended/shadow/shadow.inc 
> b/meta/recipes-extended/shadow/shadow.inc
> index 2ecab5073d..c16292c38a 100644
> --- a/meta/recipes-extended/shadow/shadow.inc
> +++ b/meta/recipes-extended/shadow/shadow.inc
> @@ -16,6 +16,7 @@ SRC_URI = 
> "https://github.com/shadow-maint/shadow/releases/download/${PV}/${BP}.
>             file://shadow-relaxed-usernames.patch \
>             file://CVE-2023-29383.patch \
>             file://0001-Overhaul-valid_field.patch \
> +           file://CVE-2023-4641.patch \
>             "
>
>  SRC_URI_append_class-target = " \
> --
> 2.25.1
>
>
> 
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#197923): 
https://lists.openembedded.org/g/openembedded-core/message/197923
Mute This Topic: https://lists.openembedded.org/mt/105307284/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to