All of lore.kernel.org
 help / color / mirror / Atom feed
* [meta-virtualization][scarthgap][PATCH 1/1] buildah: Fix CVE-2024-9675
@ 2025-04-14 13:29 Praveen Kumar
  2025-04-19 22:48 ` Bruce Ashfield
  0 siblings, 1 reply; 2+ messages in thread
From: Praveen Kumar @ 2025-04-14 13:29 UTC (permalink / raw)
  To: meta-virtualization; +Cc: Praveen Kumar

A vulnerability was found in Buildah. Cache mounts do not properly
validate that user-specified paths for the cache are within our cache
directory, allowing a `RUN` instruction in a Container file to mount an
arbitrary directory from the host (read/write) into the container as long
as those files can be accessed by the user running Buildah.

References:
https://nvd.nist.gov/vuln/detail/CVE-2024-9675
https://security-tracker.debian.org/tracker/CVE-2024-9675

Upstream-patch:
https://github.com/containers/buildah/commit/cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93

Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
---
 .../buildah/buildah/CVE-2024-9675.patch       | 113 ++++++++++++++++++
 recipes-containers/buildah/buildah_git.bb     |   1 +
 2 files changed, 114 insertions(+)
 create mode 100644 recipes-containers/buildah/buildah/CVE-2024-9675.patch

diff --git a/recipes-containers/buildah/buildah/CVE-2024-9675.patch b/recipes-containers/buildah/buildah/CVE-2024-9675.patch
new file mode 100644
index 00000000..6a655366
--- /dev/null
+++ b/recipes-containers/buildah/buildah/CVE-2024-9675.patch
@@ -0,0 +1,113 @@
+From cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93 Mon Sep 17 00:00:00 2001
+From: Matt Heon <mheon@redhat.com>
+Date: Wed, 9 Oct 2024 15:23:03 -0400
+Subject: [PATCH] Properly validate cache IDs and sources
+
+The `--mount type=cache` argument to the `RUN` instruction in
+Dockerfiles was using `filepath.Join` on user input, allowing
+crafted paths to be used to gain access to paths on the host,
+when the command should normally be limited only to Buildah;s own
+cache and context directories. Switch to `filepath.SecureJoin` to
+resolve the issue.
+
+Fixes CVE-2024-9675
+
+CVE: CVE-2024-9675
+
+Upstream-Status: Backport [https://github.com/containers/buildah/commit/cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93]
+
+Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
+---
+ internal/volumes/volumes.go | 19 ++++++++++++++-----
+ tests/bud.bats              | 34 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+), 5 deletions(-)
+
+diff --git a/internal/volumes/volumes.go b/internal/volumes/volumes.go
+index c07c67ebe..c6d6e3545 100644
+--- a/internal/volumes/volumes.go
++++ b/internal/volumes/volumes.go
+@@ -23,6 +23,7 @@ import (
+	"github.com/containers/storage/pkg/idtools"
+	"github.com/containers/storage/pkg/lockfile"
+	"github.com/containers/storage/pkg/unshare"
++	digest "github.com/opencontainers/go-digest"
+	specs "github.com/opencontainers/runtime-spec/specs-go"
+	selinux "github.com/opencontainers/selinux/go-selinux"
+ )
+@@ -362,7 +363,11 @@ func GetCacheMount(args []string, store storage.Store, imageMountLabel string, a
+			return newMount, nil, fmt.Errorf("no stage found with name %s", fromStage)
+		}
+		// path should be /contextDir/specified path
+-		newMount.Source = filepath.Join(mountPoint, filepath.Clean(string(filepath.Separator)+newMount.Source))
++		evaluated, err := copier.Eval(mountPoint, string(filepath.Separator)+newMount.Source, copier.EvalOptions{})
++		if err != nil {
++			return newMount, nil, err
++		}
++		newMount.Source = evaluated
+	} else {
+		// we need to create cache on host if no image is being used
+
+@@ -379,11 +384,15 @@ func GetCacheMount(args []string, store storage.Store, imageMountLabel string, a
+		}
+
+		if id != "" {
+-			newMount.Source = filepath.Join(cacheParent, filepath.Clean(id))
+-			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, filepath.Clean(id))
++			// Don't let the user control where we place the directory.
++			dirID := digest.FromString(id).Encoded()[:16]
++			newMount.Source = filepath.Join(cacheParent, dirID)
++			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, dirID)
+		} else {
+-			newMount.Source = filepath.Join(cacheParent, filepath.Clean(newMount.Destination))
+-			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, filepath.Clean(newMount.Destination))
++			// Don't let the user control where we place the directory.
++			dirID := digest.FromString(newMount.Destination).Encoded()[:16]
++			newMount.Source = filepath.Join(cacheParent, dirID)
++			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, dirID)
+		}
+		idPair := idtools.IDPair{
+			UID: uid,
+diff --git a/tests/bud.bats b/tests/bud.bats
+index 3a1dbd63a..9e3930f52 100644
+--- a/tests/bud.bats
++++ b/tests/bud.bats
+@@ -6648,3 +6648,37 @@ _EOF
+   assert "$status" -eq 2 "exit code from ls"
+   expect_output --substring "No such file or directory"
+ }
++
++@test "build-check-cve-2024-9675" {
++  _prefetch alpine
++
++  touch ${TEST_SCRATCH_DIR}/file.txt
++
++  cat > ${TEST_SCRATCH_DIR}/Containerfile <<EOF
++FROM alpine
++RUN --mount=type=cache,id=../../../../../../../../../../../$TEST_SCRATCH_DIR,target=/var/tmp \
++ls -l /var/tmp && cat /var/tmp/file.txt
++EOF
++
++  run_buildah 1 build --no-cache ${TEST_SCRATCH_DIR}
++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
++
++  cat > ${TEST_SCRATCH_DIR}/Containerfile <<EOF
++FROM alpine
++RUN --mount=type=cache,source=../../../../../../../../../../../$TEST_SCRATCH_DIR,target=/var/tmp \
++ls -l /var/tmp && cat /var/tmp/file.txt
++EOF
++
++  run_buildah 1 build --no-cache ${TEST_SCRATCH_DIR}
++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
++
++  mkdir ${TEST_SCRATCH_DIR}/cve20249675
++  cat > ${TEST_SCRATCH_DIR}/cve20249675/Containerfile <<EOF
++FROM alpine
++RUN --mount=type=cache,from=testbuild,source=../,target=/var/tmp \
++ls -l /var/tmp && cat /var/tmp/file.txt
++EOF
++
++  run_buildah 1 build --security-opt label=disable --build-context testbuild=${TEST_SCRATCH_DIR}/cve20249675/ --no-cache ${TEST_SCRATCH_DIR}/cve20249675/
++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
++}
+--
+2.40.0
diff --git a/recipes-containers/buildah/buildah_git.bb b/recipes-containers/buildah/buildah_git.bb
index 288a1cb0..83d861cb 100644
--- a/recipes-containers/buildah/buildah_git.bb
+++ b/recipes-containers/buildah/buildah_git.bb
@@ -34,6 +34,7 @@ SRCREV_storage = "246ba3062e8b551026aef2708eee747014ce5c52"
 SRC_URI = " \
     git://github.com/containers/buildah;branch=release-1.34;name=buildah;protocol=https \
     file://0001-Use-securejoin.SecureJoin-when-forming-userns-paths.patch;patchdir=src/github.com/containers/buildah/vendor/github.com/containers/storage \
+    file://CVE-2024-9675.patch;patchdir=src/github.com/containers/buildah \
     "
 
 DEPENDS = "libdevmapper btrfs-tools gpgme"
-- 
2.40.0



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [meta-virtualization][scarthgap][PATCH 1/1] buildah: Fix CVE-2024-9675
  2025-04-14 13:29 [meta-virtualization][scarthgap][PATCH 1/1] buildah: Fix CVE-2024-9675 Praveen Kumar
@ 2025-04-19 22:48 ` Bruce Ashfield
  0 siblings, 0 replies; 2+ messages in thread
From: Bruce Ashfield @ 2025-04-19 22:48 UTC (permalink / raw)
  To: praveen.kumar; +Cc: meta-virtualization

merged.

Bruce

In message: [meta-virtualization][scarthgap][PATCH 1/1] buildah: Fix CVE-2024-9675
on 14/04/2025 Praveen Kumar via lists.yoctoproject.org wrote:

> A vulnerability was found in Buildah. Cache mounts do not properly
> validate that user-specified paths for the cache are within our cache
> directory, allowing a `RUN` instruction in a Container file to mount an
> arbitrary directory from the host (read/write) into the container as long
> as those files can be accessed by the user running Buildah.
> 
> References:
> https://nvd.nist.gov/vuln/detail/CVE-2024-9675
> https://security-tracker.debian.org/tracker/CVE-2024-9675
> 
> Upstream-patch:
> https://github.com/containers/buildah/commit/cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93
> 
> Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
> ---
>  .../buildah/buildah/CVE-2024-9675.patch       | 113 ++++++++++++++++++
>  recipes-containers/buildah/buildah_git.bb     |   1 +
>  2 files changed, 114 insertions(+)
>  create mode 100644 recipes-containers/buildah/buildah/CVE-2024-9675.patch
> 
> diff --git a/recipes-containers/buildah/buildah/CVE-2024-9675.patch b/recipes-containers/buildah/buildah/CVE-2024-9675.patch
> new file mode 100644
> index 00000000..6a655366
> --- /dev/null
> +++ b/recipes-containers/buildah/buildah/CVE-2024-9675.patch
> @@ -0,0 +1,113 @@
> +From cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93 Mon Sep 17 00:00:00 2001
> +From: Matt Heon <mheon@redhat.com>
> +Date: Wed, 9 Oct 2024 15:23:03 -0400
> +Subject: [PATCH] Properly validate cache IDs and sources
> +
> +The `--mount type=cache` argument to the `RUN` instruction in
> +Dockerfiles was using `filepath.Join` on user input, allowing
> +crafted paths to be used to gain access to paths on the host,
> +when the command should normally be limited only to Buildah;s own
> +cache and context directories. Switch to `filepath.SecureJoin` to
> +resolve the issue.
> +
> +Fixes CVE-2024-9675
> +
> +CVE: CVE-2024-9675
> +
> +Upstream-Status: Backport [https://github.com/containers/buildah/commit/cffa820dc8be07efdb7fc4e8e8b9ff44c70aaf93]
> +
> +Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
> +---
> + internal/volumes/volumes.go | 19 ++++++++++++++-----
> + tests/bud.bats              | 34 ++++++++++++++++++++++++++++++++++
> + 2 files changed, 48 insertions(+), 5 deletions(-)
> +
> +diff --git a/internal/volumes/volumes.go b/internal/volumes/volumes.go
> +index c07c67ebe..c6d6e3545 100644
> +--- a/internal/volumes/volumes.go
> ++++ b/internal/volumes/volumes.go
> +@@ -23,6 +23,7 @@ import (
> +	"github.com/containers/storage/pkg/idtools"
> +	"github.com/containers/storage/pkg/lockfile"
> +	"github.com/containers/storage/pkg/unshare"
> ++	digest "github.com/opencontainers/go-digest"
> +	specs "github.com/opencontainers/runtime-spec/specs-go"
> +	selinux "github.com/opencontainers/selinux/go-selinux"
> + )
> +@@ -362,7 +363,11 @@ func GetCacheMount(args []string, store storage.Store, imageMountLabel string, a
> +			return newMount, nil, fmt.Errorf("no stage found with name %s", fromStage)
> +		}
> +		// path should be /contextDir/specified path
> +-		newMount.Source = filepath.Join(mountPoint, filepath.Clean(string(filepath.Separator)+newMount.Source))
> ++		evaluated, err := copier.Eval(mountPoint, string(filepath.Separator)+newMount.Source, copier.EvalOptions{})
> ++		if err != nil {
> ++			return newMount, nil, err
> ++		}
> ++		newMount.Source = evaluated
> +	} else {
> +		// we need to create cache on host if no image is being used
> +
> +@@ -379,11 +384,15 @@ func GetCacheMount(args []string, store storage.Store, imageMountLabel string, a
> +		}
> +
> +		if id != "" {
> +-			newMount.Source = filepath.Join(cacheParent, filepath.Clean(id))
> +-			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, filepath.Clean(id))
> ++			// Don't let the user control where we place the directory.
> ++			dirID := digest.FromString(id).Encoded()[:16]
> ++			newMount.Source = filepath.Join(cacheParent, dirID)
> ++			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, dirID)
> +		} else {
> +-			newMount.Source = filepath.Join(cacheParent, filepath.Clean(newMount.Destination))
> +-			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, filepath.Clean(newMount.Destination))
> ++			// Don't let the user control where we place the directory.
> ++			dirID := digest.FromString(newMount.Destination).Encoded()[:16]
> ++			newMount.Source = filepath.Join(cacheParent, dirID)
> ++			buildahLockFilesDir = filepath.Join(BuildahCacheLockfileDir, dirID)
> +		}
> +		idPair := idtools.IDPair{
> +			UID: uid,
> +diff --git a/tests/bud.bats b/tests/bud.bats
> +index 3a1dbd63a..9e3930f52 100644
> +--- a/tests/bud.bats
> ++++ b/tests/bud.bats
> +@@ -6648,3 +6648,37 @@ _EOF
> +   assert "$status" -eq 2 "exit code from ls"
> +   expect_output --substring "No such file or directory"
> + }
> ++
> ++@test "build-check-cve-2024-9675" {
> ++  _prefetch alpine
> ++
> ++  touch ${TEST_SCRATCH_DIR}/file.txt
> ++
> ++  cat > ${TEST_SCRATCH_DIR}/Containerfile <<EOF
> ++FROM alpine
> ++RUN --mount=type=cache,id=../../../../../../../../../../../$TEST_SCRATCH_DIR,target=/var/tmp \
> ++ls -l /var/tmp && cat /var/tmp/file.txt
> ++EOF
> ++
> ++  run_buildah 1 build --no-cache ${TEST_SCRATCH_DIR}
> ++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
> ++
> ++  cat > ${TEST_SCRATCH_DIR}/Containerfile <<EOF
> ++FROM alpine
> ++RUN --mount=type=cache,source=../../../../../../../../../../../$TEST_SCRATCH_DIR,target=/var/tmp \
> ++ls -l /var/tmp && cat /var/tmp/file.txt
> ++EOF
> ++
> ++  run_buildah 1 build --no-cache ${TEST_SCRATCH_DIR}
> ++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
> ++
> ++  mkdir ${TEST_SCRATCH_DIR}/cve20249675
> ++  cat > ${TEST_SCRATCH_DIR}/cve20249675/Containerfile <<EOF
> ++FROM alpine
> ++RUN --mount=type=cache,from=testbuild,source=../,target=/var/tmp \
> ++ls -l /var/tmp && cat /var/tmp/file.txt
> ++EOF
> ++
> ++  run_buildah 1 build --security-opt label=disable --build-context testbuild=${TEST_SCRATCH_DIR}/cve20249675/ --no-cache ${TEST_SCRATCH_DIR}/cve20249675/
> ++  expect_output --substring "cat: can't open '/var/tmp/file.txt': No such file or directory"
> ++}
> +--
> +2.40.0
> diff --git a/recipes-containers/buildah/buildah_git.bb b/recipes-containers/buildah/buildah_git.bb
> index 288a1cb0..83d861cb 100644
> --- a/recipes-containers/buildah/buildah_git.bb
> +++ b/recipes-containers/buildah/buildah_git.bb
> @@ -34,6 +34,7 @@ SRCREV_storage = "246ba3062e8b551026aef2708eee747014ce5c52"
>  SRC_URI = " \
>      git://github.com/containers/buildah;branch=release-1.34;name=buildah;protocol=https \
>      file://0001-Use-securejoin.SecureJoin-when-forming-userns-paths.patch;patchdir=src/github.com/containers/buildah/vendor/github.com/containers/storage \
> +    file://CVE-2024-9675.patch;patchdir=src/github.com/containers/buildah \
>      "
>  
>  DEPENDS = "libdevmapper btrfs-tools gpgme"
> -- 
> 2.40.0
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#9221): https://lists.yoctoproject.org/g/meta-virtualization/message/9221
> Mute This Topic: https://lists.yoctoproject.org/mt/112256810/1050810
> Group Owner: meta-virtualization+owner@lists.yoctoproject.org
> Unsubscribe: https://lists.yoctoproject.org/g/meta-virtualization/unsub [bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
> 



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-04-19 22:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-14 13:29 [meta-virtualization][scarthgap][PATCH 1/1] buildah: Fix CVE-2024-9675 Praveen Kumar
2025-04-19 22:48 ` Bruce Ashfield

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.