Skip to content

Commit bb69fbc

Browse files

File tree

5 files changed

+339
-40
lines changed

5 files changed

+339
-40
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-c267-rfvc-mvpm",
4+
"modified": "2026-03-18T20:20:39Z",
5+
"published": "2026-03-18T09:30:29Z",
6+
"aliases": [
7+
"CVE-2026-22730"
8+
],
9+
"summary": "SQL Injection in Spring AI MariaDBFilterExpressionConverter",
10+
"details": "A critical SQL injection vulnerability in Spring AI's MariaDBFilterExpressionConverter allows attackers to bypass metadata-based access controls and execute arbitrary SQL commands.\n\nThe vulnerability exists due to missing input sanitization.",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Maven",
21+
"name": "org.springframework.ai:spring-ai-mariadb-store"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "1.1.0-M1"
29+
},
30+
{
31+
"fixed": "1.1.3"
32+
}
33+
]
34+
}
35+
]
36+
},
37+
{
38+
"package": {
39+
"ecosystem": "Maven",
40+
"name": "org.springframework.ai:spring-ai-mariadb-store"
41+
},
42+
"ranges": [
43+
{
44+
"type": "ECOSYSTEM",
45+
"events": [
46+
{
47+
"introduced": "0"
48+
},
49+
{
50+
"fixed": "1.0.4"
51+
}
52+
]
53+
}
54+
]
55+
}
56+
],
57+
"references": [
58+
{
59+
"type": "ADVISORY",
60+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22730"
61+
},
62+
{
63+
"type": "PACKAGE",
64+
"url": "https://github.com/spring-projects/spring-ai"
65+
},
66+
{
67+
"type": "WEB",
68+
"url": "https://github.com/spring-projects/spring-ai/releases/tag/v1.0.4"
69+
},
70+
{
71+
"type": "WEB",
72+
"url": "https://github.com/spring-projects/spring-ai/releases/tag/v1.1.3"
73+
},
74+
{
75+
"type": "WEB",
76+
"url": "https://spring.io/security/cve-2026-22730"
77+
}
78+
],
79+
"database_specific": {
80+
"cwe_ids": [
81+
"CWE-89"
82+
],
83+
"severity": "HIGH",
84+
"github_reviewed": true,
85+
"github_reviewed_at": "2026-03-18T20:20:39Z",
86+
"nvd_published_at": "2026-03-18T08:16:31Z"
87+
}
88+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-g9f6-9775-hffm",
4+
"modified": "2026-03-18T20:21:37Z",
5+
"published": "2026-03-18T20:21:37Z",
6+
"aliases": [
7+
"CVE-2026-33221"
8+
],
9+
"summary": "Nhost Storage Affected by MIME Type Spoofing via Trusted Client Content-Type Header in Storage Upload",
10+
"details": "## Summary\n\nThe storage service's file upload handler trusts the client-provided `Content-Type` header without performing server-side MIME type detection. This allows an attacker to upload files with an arbitrary MIME type, bypassing any MIME-type-based restrictions configured on storage buckets.\n\n## Affected Component\n\n- **Service**: `services/storage`\n- **File**: `services/storage/controller/upload_files.go`\n- **Function**: `getMultipartFile` (lines 48-70)\n\n## Root Cause\n\nIn `getMultipartFile`, if the client provides a non-empty `Content-Type` header that isn't `application/octet-stream`, the function returns it as-is without performing content-based detection:\n\n```go\ncontentType := file.header.Header.Get(\"Content-Type\")\nif contentType != \"\" && contentType != \"application/octet-stream\" {\n return fileContent, contentType, nil // skip detection entirely\n}\n\n// mimetype.DetectReader only reached if client sends no Content-Type\n// or sends application/octet-stream\nmt, err := mimetype.DetectReader(fileContent)\n```\n\n## Impact\n\n**Incorrect MIME type in file metadata.** The MIME type stored in file metadata reflects what the client claims rather than what the file actually contains. Any system consuming this metadata (browsers, CDNs, applications) may handle the file incorrectly based on the spoofed type.\n\n## Suggested Fix\n\nAlways detect MIME type from file content using `mimetype.DetectReader`, ignoring the client-provided `Content-Type` header entirely.\n\n## References\n\n- CWE-345: Insufficient Verification of Data Authenticity\n- CWE-434: Unrestricted Upload of File with Dangerous Type",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:N/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Go",
21+
"name": "github.com/nhost/nhost"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "0.0.0-20260318074820-c4bd53f042d7"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/nhost/nhost/security/advisories/GHSA-g9f6-9775-hffm"
42+
},
43+
{
44+
"type": "WEB",
45+
"url": "https://github.com/nhost/nhost/commit/c4bd53f042d7f568e567e18e2665af81660fce85"
46+
},
47+
{
48+
"type": "PACKAGE",
49+
"url": "https://github.com/nhost/nhost"
50+
}
51+
],
52+
"database_specific": {
53+
"cwe_ids": [
54+
"CWE-345",
55+
"CWE-434"
56+
],
57+
"severity": "LOW",
58+
"github_reviewed": true,
59+
"github_reviewed_at": "2026-03-18T20:21:37Z",
60+
"nvd_published_at": null
61+
}
62+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-j5q5-j9gm-2w5c",
4+
"modified": "2026-03-18T20:20:10Z",
5+
"published": "2026-03-18T20:20:10Z",
6+
"aliases": [
7+
"CVE-2026-33211"
8+
],
9+
"summary": "Path traversal in Tekton Pipelines git resolver allows reading arbitrary files from the resolver pod",
10+
"details": "### Summary\n\nThe Tekton Pipelines git resolver is vulnerable to path traversal via the `pathInRepo` parameter. A tenant with permission to create `ResolutionRequests` (e.g. by creating `TaskRuns` or `PipelineRuns` that use the git resolver) can read arbitrary files from the resolver pod's filesystem, including ServiceAccount tokens. The file contents are returned base64-encoded in `resolutionrequest.status.data`.\n\n### Details\n\nThe git resolver's `getFileContent()` function in `pkg/resolution/resolver/git/repository.go` constructs a file path by joining the repository clone directory with the user-supplied `pathInRepo` parameter:\n\n```go\nfileContents, err := os.ReadFile(filepath.Join(repo.directory, path))\n```\n\nThe `pathInRepo` parameter is not validated for path traversal sequences. An attacker can supply values like `../../../../etc/passwd` to escape the cloned repository directory and read arbitrary files from the resolver pod's filesystem.\n\nThe vulnerability was introduced in commit `318006c4e3a5` which switched the git resolver from the go-git library (using an in-memory filesystem that cannot be escaped) to shelling out to the `git` binary and reading files with `os.ReadFile()` from the real filesystem.\n\n### Impact\n\n**Arbitrary file read** — A namespace-scoped tenant who can create `TaskRuns` or `PipelineRuns` with git resolver parameters can read any file readable by the resolver pod process.\n\n**Credential exfiltration and privilege escalation** — The resolver pod's ServiceAccount token is readable at a well-known path (`/var/run/secrets/kubernetes.io/serviceaccount/token`). In the default RBAC configuration, the `tekton-pipelines-resolvers` ServiceAccount has `get`, `list`, and `watch` permissions on `secrets` cluster-wide. An attacker who exfiltrates this token gains the ability to read all Secrets across all namespaces, escalating from namespace-scoped access to cluster-wide secret access.\n\n### Patches\n\nFixed in 1.0.x, 1.3.x, 1.6.x, 1.9.x, 1.10.x.\n\nThe fix validates `pathInRepo` to reject paths containing `..` components at parameter validation time, and adds a containment check using `filepath.EvalSymlinks()` to prevent symlink-based escapes from attacker-controlled repositories.\n\n### Workarounds\n\nThere is no workaround other than restricting which users can create `TaskRuns`, `PipelineRuns`, or `ResolutionRequests` that use the git resolver. Administrators can also reduce the impact by scoping the resolver pod's ServiceAccount RBAC permissions using a custom `ClusterRole` with more restrictive rules.\n\n### Affected Versions\n\nAll releases from **v1.0.0** through **v1.10.0**, including all patch releases:\n\n- v1.0.0, v1.1.0, v1.2.0\n- v1.3.0, v1.3.1, v1.3.2\n- v1.4.0, v1.5.0, v1.6.0, v1.7.0\n- v1.9.0, v1.9.1, v1.10.0\n\nReleases prior to v1.0.0 (e.g. v0.70.0 and earlier) are **not affected** because they used the go-git library's in-memory filesystem where path traversal cannot escape the git worktree.\n\n### Acknowledgments\n\nThis vulnerability was reported by Oleh Konko (@1seal), who provided a thorough vulnerability analysis, proof-of-concept, and review of the fix. Thank you!\n\n### References\n\n- Fix: _(link to merged PR/commit)_\n- Introduced in: `318006c4e3a5` (\"fix: resolve Git Anonymous Resolver excessive memory usage\")",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Go",
21+
"name": "github.com/tektoncd/pipeline"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "1.0.0"
29+
},
30+
{
31+
"fixed": "1.0.1"
32+
}
33+
]
34+
}
35+
]
36+
},
37+
{
38+
"package": {
39+
"ecosystem": "Go",
40+
"name": "github.com/tektoncd/pipeline"
41+
},
42+
"ranges": [
43+
{
44+
"type": "ECOSYSTEM",
45+
"events": [
46+
{
47+
"introduced": "1.1.0"
48+
},
49+
{
50+
"fixed": "1.3.3"
51+
}
52+
]
53+
}
54+
]
55+
},
56+
{
57+
"package": {
58+
"ecosystem": "Go",
59+
"name": "github.com/tektoncd/pipeline"
60+
},
61+
"ranges": [
62+
{
63+
"type": "ECOSYSTEM",
64+
"events": [
65+
{
66+
"introduced": "1.4.0"
67+
},
68+
{
69+
"fixed": "1.6.1"
70+
}
71+
]
72+
}
73+
]
74+
},
75+
{
76+
"package": {
77+
"ecosystem": "Go",
78+
"name": "github.com/tektoncd/pipeline"
79+
},
80+
"ranges": [
81+
{
82+
"type": "ECOSYSTEM",
83+
"events": [
84+
{
85+
"introduced": "1.7.0"
86+
},
87+
{
88+
"fixed": "1.9.2"
89+
}
90+
]
91+
}
92+
]
93+
},
94+
{
95+
"package": {
96+
"ecosystem": "Go",
97+
"name": "github.com/tektoncd/pipeline"
98+
},
99+
"ranges": [
100+
{
101+
"type": "ECOSYSTEM",
102+
"events": [
103+
{
104+
"introduced": "1.10.0"
105+
},
106+
{
107+
"fixed": "1.10.2"
108+
}
109+
]
110+
}
111+
]
112+
}
113+
],
114+
"references": [
115+
{
116+
"type": "WEB",
117+
"url": "https://github.com/tektoncd/pipeline/security/advisories/GHSA-j5q5-j9gm-2w5c"
118+
},
119+
{
120+
"type": "PACKAGE",
121+
"url": "https://github.com/tektoncd/pipeline"
122+
}
123+
],
124+
"database_specific": {
125+
"cwe_ids": [
126+
"CWE-22"
127+
],
128+
"severity": "CRITICAL",
129+
"github_reviewed": true,
130+
"github_reviewed_at": "2026-03-18T20:20:10Z",
131+
"nvd_published_at": null
132+
}
133+
}

advisories/unreviewed/2026/03/GHSA-rp9g-qx29-88cp/GHSA-rp9g-qx29-88cp.json renamed to advisories/github-reviewed/2026/03/GHSA-rp9g-qx29-88cp/GHSA-rp9g-qx29-88cp.json

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,76 @@
11
{
22
"schema_version": "1.4.0",
33
"id": "GHSA-rp9g-qx29-88cp",
4-
"modified": "2026-03-18T18:31:14Z",
4+
"modified": "2026-03-18T20:20:26Z",
55
"published": "2026-03-18T09:30:28Z",
66
"aliases": [
77
"CVE-2026-22729"
88
],
9+
"summary": "JSONPath Injection in Spring AI Vector Stores FilterExpressionConverter",
910
"details": "A JSONPath injection vulnerability in Spring AI's AbstractFilterExpressionConverter allows authenticated users to bypass metadata-based access controls through crafted filter expressions. User-controlled input passed to FilterExpressionBuilder is concatenated into JSONPath queries without proper escaping, enabling attackers to inject arbitrary JSONPath logic and access unauthorized documents.\n\nThis vulnerability affects applications using vector stores that extend AbstractFilterExpressionConverter for multi-tenant isolation, role-based access control, or document filtering based on metadata.\n\nThe vulnerability occurs when user-supplied values in filter expressions are not escaped before being inserted into JSONPath queries. Special characters like \", ||, and && are passed through unescaped, allowing injection of arbitrary JSONPath logic that can alter the intended query semantics.",
1011
"severity": [
1112
{
1213
"type": "CVSS_V3",
1314
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N"
1415
}
1516
],
16-
"affected": [],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Maven",
21+
"name": "org.springframework.ai:spring-ai-vector-store"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "1.1.0-M1"
29+
},
30+
{
31+
"fixed": "1.1.3"
32+
}
33+
]
34+
}
35+
]
36+
},
37+
{
38+
"package": {
39+
"ecosystem": "Maven",
40+
"name": "org.springframework.ai:spring-ai-vector-store"
41+
},
42+
"ranges": [
43+
{
44+
"type": "ECOSYSTEM",
45+
"events": [
46+
{
47+
"introduced": "0"
48+
},
49+
{
50+
"fixed": "1.0.4"
51+
}
52+
]
53+
}
54+
]
55+
}
56+
],
1757
"references": [
1858
{
1959
"type": "ADVISORY",
2060
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-22729"
2161
},
62+
{
63+
"type": "PACKAGE",
64+
"url": "https://github.com/spring-projects/spring-ai"
65+
},
66+
{
67+
"type": "WEB",
68+
"url": "https://github.com/spring-projects/spring-ai/releases/tag/v1.0.4"
69+
},
70+
{
71+
"type": "WEB",
72+
"url": "https://github.com/spring-projects/spring-ai/releases/tag/v1.1.3"
73+
},
2274
{
2375
"type": "WEB",
2476
"url": "https://spring.io/security/cve-2026-22729"
@@ -29,8 +81,8 @@
2981
"CWE-917"
3082
],
3183
"severity": "HIGH",
32-
"github_reviewed": false,
33-
"github_reviewed_at": null,
84+
"github_reviewed": true,
85+
"github_reviewed_at": "2026-03-18T20:20:26Z",
3486
"nvd_published_at": "2026-03-18T08:16:31Z"
3587
}
3688
}

0 commit comments

Comments
 (0)