`CapsuleConfiguration.Spec.NodeMetadata.ProibidoLabels.Regex` e `ProibidoAnotações.Regex` nunca são validados por qualquer webhook de admissão. Um administrador de cluster pode persistir em um regex mal- formado para etcd sem ser bloqueado. Uma vez armazenado, cada pedido de Nó `CREA', `UPDATE' ou `PATCH` ativa `regexp.MustCompile()` em `pkg/api/forbidden_list.go: 36 `, que **panics** e bloqueia o webhook de admissão de nó - causando uma Negação de serviço em todo o cluster para todas as operações de nó. ` interna/ webhook/ locant/ validation/` contém validadores regex dedicados para cada campo Regex Locant (nome de hospedagem, classe de armazenamento, classe de entrada, registro de container, etc.). ` interna/ webhook/ cfg/` contém ** nenhum validador regex em tudo** — apenas `owners.go`, `servicecount.go' e ` warnings.go'. O consumidor a jusante `internal/webhook/node/user_metadata.go` chama: ```go // line 131 correspondido = proibidoLabels.RegexMatch(label) // line 150 correspondiu = proibidoAnotações.RegexMatch(annotation) ``` Quais as rotas para `pkg/api/forbidden_list.go: 36 `: ````go func (em ProibidoListSpec) RegexMatch( value string) (ok bool) { se len(in.Regex) > 0 { ok = regexp.MustCompile(in.Regex).MatchString( value) // ← entra em pânico no regex inválido } retorna ok } ```.

Ao contrário do `regexp.Compile`, `regexp.MustCompile` entra em pânico em vez de devolver um erro. Como nenhum webhook valida os campos de regex `CapsuleConfiguration` antes do armazenamento, um valor mal- conformado atinge `MustCompile` em cada pedido de admissão de Nóde. ### Comparação com CVEs existentes. ` GHSA- f 94 q- w 3 w 8 - cj 67 ` e ` GHSA- gxjc- 74 v 5 - 3 vx 3 ` afetar campos individuais do Locatário — seus validadores existiam, mas selecionaram o campo errado. Este problema é diferente: ** nenhum validador existe** para os campos `CapsuleConfiguration` regex, e o raio de explosão é de todo o grupo (todos os nós), não é oferecido a um inquilino. Importação ( "fmt" "regexp" ). digite ProibidoListSpec struct{ Regex string } // Cópia exata do pkg/api/forbidden_list.go: 34 - 38 func (em ForbiddenListSpec) RegexMatch( value string) bool { se len( in.Regex) > 0 { retorno regexp.MustCompile(in.Regex).MatchString(valor) } retorna falso }.

func main() { // 1. cfg webhook não tem validador → regex inválido armazenado em etcd // (sem webhook em campos de regex internos/ webhook/ cfg/ verifica) // 2. Armazenado de má forma do regex carregado da cápsulaConfiguração proibida:= ProibidoListSpec{Regex: `[invalid-regex(`} // 3. node/user_metadata.go: 131 chamado em cada pedido de admissão defford func() { se r:= recover(); r!= nul { fmt.Printf("PANIC:%v\n", r) // Saída: PANIC: regexp: Compile(`[invalid-regex(`): erro analisando regexp: faltando fechamento ] } }() proibido.RegexMatch("kubernetes.io/hostname") } ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````.

Saída esperada: ``` PANIC: regexp: Compile(`[invalid-regex(`): erro analisando regexp: faltando fechamento ]: `[invalid-regex(` ```` ### Fix Adicionar um 'hander node_metadata_regex.go' para `internal/webhook/cfg/` seguindo o mesmo padrão que `forbidden_annotations_regex.go`: Importação ( "contexto" "regexp". "sigs.k 8 s.io/controller- runtime/pkg/cliente" "sigs.k 8 s.io/controller- runtime/pkg/webhook/admissão".

capsulev 1 beta 2 "github.com/projectcapsule/capsule/api/v 1 beta 2 " anúncio "github.com/projectcapsule/capsule/pkg/runtime/admission" "github.com/projectcapsule/capsule/pkg/runtime/events" "github.com/projectcapsule/capsule/pkg/runtime/handlers" ) digite nodoMetadataRegexHandler struct{}. Func NodeMetadataRegexHandler() manipuladores.TipadoHandler[*capsulev 1 beta 2.CapsuleConfiguration] { retorno & nodeMetadataRegexHandler{} } Func (h *nodeMetadataRegexHandler) OnCreate( _ client.Client, _ client. Reader, cfg *capsulev 1 beta 2.CapsuleConfiguração, _ admission.Decoder, _ events.EventRecorder, ) handlers.Func { retorno func(_ context.Context, req admission.Request) *admission.Response { retorno h.validate(cfg, req) } }.

Func (h *nodeMetadataRegexHandler) OnDelete( client.Client, client. Reader, *capsulev 1 beta 2.CapsuleConfiguração, admission.Decoder, events.EventRecorder, ) handers.Func { devolver func(contexto.Contexto, admission.Request) *admission.Response { devolver zero } } Func (h *nodeMetadataRegexHandler) OnUpdate( _ client.Client, _ client.Reader, cfg *capsulev 1 beta 2.CapsulaConfiguração, _ *capsule 1 beta 2.CapsuleConfiguração, _ admission.Decoder, _ events.EventRecorder, ) handlers.Func { retorno func(_ context.Context, req admission.Request) *admission.Response { retorno h.validate(cfg, req) } } func (h * nodeMetadataRegexHandler) validado(cfg * capsulev 1 beta 2.CapsuleConfiguração, admissão de req.Petição) *admissão.Response { se cfg.Spec.NodeMetadata == nulo { devolve nulo }.

expressões:= mapa[string]string{ "marcas": cfg.Spec.NodeMetadata.ProibidoLabels.Regex, "annotações": cfg.Spec.NodeMetadata.ProibidoAnnotações.Regex, }. para o escopo, expressão:= expressões de intervalo { se expressão == "" { continuar } se _, err:= regexp.Compile( expression); err!= nil { devolver o anúncio Denyf( "impossível compilar o regex%q para%s:%v proibido", expressão, escopo, err, ) } } Passo 2: Registar o manipulador em cmd/ controller/ main.go. route.ConfigValidation( cfgvalidation.Handler( cfg, cfgvalidation.WarningHandler(), cfgvalidation.ServiceConteoHandler(), cfgvalidation.OwnerHandler(), cfgvalidation.NodeMetadataRegexHandler(), // ← AJUDAR ESTA LINEA ), ), ````.

Um administrador de cluster (ou conta de administrador comprometida) pode atualizar a configuração da cápsula com um reex de Nodo Metadata mal-formado (por exemplo, `[invalid-regex(`). A atualização é aceita sem validação e persiste para etcd. Uma vez armazenado, cada pedido de admissão de nó subsequente ativa `regexp.MustCompile()` com o padrão inválido, causando o pânico do webhook do nó da cápsula. ** Operações afetadas (em toda a gama do agrupamento):** - rotulagem de nó, anotações e manchas (`kubectl label/annotate/taint node`) - Operações de autoescaladores de cluster (não podem registrar ou remover nós) - Gerenciamento do ciclo de vida do nó do provedor de nuvem (metadata sincronização, atualizações de estado) - Fluxos de manutenção do nó (cordon, dren, descordon) **Severidade:** Isto é uma **Negação de serviço em toda a gama de grupos** que afeta todas as operações de infraestrutura de Nó. Ao contrário dos CVEs com cobertura de inquilino (GHSA-f 94 q- w 3 w 8 - cj 67 GHSA- gxjc- 74 v 5 - 3 vx 3 ) que impacta somente as operações Ingress ou Namespace dentro de um único inquilino, esta vulnerabilidade bloqueia a capacidade de todo o cluster de gerenciar nós.

O cluster não pode escalar, executar manutenção ou processar alterações de metadados de nó até que um administrador de cluster corrija manualmente a configuração da cápsula – requerendo acesso direto ao kubectl com YAML válido. Registro de aconselhamento: GHSA- 68 cj- mvg 9 - rgm 2. Identificadores relacionados: CVE- 2026 - 65834. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 16: 53: 25.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 16: 53: 25.000 Z.

Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:N/A:H. Informações sobre software e versão afetadas: Vá o pacote github.com/projectcapsule/capsule — ECOSYSTEM: introduzido 0, corrigido 0.13.8. Classificação e evidência: identificadores de fraqueza CWE- 20, CWE- 248. O registro contém 4 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.