public inbox for openembedded-core@lists.openembedded.org
 help / color / mirror / Atom feed
From: Hitendra Prajapati <hprajapati@mvista.com>
To: Fabien Thomas <fabien.thomas@smile.fr>,
	openembedded-core@lists.openembedded.org
Subject: Re: [OE-core] [kirkstone][PATCH] busybox: fix for CVE-2026-26157, CVE-2026-26158
Date: Thu, 19 Mar 2026 17:10:44 +0530	[thread overview]
Message-ID: <c643bc67-8d9a-4740-9539-ea7b90d93c99@mvista.com> (raw)
In-Reply-To: <DH6PK2HKFZEL.OW09CNJ5IJ15@smile.fr>

[-- Attachment #1: Type: text/plain, Size: 13751 bytes --]

Hi Team,

I'm not able to load the official busybox repo form last week, so I used 
mirror.

If anyone have access, they may try to fix this or I will look into 
these later.

Regards,

Hitendra

On 19/03/26 4:35 pm, Fabien Thomas wrote:
> On Fri Mar 13, 2026 at 2:18 PM CET, Hitendra Prajapati via lists.openembedded.org wrote:
>> Although the patch was not merged yet, Debian already took it ([1] & [2]).
>> Since busybox CVE handling is slow, follow Debian decision.
>>
>> [1]https://sources.debian.org/src/busybox/1:1.37.0-10.1/debian/patches/0001-tar-strip-unsafe-hardlink-components-GNU-tar-does-th.patch
>> [2]https://sources.debian.org/src/busybox/1:1.37.0-10.1/debian/patches/0002-tar-only-strip-unsafe-components-from-hardlinks-not-.patch
>>
>> Signed-off-by: Hitendra Prajapati<hprajapati@mvista.com>
>> ---
>>   .../CVE-2026-26157-CVE-2026-26158-01.patch    |  35 ++++
>>   .../CVE-2026-26157-CVE-2026-26158-02.patch    | 197 ++++++++++++++++++
>>   meta/recipes-core/busybox/busybox_1.35.0.bb   |   2 +
>>   3 files changed, 234 insertions(+)
>>   create mode 100644 meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-01.patch
>>   create mode 100644 meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-02.patch
>>
>> diff --git a/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-01.patch b/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-01.patch
>> new file mode 100644
>> index 0000000000..306ccad511
>> --- /dev/null
>> +++ b/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-01.patch
>> @@ -0,0 +1,35 @@
>> +From 038e0e4d791ea4e8a8da5e06904756142fc6b8dc Mon Sep 17 00:00:00 2001
>> +From: Radoslav Kolev<radoslav.kolev@suse.com>
>> +Date: Mon, 16 Feb 2026 11:50:04 +0200
>> +Subject: tar: only strip unsafe components from hardlinks, not symlinks
>> +
>> +commit 3fb6b31c7 introduced a check for unsafe components in
>> +tar archive hardlinks, but it was being applied to symlinks too
>> +which broke "Symlinks and hardlinks coexist" tar test.
>> +
>> +Signed-off-by: Radoslav Kolev<radoslav.kolev@suse.com>
>> +Signed-off-by: Denys Vlasenko<vda.linux@googlemail.com>
>> +
>> +CVE: CVE-2026-26157, CVE-2026-26158
>> +Upstream-Status: Backport [https://github.com/mirror/busybox/commit/3fb6b31c716669e12f75a2accd31bb7685b1a1cb]
>> +Signed-off-by: Hitendra Prajapati<hprajapati@mvista.com>
>> +---
>> + archival/libarchive/get_header_tar.c | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
>> +index dc0f7e0..a8c2ad8 100644
>> +--- a/archival/libarchive/get_header_tar.c
>> ++++ b/archival/libarchive/get_header_tar.c
>> +@@ -453,7 +453,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
>> +
>> + 	/* Everything up to and including last ".." component is stripped */
>> + 	strip_unsafe_prefix(file_header->name);
>> +-	if (file_header->link_target) {
>> ++	if (file_header->link_target && !S_ISLNK(file_header->mode)) {
>> + 		/* GNU tar 1.34 examples:
>> + 		 * tar: Removing leading '/' from hard link targets
>> + 		 * tar: Removing leading '../' from hard link targets
>> +--
>> +2.50.1
>> +
>> diff --git a/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-02.patch b/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-02.patch
>> new file mode 100644
>> index 0000000000..69e6e98c75
>> --- /dev/null
>> +++ b/meta/recipes-core/busybox/busybox/CVE-2026-26157-CVE-2026-26158-02.patch
>> @@ -0,0 +1,197 @@
>> +From 0c20d6b353b058ab910dd3a0211e2b906802b105 Mon Sep 17 00:00:00 2001
>> +From: Denys Vlasenko<vda.linux@googlemail.com>
>> +Date: Thu, 29 Jan 2026 11:48:02 +0100
>> +Subject: tar: strip unsafe hardlink components - GNU tar does the same
>> +
>> +Defends against files like these (python reproducer):
>> +
>> +import tarfile
>> +ti = tarfile.TarInfo("leak_hosts")
>> +ti.type = tarfile.LNKTYPE
>> +ti.linkname = "/etc/hosts"  # or "../etc/hosts" or ".."
>> +ti.size = 0
>> +with tarfile.open("/tmp/hardlink.tar", "w") as t:
>> +	t.addfile(ti)
>> +
>> +function                                             old     new   delta
>> +skip_unsafe_prefix                                     -     127    +127
>> +get_header_tar                                      1752    1754      +2
>> +.rodata                                           106861  106856      -5
>> +unzip_main                                          2715    2706      -9
>> +strip_unsafe_prefix                                  102      18     -84
>> +------------------------------------------------------------------------------
>> +(add/remove: 1/0 grow/shrink: 1/3 up/down: 129/-98)            Total: 31 bytes
>> +
>> +Signed-off-by: Denys Vlasenko<vda.linux@googlemail.com>
>> +
>> +CVE: CVE-2026-26157, CVE-2026-26158
>> +Upstream-Status: Backport [https://github.com/mirror/busybox/commit/3fb6b31c716669e12f75a2accd31bb7685b1a1cb]
>> +Signed-off-by: Hitendra Prajapati<hprajapati@mvista.com>
>> +---
>> + .../archival/libarchive/data_extract_all.c    |  7 ++---
>> + .../archival/libarchive/get_header_tar.c      | 11 +++++--
>> + .../archival/libarchive/unsafe_prefix.c       | 30 +++++++++++++++----
>> + .../libarchive/unsafe_symlink_target.c        |  1 +
>> + archival/tar.c                 |  2 +-
>> + archival/unzip.c               |  2 +-
>> + include/bb_archive.h           |  3 +-
>> + 7 files changed, 42 insertions(+), 14 deletions(-)
>> +
>> +diff --git a/archival/libarchive/data_extract_all.c b/archival/libarchive/data_extract_all.c
>> +index 8a69711..b84b960 100644
>> +--- a/archival/libarchive/data_extract_all.c
>> ++++ b/archival/libarchive/data_extract_all.c
>> +@@ -66,8 +66,8 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
>> + 	}
>> + #endif
>> + #if ENABLE_FEATURE_PATH_TRAVERSAL_PROTECTION
>> +-	/* Strip leading "/" and up to last "/../" path component */
>> +-	dst_name = (char *)strip_unsafe_prefix(dst_name);
>> ++	/* Skip leading "/" and past last ".." path component */
>> ++	dst_name = (char *)skip_unsafe_prefix(dst_name);
>> + #endif
>> + // ^^^ This may be a problem if some applets do need to extract absolute names.
>> + // (Probably will need to invent ARCHIVE_ALLOW_UNSAFE_NAME flag).
>> +@@ -185,8 +185,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
>> +
>> + 		/* To avoid a directory traversal attack via symlinks,
>> + 		 * do not restore symlinks with ".." components
>> +-		 * or symlinks starting with "/", unless a magic
>> +-		 * envvar is set.
>> ++		 * or symlinks starting with "/"
>> + 		 *
>> + 		 * For example, consider a .tar created via:
>> + 		 *  $ tar cvf bug.tar anything.txt
>> +diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
>> +index d26868b..dc0f7e0 100644
>> +--- a/archival/libarchive/get_header_tar.c
>> ++++ b/archival/libarchive/get_header_tar.c
>> +@@ -452,8 +452,15 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
>> + #endif
>> +
>> + 	/* Everything up to and including last ".." component is stripped */
>> +-	overlapping_strcpy(file_header->name, strip_unsafe_prefix(file_header->name));
>> +-//TODO: do the same for file_header->link_target?
>> ++	strip_unsafe_prefix(file_header->name);
>> ++	if (file_header->link_target) {
>> ++		/* GNU tar 1.34 examples:
>> ++		 * tar: Removing leading '/' from hard link targets
>> ++		 * tar: Removing leading '../' from hard link targets
>> ++		 * tar: Removing leading 'etc/../' from hard link targets
>> ++		 */
>> ++		strip_unsafe_prefix(file_header->link_target);
>> ++	}
>> +
>> + 	/* Strip trailing '/' in directories */
>> + 	/* Must be done after mode is set as '/' is used to check if it's a directory */
>> +diff --git a/archival/libarchive/unsafe_prefix.c b/archival/libarchive/unsafe_prefix.c
>> +index 6670811..89a371a 100644
>> +--- a/archival/libarchive/unsafe_prefix.c
>> ++++ b/archival/libarchive/unsafe_prefix.c
>> +@@ -5,11 +5,11 @@
>> + #include "libbb.h"
>> + #include "bb_archive.h"
>> +
>> +-const char* FAST_FUNC strip_unsafe_prefix(const char *str)
>> ++const char* FAST_FUNC skip_unsafe_prefix(const char *str)
>> + {
>> + 	const char *cp = str;
>> + 	while (1) {
>> +-		char *cp2;
>> ++		const char *cp2;
>> + 		if (*cp == '/') {
>> + 			cp++;
>> + 			continue;
>> +@@ -22,10 +22,25 @@ const char* FAST_FUNC strip_unsafe_prefix(const char *str)
>> + 			cp += 3;
>> + 			continue;
>> + 		}
>> +-		cp2 = strstr(cp, "/../");
>> ++		cp2 = cp;
>> ++ find_dotdot:
>> ++		cp2 = strstr(cp2, "/..");
>> + 		if (!cp2)
>> +-			break;
>> +-		cp = cp2 + 4;
>> ++			break; /* No (more) malicious components */
>> ++
>> ++		/* We found "/..something" */
>> ++		cp2 += 3;
>> ++		if (*cp2 != '/') {
>> ++			if (*cp2 == '\0') {
>> ++				/* Trailing "/..": malicious, return "" */
>> ++				/* (causes harmless errors trying to create or hardlink a file named "") */
>> ++				return cp2;
>> ++			}
>> ++			/* "/..name" is not malicious, look for next "/.." */
>> ++			goto find_dotdot;
>> ++		}
>> ++		/* Found "/../": malicious, advance past it */
>> ++		cp = cp2 + 1;
>> + 	}
>> + 	if (cp != str) {
>> + 		static smallint warned = 0;
>> +@@ -37,3 +52,8 @@ const char* FAST_FUNC strip_unsafe_prefix(const char *str)
>> + 	}
>> + 	return cp;
>> + }
>> ++
>> ++void FAST_FUNC strip_unsafe_prefix(char *str)
>> ++{
>> ++	overlapping_strcpy(str, skip_unsafe_prefix(str));
>> ++}
>> +diff --git a/archival/libarchive/unsafe_symlink_target.c b/archival/libarchive/unsafe_symlink_target.c
>> +index f8dc803..d764c89 100644
>> +--- a/archival/libarchive/unsafe_symlink_target.c
>> ++++ b/archival/libarchive/unsafe_symlink_target.c
>> +@@ -36,6 +36,7 @@ void FAST_FUNC create_links_from_list(llist_t *list)
>> + 				*list->data ? "hard" : "sym",
>> + 				list->data + 1, target
>> + 			);
>> ++			/* Note: GNU tar 1.34 errors out only _after_ all links are (attempted to be) created */
>> + 		}
>> + 		list = list->link;
>> + 	}
>> +diff --git a/archival/tar.c b/archival/tar.c
>> +index 9de3759..cf8c2d1 100644
>> +--- a/archival/tar.c
>> ++++ b/archival/tar.c
>> +@@ -475,7 +475,7 @@ static int FAST_FUNC writeFileToTarball(struct recursive_state *state,
>> + 	DBG("writeFileToTarball('%s')", fileName);
>> +
>> + 	/* Strip leading '/' and such (must be before memorizing hardlink's name) */
>> +-	header_name = strip_unsafe_prefix(fileName);
>> ++	header_name = skip_unsafe_prefix(fileName);
>> +
>> + 	if (header_name[0] == '\0')
>> + 		return TRUE;
>> +diff --git a/archival/unzip.c b/archival/unzip.c
>> +index fc92ac6..7b29d77 100644
>> +--- a/archival/unzip.c
>> ++++ b/archival/unzip.c
>> +@@ -842,7 +842,7 @@ int unzip_main(int argc, char **argv)
>> + 		unzip_skip(zip.fmt.extra_len);
>> +
>> + 		/* Guard against "/abspath", "/../" and similar attacks */
>> +-		overlapping_strcpy(dst_fn, strip_unsafe_prefix(dst_fn));
>> ++		strip_unsafe_prefix(dst_fn);
>> +
>> + 		/* Filter zip entries */
>> + 		if (find_list_entry(zreject, dst_fn)
>> +diff --git a/include/bb_archive.h b/include/bb_archive.h
>> +index e0ef8fc..1dc77f3 100644
>> +--- a/include/bb_archive.h
>> ++++ b/include/bb_archive.h
>> +@@ -202,7 +202,8 @@ char get_header_tar_xz(archive_handle_t *archive_handle) FAST_FUNC;
>> + void seek_by_jump(int fd, off_t amount) FAST_FUNC;
>> + void seek_by_read(int fd, off_t amount) FAST_FUNC;
>> +
>> +-const char *strip_unsafe_prefix(const char *str) FAST_FUNC;
>> ++const char *skip_unsafe_prefix(const char *str) FAST_FUNC;
>> ++void strip_unsafe_prefix(char *str) FAST_FUNC;
>> + void create_or_remember_link(llist_t **link_placeholders,
>> + 		const char *target,
>> + 		const char *linkname,
>> +--
>> +2.50.1
>> +
>> diff --git a/meta/recipes-core/busybox/busybox_1.35.0.bb b/meta/recipes-core/busybox/busybox_1.35.0.bb
>> index 0b5ac220f5..bb07502ccc 100644
>> --- a/meta/recipes-core/busybox/busybox_1.35.0.bb
>> +++ b/meta/recipes-core/busybox/busybox_1.35.0.bb
>> @@ -62,6 +62,8 @@ SRC_URI ="https://busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \ 
>> file://CVE-2025-46394-01.patch \ file://CVE-2025-46394-02.patch \ 
>> file://CVE-2025-60876.patch \ + 
>> file://CVE-2026-26157-CVE-2026-26158-01.patch \ + 
>> file://CVE-2026-26157-CVE-2026-26158-02.patch \ "
>>   SRC_URI:append:libc-musl =" file://musl.cfg "
>>   
> Hi Hitendra,
>
> I'm working with Yoann, helping him to support the maintenance of
> the stable branches.
>
> Thanks for the patch. Indeed, since the Busybox CVE handling is indeed slow,
> following Debian is acceptable. However, there are a few issues that need to
> be addressed before this can be merged:
>
> In the patch metadata (Upstream-Status / Backport):
> - Source URL: Please use the official upstream repository (git.busybox.net,
> which I'm aware is littlebit downish) instead of the GitHub mirror.
> - Commit Reference: The Debian patches you cited do not actually backport
> the commit 3fb6b31c716669e12f75a2accd31bb7685b1a1cb as claimed in the status.
> Seems that the first one is actually a backport of
> 599f5dd8fac390c18b79cba4c14c334957605dae, recently merged in busybox master.
>
> Please clarify the "Upstream-Status" to reflect exactly
> what these patches represent.
>
> The first patch (01.patch) fails to apply on the current Kirkstone
> busybox_1.35.0 recipe:
>
> ERROR: busybox-1.35.0-r0 do_patch:
> Applying patch 'CVE-2026-26157-CVE-2026-26158-01.patch'
> patching file archival/libarchive/get_header_tar.c
> Hunk #1 FAILED at 453.
> 1 out of 1 hunk FAILED -- rejects in file archival/libarchive/get_header_tar.c
>
> Please ensure the patches are rebased and tested against
> the kirkstone branch of openembedded-core.
>
> Best regards,
>
-- 
Regards,
Hitendra Prajapati
MontaVista Software LLC
Mo: +91 9998906483

[-- Attachment #2: Type: text/html, Size: 15442 bytes --]

  reply	other threads:[~2026-03-19 11:40 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-13 13:18 [kirkstone][PATCH] busybox: fix for CVE-2026-26157, CVE-2026-26158 Hitendra Prajapati
2026-03-19 11:05 ` [OE-core] " Fabien Thomas
2026-03-19 11:40   ` Hitendra Prajapati [this message]
2026-03-21  0:30     ` Yoann Congal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c643bc67-8d9a-4740-9539-ea7b90d93c99@mvista.com \
    --to=hprajapati@mvista.com \
    --cc=fabien.thomas@smile.fr \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox