Skip to content

Commit 44e52c4

Browse files
Merge pull request from GHSA-g687-f2gx-6wm8
* feat: use untar with limiter Signed-off-by: pashakostohrys <pavel@codefresh.io> * feat: use untar with limiter Signed-off-by: pashakostohrys <pavel@codefresh.io> --------- Signed-off-by: pashakostohrys <pavel@codefresh.io>
1 parent 4b55084 commit 44e52c4

File tree

12 files changed

+115
-11
lines changed

12 files changed

+115
-11
lines changed

cmd/argocd-repo-server/commands/argocd_repo_server.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ func NewCommand() *cobra.Command {
8282
allowOutOfBoundsSymlinks bool
8383
streamedManifestMaxTarSize string
8484
streamedManifestMaxExtractedSize string
85+
helmManifestMaxExtractedSize string
86+
disableManifestMaxExtractedSize bool
8587
)
8688
var command = cobra.Command{
8789
Use: cliName,
@@ -120,6 +122,9 @@ func NewCommand() *cobra.Command {
120122
streamedManifestMaxExtractedSizeQuantity, err := resource.ParseQuantity(streamedManifestMaxExtractedSize)
121123
errors.CheckError(err)
122124

125+
helmManifestMaxExtractedSizeQuantity, err := resource.ParseQuantity(helmManifestMaxExtractedSize)
126+
errors.CheckError(err)
127+
123128
askPassServer := askpass.NewServer()
124129
metricsServer := metrics.NewMetricsServer()
125130
cacheutil.CollectMetrics(redisClient, metricsServer)
@@ -134,6 +139,7 @@ func NewCommand() *cobra.Command {
134139
AllowOutOfBoundsSymlinks: allowOutOfBoundsSymlinks,
135140
StreamedManifestMaxExtractedSize: streamedManifestMaxExtractedSizeQuantity.ToDec().Value(),
136141
StreamedManifestMaxTarSize: streamedManifestMaxTarSizeQuantity.ToDec().Value(),
142+
HelmManifestMaxExtractedSize: helmManifestMaxExtractedSizeQuantity.ToDec().Value(),
137143
}, askPassServer)
138144
errors.CheckError(err)
139145

@@ -216,6 +222,8 @@ func NewCommand() *cobra.Command {
216222
command.Flags().BoolVar(&allowOutOfBoundsSymlinks, "allow-oob-symlinks", env.ParseBoolFromEnv("ARGOCD_REPO_SERVER_ALLOW_OUT_OF_BOUNDS_SYMLINKS", false), "Allow out-of-bounds symlinks in repositories (not recommended)")
217223
command.Flags().StringVar(&streamedManifestMaxTarSize, "streamed-manifest-max-tar-size", env.StringFromEnv("ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_TAR_SIZE", "100M"), "Maximum size of streamed manifest archives")
218224
command.Flags().StringVar(&streamedManifestMaxExtractedSize, "streamed-manifest-max-extracted-size", env.StringFromEnv("ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_EXTRACTED_SIZE", "1G"), "Maximum size of streamed manifest archives when extracted")
225+
command.Flags().StringVar(&helmManifestMaxExtractedSize, "helm-manifest-max-extracted-size", env.StringFromEnv("ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE", "1G"), "Maximum size of helm manifest archives when extracted")
226+
command.Flags().BoolVar(&disableManifestMaxExtractedSize, "disable-helm-manifest-max-extracted-size", env.ParseBoolFromEnv("ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE", false), "Disable maximum size of helm manifest archives when extracted")
219227
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(&command)
220228
cacheSrc = reposervercache.AddCacheFlagsToCmd(&command, func(client *redis.Client) {
221229
redisClient = client

docs/operator-manual/server-commands/argocd-repo-server.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ argocd-repo-server [flags]
1616
--address string Listen on given address for incoming connections (default "0.0.0.0")
1717
--allow-oob-symlinks Allow out-of-bounds symlinks in repositories (not recommended)
1818
--default-cache-expiration duration Cache expiration default (default 24h0m0s)
19+
--disable-helm-manifest-max-extracted-size Disable maximum size of helm manifest archives when extracted
1920
--disable-tls Disable TLS on the gRPC endpoint
21+
--helm-manifest-max-extracted-size string Maximum size of helm manifest archives when extracted (default "1G")
2022
-h, --help help for argocd-repo-server
2123
--logformat string Set the logging format. One of: text|json (default "text")
2224
--loglevel string Set the logging level. One of: debug|info|warn|error (default "info")

manifests/base/repo-server/argocd-repo-server-deployment.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,18 @@ spec:
150150
key: reposerver.streamed.manifest.max.extracted.size
151151
name: argocd-cmd-params-cm
152152
optional: true
153+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
154+
valueFrom:
155+
configMapKeyRef:
156+
key: reposerver.helm.manifest.max.extracted.size
157+
name: argocd-cmd-params-cm
158+
optional: true
159+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
160+
valueFrom:
161+
configMapKeyRef:
162+
name: argocd-cmd-params-cm
163+
key: reposerver.disable.helm.manifest.max.extracted.size
164+
optional: true
153165
- name: ARGOCD_GIT_MODULES_ENABLED
154166
valueFrom:
155167
configMapKeyRef:

manifests/core-install.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19156,6 +19156,18 @@ spec:
1915619156
key: reposerver.streamed.manifest.max.extracted.size
1915719157
name: argocd-cmd-params-cm
1915819158
optional: true
19159+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
19160+
valueFrom:
19161+
configMapKeyRef:
19162+
key: reposerver.helm.manifest.max.extracted.size
19163+
name: argocd-cmd-params-cm
19164+
optional: true
19165+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
19166+
valueFrom:
19167+
configMapKeyRef:
19168+
key: reposerver.disable.helm.manifest.max.extracted.size
19169+
name: argocd-cmd-params-cm
19170+
optional: true
1915919171
- name: ARGOCD_GIT_MODULES_ENABLED
1916019172
valueFrom:
1916119173
configMapKeyRef:

manifests/ha/install.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20612,6 +20612,18 @@ spec:
2061220612
key: reposerver.streamed.manifest.max.extracted.size
2061320613
name: argocd-cmd-params-cm
2061420614
optional: true
20615+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
20616+
valueFrom:
20617+
configMapKeyRef:
20618+
key: reposerver.helm.manifest.max.extracted.size
20619+
name: argocd-cmd-params-cm
20620+
optional: true
20621+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
20622+
valueFrom:
20623+
configMapKeyRef:
20624+
key: reposerver.disable.helm.manifest.max.extracted.size
20625+
name: argocd-cmd-params-cm
20626+
optional: true
2061520627
- name: ARGOCD_GIT_MODULES_ENABLED
2061620628
valueFrom:
2061720629
configMapKeyRef:

manifests/ha/namespace-install.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,6 +2130,18 @@ spec:
21302130
key: reposerver.streamed.manifest.max.extracted.size
21312131
name: argocd-cmd-params-cm
21322132
optional: true
2133+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
2134+
valueFrom:
2135+
configMapKeyRef:
2136+
key: reposerver.helm.manifest.max.extracted.size
2137+
name: argocd-cmd-params-cm
2138+
optional: true
2139+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
2140+
valueFrom:
2141+
configMapKeyRef:
2142+
key: reposerver.disable.helm.manifest.max.extracted.size
2143+
name: argocd-cmd-params-cm
2144+
optional: true
21332145
- name: ARGOCD_GIT_MODULES_ENABLED
21342146
valueFrom:
21352147
configMapKeyRef:

manifests/install.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19669,6 +19669,18 @@ spec:
1966919669
key: reposerver.streamed.manifest.max.extracted.size
1967019670
name: argocd-cmd-params-cm
1967119671
optional: true
19672+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
19673+
valueFrom:
19674+
configMapKeyRef:
19675+
key: reposerver.helm.manifest.max.extracted.size
19676+
name: argocd-cmd-params-cm
19677+
optional: true
19678+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
19679+
valueFrom:
19680+
configMapKeyRef:
19681+
key: reposerver.disable.helm.manifest.max.extracted.size
19682+
name: argocd-cmd-params-cm
19683+
optional: true
1967219684
- name: ARGOCD_GIT_MODULES_ENABLED
1967319685
valueFrom:
1967419686
configMapKeyRef:

manifests/namespace-install.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,18 @@ spec:
11871187
key: reposerver.streamed.manifest.max.extracted.size
11881188
name: argocd-cmd-params-cm
11891189
optional: true
1190+
- name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE
1191+
valueFrom:
1192+
configMapKeyRef:
1193+
key: reposerver.helm.manifest.max.extracted.size
1194+
name: argocd-cmd-params-cm
1195+
optional: true
1196+
- name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE
1197+
valueFrom:
1198+
configMapKeyRef:
1199+
key: reposerver.disable.helm.manifest.max.extracted.size
1200+
name: argocd-cmd-params-cm
1201+
optional: true
11901202
- name: ARGOCD_GIT_MODULES_ENABLED
11911203
valueFrom:
11921204
configMapKeyRef:

reposerver/repository/repository.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ type RepoServerInitConstants struct {
107107
AllowOutOfBoundsSymlinks bool
108108
StreamedManifestMaxExtractedSize int64
109109
StreamedManifestMaxTarSize int64
110+
HelmManifestMaxExtractedSize int64
111+
DisableHelmManifestMaxExtractedSize bool
110112
}
111113

112114
// NewService returns a new instance of the Manifest service
@@ -346,7 +348,7 @@ func (s *Service) runRepoOperation(
346348
if source.Helm != nil {
347349
helmPassCredentials = source.Helm.PassCredentials
348350
}
349-
chartPath, closer, err := helmClient.ExtractChart(source.Chart, revision, helmPassCredentials)
351+
chartPath, closer, err := helmClient.ExtractChart(source.Chart, revision, helmPassCredentials, s.initConstants.HelmManifestMaxExtractedSize, s.initConstants.DisableHelmManifestMaxExtractedSize)
350352
if err != nil {
351353
return err
352354
}
@@ -2233,7 +2235,7 @@ func (s *Service) GetRevisionChartDetails(ctx context.Context, q *apiclient.Repo
22332235
if err != nil {
22342236
return nil, fmt.Errorf("helm client error: %v", err)
22352237
}
2236-
chartPath, closer, err := helmClient.ExtractChart(q.Name, revision, false)
2238+
chartPath, closer, err := helmClient.ExtractChart(q.Name, revision, false, s.initConstants.HelmManifestMaxExtractedSize, s.initConstants.DisableHelmManifestMaxExtractedSize)
22372239
if err != nil {
22382240
return nil, fmt.Errorf("error extracting chart: %v", err)
22392241
}

util/helm/client.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
"errors"
1010
"fmt"
11+
executil "github.com/argoproj/argo-cd/v2/util/exec"
1112
"io"
1213
"net/http"
1314
"net/url"
@@ -25,7 +26,6 @@ import (
2526
"oras.land/oras-go/v2/registry/remote/auth"
2627

2728
"github.com/argoproj/argo-cd/v2/util/cache"
28-
executil "github.com/argoproj/argo-cd/v2/util/exec"
2929
argoio "github.com/argoproj/argo-cd/v2/util/io"
3030
"github.com/argoproj/argo-cd/v2/util/io/files"
3131
"github.com/argoproj/argo-cd/v2/util/proxy"
@@ -52,7 +52,7 @@ type indexCache interface {
5252

5353
type Client interface {
5454
CleanChartCache(chart string, version string) error
55-
ExtractChart(chart string, version string, passCredentials bool) (string, argoio.Closer, error)
55+
ExtractChart(chart string, version string, passCredentials bool, manifestMaxExtractedSize int64, disableManifestMaxExtractedSize bool) (string, argoio.Closer, error)
5656
GetIndex(noCache bool) (*Index, error)
5757
GetTags(chart string, noCache bool) (*TagsList, error)
5858
TestHelmOCI() (bool, error)
@@ -122,7 +122,21 @@ func (c *nativeHelmChart) CleanChartCache(chart string, version string) error {
122122
return os.RemoveAll(cachePath)
123123
}
124124

125-
func (c *nativeHelmChart) ExtractChart(chart string, version string, passCredentials bool) (string, argoio.Closer, error) {
125+
func untarChart(tempDir string, cachedChartPath string, manifestMaxExtractedSize int64, disableManifestMaxExtractedSize bool) error {
126+
if disableManifestMaxExtractedSize {
127+
cmd := exec.Command("tar", "-zxvf", cachedChartPath)
128+
cmd.Dir = tempDir
129+
_, err := executil.Run(cmd)
130+
return err
131+
}
132+
reader, err := os.Open(cachedChartPath)
133+
if err != nil {
134+
return err
135+
}
136+
return files.Untgz(tempDir, reader, manifestMaxExtractedSize, false)
137+
}
138+
139+
func (c *nativeHelmChart) ExtractChart(chart string, version string, passCredentials bool, manifestMaxExtractedSize int64, disableManifestMaxExtractedSize bool) (string, argoio.Closer, error) {
126140
// always use Helm V3 since we don't have chart content to determine correct Helm version
127141
helmCmd, err := NewCmdWithVersion("", HelmV3, c.enableOci, c.proxy)
128142

@@ -196,15 +210,14 @@ func (c *nativeHelmChart) ExtractChart(chart string, version string, passCredent
196210
if len(infos) != 1 {
197211
return "", nil, fmt.Errorf("expected 1 file, found %v", len(infos))
198212
}
213+
199214
err = os.Rename(filepath.Join(tempDest, infos[0].Name()), cachedChartPath)
200215
if err != nil {
201216
return "", nil, err
202217
}
203218
}
204219

205-
cmd := exec.Command("tar", "-zxvf", cachedChartPath)
206-
cmd.Dir = tempDir
207-
_, err = executil.Run(cmd)
220+
err = untarChart(tempDir, cachedChartPath, manifestMaxExtractedSize, disableManifestMaxExtractedSize)
208221
if err != nil {
209222
_ = os.RemoveAll(tempDir)
210223
return "", nil, err

0 commit comments

Comments
 (0)