Capsule: Tenant owner bypasses Capsule's forbidden namespace/service/node label and annotation enforcement
## Summary Capsule lets a cluster administrator forbid specific metadata keys that tenant owners must not place on their own resources: `Tenant.spec.namespaceOptions.forbiddenLabels` / `forbiddenAnnotations` (namespaces), `Tenant.spec.serviceOptions.forbiddenLabels` / `forbiddenAnnotations` (Services), and the cluster-wide forbidden worker-node labels/annotations. These lists are an isolation control — they exist to stop a tenant owner from setting metadata that other controllers or admission plugins key on (Pod Security Admission labels, `kubernetes.io/metadata.name`, LoadBalancer/externalIP service annotations, scheduler annotations, vendor labels that grant network reach, etc.). The validating webhooks enforce them through `api.ValidateForbidden`, which calls `ForbiddenListSpec.ExactMatch(key)` for every key the tenant submits. `ExactMatch` is broken. It sorts the denied list **case-insensitively** (`sort.SliceStable` with a `strings.ToLower` comparator) and then performs a **byte-order binary search** (`sort.SearchStrings`) over the result. `sort.SearchStrings` is only correct on a slice sorted in plain byte-ascending order. Whenever the denied list contains an entry whose case-insensitive position differs from its byte position — which happens any time the list mixes a capitalised key with lowercase keys, because ASCII uppercase letters (0x41–0x5A) sort *before* lowercase (0x61–0x7A) by byte but are interleaved by `ToLower` — the binary search lands on the wrong index an
GHSA-gjw4-3v3v-rqxg
Primary source · Revision 1
Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.
Security context
Source reference: osv:GHSA-gjw4-3v3v-rqxg
github.com/projectcapsule/capsule
Source reference: /affected/0/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 0.13.7
Source reference:
/affected/0/ranges - Prerequisites
- Not stated in this record
Structured affected-version data
Original package identities and version rules from this source.
[
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0"
},
{
"fixed": "0.13.7"
}
]
}
],
"package": {
"name": "github.com/projectcapsule/capsule",
"purl": "pkg:golang/github.com/projectcapsule/capsule",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-gjw4-3v3v-rqxg/GHSA-gjw4-3v3v-rqxg.json",
"last_known_affected_version_range": "<= 0.13.6"
}
}
]- Related CVEs
- CVE-2026-61672
Source reference:
/aliases
Publisher severity
high
Source reference: /database_specific/severity
- Event
- #23387 · Revision 1
- Added to Heist Feed
- Publisher date