Skip to content

Commit ef0d0dc

Browse files
1 parent a80c301 commit ef0d0dc

4 files changed

Lines changed: 313 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-hxm7-9q36-c77f",
4+
"modified": "2026-03-16T20:47:15Z",
5+
"published": "2026-03-16T20:47:15Z",
6+
"aliases": [],
7+
"summary": "Fullchain's Invalid NetworkPolicy enables a malicious actor to pivot into another namespace",
8+
"details": "### Impact\n\nDue to a mis-written NetworkPolicy, a malicious actor can pivot from a subverted application to any Pod out of the origin namespace.\nThis breaks the security-by-default property expected as part of the deployment program, leading to a potential lateral movement.\n\n### Patch\n\nRemoving the `inter-ns` NetworkPolicy patches the vulnerability. If updates are not possible in production environments, we recommend to manually delete it and update as soon as possible.\n\n### Workaround\n\nGiven your context, delete the failing network policy that should be prefixed by `inter-ns-` in the target namespace.\nYou can use the following to delete all matching network policy. If unsure of the outcome, please do it manually.\n\n```bash\nfor ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\\n' | grep '^ns-'); do\n kubectl -n \"$ns\" get networkpolicy -o name \\\n | grep '^networkpolicy.networking.k8s.io/inter-ns-' \\\n | xargs -r kubectl -n \"$ns\" delete\ndone\n```",
9+
"severity": [
10+
{
11+
"type": "CVSS_V4",
12+
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:H"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "Go",
19+
"name": "github.com/ctfer-io/fullchain"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "0"
27+
},
28+
{
29+
"fixed": "0.1.1"
30+
}
31+
]
32+
}
33+
]
34+
}
35+
],
36+
"references": [
37+
{
38+
"type": "WEB",
39+
"url": "https://github.com/ctfer-io/fullchain/security/advisories/GHSA-hxm7-9q36-c77f"
40+
},
41+
{
42+
"type": "WEB",
43+
"url": "https://github.com/ctfer-io/fullchain/commit/dbcb90178bcb07a3f5a1efa4c6350f3a6ce34f51"
44+
},
45+
{
46+
"type": "PACKAGE",
47+
"url": "https://github.com/ctfer-io/fullchain"
48+
},
49+
{
50+
"type": "WEB",
51+
"url": "https://github.com/ctfer-io/fullchain/releases/tag/v0.1.1"
52+
}
53+
],
54+
"database_specific": {
55+
"cwe_ids": [
56+
"CWE-284"
57+
],
58+
"severity": "HIGH",
59+
"github_reviewed": true,
60+
"github_reviewed_at": "2026-03-16T20:47:15Z",
61+
"nvd_published_at": null
62+
}
63+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-j94x-8wcp-x7hm",
4+
"modified": "2026-03-16T20:47:47Z",
5+
"published": "2026-03-16T20:47:47Z",
6+
"aliases": [],
7+
"summary": "Kargo Vulnerable to SSRF in Promotion http/http-download Steps Enables Internal Network Access and Data Exfiltration",
8+
"details": "## Summary\n\nKargo's built-in `http` and `http-download` promotion steps execute outbound HTTP requests from the Kargo controller. By design, these steps do not restrict destination addresses, as there are legitimate use cases for requests to internal and private endpoints. However, this also permits requests to link-local addresses, for which there are no known, legitimate use cases. Of particular concern is the cloud instance metadata endpoint (often `169.254.169.254`), which is unauthenticated and can expose sensitive configuration data including IAM credentials. While cloud providers typically implement header-based SSRF mitigations for these endpoints, the `http` step provides full control over request method and headers, rendering these protections ineffective. The `http-download` step provides control over headers only (not method), but this is still sufficient for exfiltrating data from metadata endpoints.\n\nThere are two vectors for exploitation. A user with permission to create or update a Stage can configure its promotion template to include malicious `http` or `http-download` steps. Alternatively, a user with `promote` permission on any Stage can craft a Promotion resource directly. In either case, the controller executes the steps in-cluster, and response data can be inserted into Promotion status fields, written to a Git repository, or sent to a remote location using a second instance of the `http` step.\n\nThe remediation for this issue is the introduction of a safe HTTP transport that refuses to dial link-local addresses. Requests to private and internal addresses will continue to be permitted, as this is by design. It is the responsibility of services at such addresses to implement proper authentication and authorization, and/or the responsibility of platform teams to define and enforce network policies that restrict traffic appropriately.\n\n## Base Metrics\n\nThe following sections provide the rationale for the values selected for each of CVSS v4's base metrics.\n\n### Attack Vector (AV): Network\n\nThe Kargo API server is accessible over HTTP/HTTPS. No local, adjacent network, or physical access is required.\n\n### Attack Complexity (AC): Low\n\nExploitation requires only a crafted Promotion manifest submitted via the Kargo API. No race conditions, non-default configurations, or prior information gathering is required.\n\n### Attack Requirements (AT): None\n\nNo specific environmental conditions are required beyond a standard Kargo deployment. The `http` and `http-download` built-in steps are always available.\n\n### Privileges Required (PR): High\n\nThe attacker must be authenticated to the Kargo API server and hold permissions sufficient to create or update a Stage, or to craft a Promotion resource directly. Although these may not be considered administrative permissions, they are non-trivial, not granted broadly by default, and must be explicitly assigned by a project administrator.\n\n### User Interaction (UI): None\n\nThe attack is fully automated via API calls. No other user needs to take any action. The controller processes the malicious Promotion without human intervention.\n\n### Confidentiality Impact to Vulnerable System (VC): None\n\nKargo itself does not expose its own secrets or configuration data through this vulnerability. The impact is to other systems reachable from the controller's network position, not to Kargo's own data.\n\n### Integrity Impact to Vulnerable System (VI): None\n\nKargo's own data and configuration are not modified by this vulnerability. While malicious Promotion resources are created, they function within Kargo's normal processing pipeline.\n\n### Availability Impact to Vulnerable System (VA): None\n\nThis vulnerability does not enable denial of service against Kargo. Each Promotion executes a bounded set of HTTP requests and does not consume disproportionate resources.\n\n### Confidentiality Impact to Subsequent Systems (SC): Low\n\nThe controller runs in-cluster and can reach link-local addresses, including cloud instance metadata endpoints. These endpoints are unauthenticated and can expose sensitive data such as IAM credentials. Provider-side header-based SSRF mitigations are ineffective because these steps provide full control over request headers.\n\n### Integrity Impact to Subsequent Systems (SI): None\n\nCloud instance metadata endpoints are read-only. While the `http` step supports arbitrary HTTP methods, the only unintended access enabled by this vulnerability is to link-local addresses, and these do not accept state-changing requests.\n\n### Availability Impact to Subsequent Systems (SA): None\n\nA single HTTP request per promotion step does not constitute a meaningful denial-of-service vector against subsequent systems. There is no amplification mechanism.\n\n## Mitigating Factors\n\n- Exploitation requires authentication to the Kargo API server with permissions to create or update Stages, or to craft Promotion resources directly. These permissions must be explicitly granted by a project administrator.\n\n- All Promotion creation is audited. The creating user's identity is recorded in annotations and Kubernetes events, providing a clear forensic trail.\n\n- The practical impact is limited to cloud instance metadata endpoints. Access to private and internal addresses is by design, and services at those addresses are expected to implement their own authentication and authorization.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V4",
12+
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:N/VA:N/SC:L/SI:N/SA:N"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "Go",
19+
"name": "github.com/akuity/kargo"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "1.4.0"
27+
},
28+
{
29+
"fixed": "1.6.4"
30+
}
31+
]
32+
}
33+
]
34+
},
35+
{
36+
"package": {
37+
"ecosystem": "Go",
38+
"name": "github.com/akuity/kargo"
39+
},
40+
"ranges": [
41+
{
42+
"type": "ECOSYSTEM",
43+
"events": [
44+
{
45+
"introduced": "1.7.0-rc.1"
46+
},
47+
{
48+
"fixed": "1.7.9"
49+
}
50+
]
51+
}
52+
]
53+
},
54+
{
55+
"package": {
56+
"ecosystem": "Go",
57+
"name": "github.com/akuity/kargo"
58+
},
59+
"ranges": [
60+
{
61+
"type": "ECOSYSTEM",
62+
"events": [
63+
{
64+
"introduced": "1.8.0-rc.1"
65+
},
66+
{
67+
"fixed": "1.8.12"
68+
}
69+
]
70+
}
71+
]
72+
},
73+
{
74+
"package": {
75+
"ecosystem": "Go",
76+
"name": "github.com/akuity/kargo"
77+
},
78+
"ranges": [
79+
{
80+
"type": "ECOSYSTEM",
81+
"events": [
82+
{
83+
"introduced": "1.9.0-rc.1"
84+
},
85+
{
86+
"fixed": "1.9.5"
87+
}
88+
]
89+
}
90+
]
91+
}
92+
],
93+
"references": [
94+
{
95+
"type": "WEB",
96+
"url": "https://github.com/akuity/kargo/security/advisories/GHSA-j94x-8wcp-x7hm"
97+
},
98+
{
99+
"type": "PACKAGE",
100+
"url": "https://github.com/akuity/kargo"
101+
}
102+
],
103+
"database_specific": {
104+
"cwe_ids": [
105+
"CWE-918"
106+
],
107+
"severity": "MODERATE",
108+
"github_reviewed": true,
109+
"github_reviewed_at": "2026-03-16T20:47:47Z",
110+
"nvd_published_at": null
111+
}
112+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-p799-g7vv-f279",
4+
"modified": "2026-03-16T20:47:03Z",
5+
"published": "2026-03-16T20:47:02Z",
6+
"aliases": [],
7+
"summary": " Romeo is vulnerable to Archive Slip due to missing checks in sanitization",
8+
"details": "## Summary\n\nThe `sanitizeArchivePath` function in `webserver/api/v1/decoder.go` (lines 80-88) is vulnerable to a path traversal bypass due to a missing trailing path separator in the `strings.HasPrefix` check. A crafted tar archive can write files outside the intended destination directory.\n\n## Vulnerable Code\n\nFile: `webserver/api/v1/decoder.go`, lines 80-88\n\n```go\nfunc sanitizeArchivePath(d, t string) (v string, err error) {\n\tv = filepath.Join(d, t)\n\tif strings.HasPrefix(v, filepath.Clean(d)) {\n\t\treturn v, nil\n\t}\n\treturn \"\", &ErrPathTainted{\n\t\tPath: t,\n\t}\n}\n```\n\nThe function is called at line 48 inside `[*Decompressor].Unzip`, which is invoked by `Decode` (line 80) during execution of the webserver CLI (command `download`).\n\n## Root Cause\n\n`strings.HasPrefix(v, filepath.Clean(d))` does not append a trailing `/` to the directory prefix, causing a **directory name prefix collision**. If the destination is `/home/user/extract-output` and a tar entry is named `../extract-outputevil/pwned`, the joined path `/home/user/extract-outputevil/pwned` passes the prefix check — it starts with `/home/user/extract-output` — even though it is entirely outside the intended directory.\n\n## Steps to Reproduce\n\n1. **Deploy Romeo**. A measured app writes its coverage data.\n\n2. **Place the PoC zip on the PVC.** Any pod with write access to the `ReadWriteMany` PVC (or the webserver itself) copies a `poc-path-traversal.tar` into the `coverdir` mount path. The archive contains legitimate coverage files alongside two crafted entries with path-traversal names.\n\n3. **Run the webserver CLI against the running webserver:**\n ```\n webserver download \\\n --server http://localhost:8080 \\\n --directory /home/user/extract-output\n ```\n\n4. **Observe the bypass.** `unzip` processes the zip stream. For the malicious entries:\n ```\n // entry name: ../extract-outputevil/poc-proof.txt\n filepath.Join(\"/home/user/extract-output\", \"../extract-outputevil/poc-proof.txt\")\n => \"/home/user/extract-outputevil/poc-proof.txt\"\n\n strings.HasPrefix(\"/home/user/extract-outputevil/poc-proof.txt\",\n \"/home/user/extract-output\")\n => true // BUG: prefix collision; file lands OUTSIDE target dir\n ```\n Both malicious entries are written outside `/home/user/extract-output/`. The legitimate coverage files land correctly inside it.\n\n## Impact\n\nSuccessful exploitation gives an attacker arbitrary file write on the machine running the webserver CLI. Real-world primitives include:\n\n- Overwriting `~/.bashrc` / `~/.zshrc` / `~/.profile` for RCE on next shell login\n- Appending to `~/.ssh/authorized_keys` for persistent SSH backdoor\n- Dropping a malicious entry into `~/.kube/config` to hijack cluster access\n- Writing crontab entries for persistent scheduled execution\n\nThe attack surface is widened by the default `ReadWriteMany` PVC access mode, which means any pod in the cluster with the PVC mounted can inject the payload — not just the Romeo webserver itself.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V4",
12+
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:L/SA:L"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "Go",
19+
"name": "github.com/ctfer-io/romeo/webserver"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "0"
27+
},
28+
{
29+
"fixed": "0.2.2"
30+
}
31+
]
32+
}
33+
]
34+
}
35+
],
36+
"references": [
37+
{
38+
"type": "WEB",
39+
"url": "https://github.com/ctfer-io/romeo/security/advisories/GHSA-p799-g7vv-f279"
40+
},
41+
{
42+
"type": "WEB",
43+
"url": "https://github.com/ctfer-io/romeo/commit/c2ebcfb9f305fd5f6ef68858de82507dbac10263"
44+
},
45+
{
46+
"type": "PACKAGE",
47+
"url": "https://github.com/ctfer-io/romeo"
48+
}
49+
],
50+
"database_specific": {
51+
"cwe_ids": [
52+
"CWE-22"
53+
],
54+
"severity": "HIGH",
55+
"github_reviewed": true,
56+
"github_reviewed_at": "2026-03-16T20:47:02Z",
57+
"nvd_published_at": null
58+
}
59+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-vvp9-7p8x-rfvv",
4+
"modified": "2026-03-16T20:48:08Z",
5+
"published": "2026-03-16T20:48:08Z",
6+
"aliases": [],
7+
"summary": "lz4_flex's decompression can leak information from uninitialized memory or reused output buffer",
8+
"details": "### Summary\nDecompressing invalid LZ4 data can leak data from uninitialized memory, or can leak content from previous decompression operations when reusing an output buffer.\n\n### Details\nThe LZ4 block format defines a \"match copy operation\" which duplicates previously written data or data from the user-supplied dict. The position of that data is defined by an _offset_. The data is copied within the output buffer from the _offset_ to the current output position.\nHowever, lz4_flex did not properly detect invalid and out-of-bounds _offset_ values properly, causing it to copy uninitialized data from the output buffer.\n\nOnly the block based API functions are affected: \n`lz4_flex::block::{decompress_into, decompress_into_with_dict}`\n\nAll `frame` APIs are _not_ affected.\n\nThere are two affected use cases:\n- decompressing LZ4 data with the `unsafe` implementation (`safe-decode` feature flag disabled, which is enabled by default):\ncan leak content of uninitialized memory as decompressed result\n- decompressing LZ4 data into a reused, user-supplied `output` buffer (affects the `safe-decode` feature as well):\ncan leak the previous contents of the output buffer as decompressed result\n\n### Impact\nLeakage of data from uninitialized memory or content from previous decompression operations, possibly revealing sensitive information and secrets.\n\n### Mitigation\nlz4_flex 0.12.1 and 0.11.6 fixes this issue without requiring changes in user code.\n\nIf you cannot upgrade, you can mitigate this vulnerability by zeroing the output buffer before calling `block::decompress_into` or `block::decompress_into_with_dict` (only block based API is affected, frame API is not affected). Additionally the the `safe-decode` feature flag should be enabled.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V4",
12+
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "crates.io",
19+
"name": "lz4_flex"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "0"
27+
},
28+
{
29+
"fixed": "0.11.6"
30+
}
31+
]
32+
}
33+
]
34+
},
35+
{
36+
"package": {
37+
"ecosystem": "crates.io",
38+
"name": "lz4_flex"
39+
},
40+
"ranges": [
41+
{
42+
"type": "ECOSYSTEM",
43+
"events": [
44+
{
45+
"introduced": "0.12.0"
46+
},
47+
{
48+
"fixed": "0.12.1"
49+
}
50+
]
51+
}
52+
]
53+
}
54+
],
55+
"references": [
56+
{
57+
"type": "WEB",
58+
"url": "https://github.com/PSeitz/lz4_flex/security/advisories/GHSA-vvp9-7p8x-rfvv"
59+
},
60+
{
61+
"type": "WEB",
62+
"url": "https://github.com/PSeitz/lz4_flex/commit/055502ee5d297ecd6bf448ac91c055c7f6df9b6d"
63+
},
64+
{
65+
"type": "PACKAGE",
66+
"url": "https://github.com/PSeitz/lz4_flex"
67+
}
68+
],
69+
"database_specific": {
70+
"cwe_ids": [
71+
"CWE-201",
72+
"CWE-823"
73+
],
74+
"severity": "HIGH",
75+
"github_reviewed": true,
76+
"github_reviewed_at": "2026-03-16T20:48:08Z",
77+
"nvd_published_at": null
78+
}
79+
}

0 commit comments

Comments
 (0)