|
| 1 | +--- |
| 2 | +title: "Admission Controller 1.33 Release" |
| 3 | +authors: |
| 4 | + - Víctor Cuadrado Juan |
| 5 | +date: 2026-03-09 |
| 6 | +--- |
| 7 | + |
| 8 | +The garden is thriving and Kubewarden 1.33 is ready to bloom! Following last |
| 9 | +release's big repotting, this one is serious about pruning, including a |
| 10 | +security issue. It's not all housekeeping though, fresh flowers are blooming |
| 11 | +and come with nice features: BYO-PKI landing in the policy-server, field mask |
| 12 | +filtering for context-aware calls, proxy support, and a few more treats. Let's |
| 13 | +dig in! |
| 14 | + |
| 15 | +## Security fix: Cross-namespace data access, removal of deprecated API calls |
| 16 | + |
| 17 | +In our [previous |
| 18 | +post](https://www.kubewarden.io/blog/2026/02/not-affected-by-cve-2026-22039/) |
| 19 | +we explained how our architecture protects namespaced policy users from |
| 20 | +privilege escalations. While this still stands, Ville Vesilehto |
| 21 | +([thevilledev](https://github.com/thevilledev) on GitHub) found the following |
| 22 | +security vulnerability: an attacker with permissions to create |
| 23 | +AdmissionPolicies could make use of 3 deprecated host-callbacks |
| 24 | +(`kubernetes/ingresses`, `kubernetes/namespaces`, `kubernetes/services`) to |
| 25 | +craft a policy that would allow them read access to Ingresses, Namespaces, and |
| 26 | +Services resources respectively. |
| 27 | + |
| 28 | +This attack is read-only, there is no write capability and no access to |
| 29 | +Secrets, ConfigMaps, or other resource types beyond these three. The attacker |
| 30 | +could read, for example: |
| 31 | + |
| 32 | +- Ingresses across all namespaces with hostnames and routing rules. |
| 33 | +- Namespace names and labels. |
| 34 | +- Services across all namespaces with ClusterIPs and ports to reveal cluster |
| 35 | + internal topology. |
| 36 | + |
| 37 | +This security issue has received **CVE-2026-29773**, with score 2.7(low). We thank |
| 38 | +Ville for finding this vulnerability and responsible disclosure! |
| 39 | + |
| 40 | +In this release we remove these vulnerable and already-deprecated host-callback |
| 41 | +API calls (`kubernetes/ingresses`, `kubernetes/namespaces`, `kubernetes/services`). |
| 42 | +The removed calls were not being used by any Kubewarden SDK. |
| 43 | + |
| 44 | +These host-callbacks had already long been superseded by |
| 45 | +`kubewarden/kubernetes/list_resources_by_namespace`, |
| 46 | +`kubewarden/kubernetes/list_resources`, and |
| 47 | +`kubewarden/kubernetes/get_resource`. They provide similar capabilities while |
| 48 | +being more granular, performant, and gated through our context-aware permissions |
| 49 | +feature. These current host-capabilities are part of the Kubernetes capabilities |
| 50 | +listed in our [documentation](https://docs.kubewarden.io/reference/spec/host-capabilities/kubernetes). |
| 51 | + |
| 52 | +## Deprecation of `wgk8spolicy.io` in favour of OpenReports |
| 53 | + |
| 54 | +Since `v1.30` [we have optionally supported |
| 55 | +OpenReports](https://www.kubewarden.io/blog/2025/10/kubewarden-1.30-release/) |
| 56 | +as an output report format of our Audit Scanner. In that release we marked the |
| 57 | +`wgk8spolicy.io` PolicyReports CRDs as deprecated, but we kept installing them |
| 58 | +by default. |
| 59 | + |
| 60 | +With this release, we are defaulting to OpenReports instead. The CRDs for |
| 61 | +`wgk8spolicy.io` PolicyReports are not installed by default anymore by the |
| 62 | +`kubewarden-crds`, only the new OpenReports. The Audit Scanner is configured to |
| 63 | +produce OpenReports by default now. |
| 64 | + |
| 65 | +Users wishing to maintain the previous behavior need to: |
| 66 | + |
| 67 | +- Change the `kubewarden-crds` Helm chart value of |
| 68 | + `.Values.install.installPolicyReportCRDs` to `true`. |
| 69 | +- Change the `kubewarden-controller` Helm chart value of |
| 70 | + `.Values.auditScanner.reportCRDsKind` from `openreports` to `policyreport`. |
| 71 | + |
| 72 | +Old existing `wgk8spolicy.io` reports CRs will be removed when performing the |
| 73 | +upgrade, as the CRDs for them are removed. In the case that the user had |
| 74 | +installed the `wgk8spolicy.io` CRDs by other means, if the Audit Scanner is |
| 75 | +configured to create OpenReports (the new default), upon each scan, it performs |
| 76 | +a one-time cleanup of old `wgk8spolicy.io` PolicyReports and |
| 77 | +ClusterPolicyReports that were created by Kubewarden. This cleanup is |
| 78 | +performant. |
| 79 | + |
| 80 | +In a future release, the option to create `wgk8spolicy.io` PolicyReports |
| 81 | +and their optional CRDs installation will both be removed. |
| 82 | + |
| 83 | +The included sub-chart for policy-reporter already supports OpenReports and |
| 84 | +continues to function for both the deprecated `wgk8spolicy.io` |
| 85 | +PolicyReports and OpenReports without any reconfiguration. |
| 86 | + |
| 87 | +## Support for custom Sigstore trust roots and BYO-PKI in policy-server |
| 88 | + |
| 89 | +Since `v1.31` release, [`kwctl` accepts the new Sigstore ClientTrustConfig |
| 90 | +format](https://www.kubewarden.io/blog/2025/11/kubewarden-1.31-release/), also |
| 91 | +know as "Bring Your Own PKI (BYO-PKI)". This allows to consume a single JSON |
| 92 | +configuration file with all the certificates, URLS and information to perform |
| 93 | +Sigstore signing and verifications. |
| 94 | + |
| 95 | +For this release, we have enhanced `policy-server` with the same feature. Users |
| 96 | +that want to use PolicyServers against their own custom Rekor and Fulcio |
| 97 | +services (like those inside an air-gap) can now set the PolicyServer |
| 98 | +`spec.sigstoreTrustConfig` to the name of a ConfigMap that contains this JSON |
| 99 | +configuration. |
| 100 | + |
| 101 | +The ConfigMap must contain the JSON in a key named `sigstore-trust-config`, and |
| 102 | +it must be in the same Namespace as the PolicyServer. |
| 103 | + |
| 104 | +For the default PolicyServer, installed via the `kubewarden-defaults` Helm chart, |
| 105 | +the ConfigMap name can be configured via its `.Values.sigstoreTrustConfig`. |
| 106 | + |
| 107 | +Have a read at our new [documentation |
| 108 | +page](https://docs.kubewarden.io/howtos/policy-servers/private-sigstore) on how |
| 109 | +to configure this feature. |
| 110 | + |
| 111 | +## Field mask filtering for Kubernetes context aware calls |
| 112 | + |
| 113 | +When policies perform queries about Kubernetes resources via context-aware |
| 114 | +calls, the resulting object may be particularly big, and sometimes the policy |
| 115 | +author only cares about a subset of the data. For example, a policy reasoning |
| 116 | +about Pods may only be interested in the `spec.containers.image` and not the |
| 117 | +full Kubernetes object, with its versions and fields. |
| 118 | + |
| 119 | +To improve performance, we have enhanced our Kubernetes context aware calls |
| 120 | +with an optional `field_masks` field that prunes the Kubernetes resource to |
| 121 | +contain _only_ the specified fields. |
| 122 | + |
| 123 | +Our [image-cve-policy](https://artifacthub.io/packages/kubewarden/kubewarden-policy-library/image-cve-policy), |
| 124 | +exercised by our SBOMscanner project, now makes use of this feature. This |
| 125 | +reduces its memory usage and serialization overhead when it processes |
| 126 | +VulnerabilityReport CRs, as they can be quite big and the policy doesn't need |
| 127 | +the whole of it. |
| 128 | + |
| 129 | +### Updated SDKs and cel-policy |
| 130 | + |
| 131 | +We have enhanced our Policy SDKs to expose this new field mask feature. Policy |
| 132 | +SDK authors can also find this new `field_masks` input field in the Kubernetes |
| 133 | +[host-calls](https://docs.kubewarden.io/next/reference/spec/host-capabilities/kubernetes#operation---list_resources_all). |
| 134 | + |
| 135 | +In addition, we have enhanced our |
| 136 | +[cel-policy](https://artifacthub.io/packages/kubewarden/kubewarden-policy-library/cel-policy), |
| 137 | +and exposed this feature as a native CEL function, `<Client>.fieldMask(<string>)`. |
| 138 | +You can read more in the [go CEL docs](https://github.com/kubewarden/policies/blob/main/policies/cel-policy/internal/cel/library/kubernetes.go#L70-L90) |
| 139 | +of the policy. |
| 140 | + |
| 141 | +As an example, the following CEL code returns the `nginx` Pod with only its |
| 142 | +`metadata.labels` field: |
| 143 | + |
| 144 | +```cel |
| 145 | + kw.k8s.apiVersion('v1').kind('Pod').namespace('default').fieldMask('metadata.labels').get('nginx') |
| 146 | +``` |
| 147 | + |
| 148 | +This new `.fieldMask()` function can be called multiple times to add several |
| 149 | +field paths to the mask. For example, this returns a list of Pod resources with |
| 150 | +only their `metadata.name` and `medata.namespace` fields: |
| 151 | + |
| 152 | +```cel |
| 153 | +kw.k8s.apiVersion('v1').kind('Pod').fieldMask('metadata.name').fieldMask('metadata.namespace').list() |
| 154 | +``` |
| 155 | + |
| 156 | +## Configuring policies to run in the kubewarden namespace |
| 157 | + |
| 158 | +By default, the Kubewarden admission controller is configured so _all policies_ |
| 159 | +pass in the namespace in which the controller is running (usually, `kubewarden`). |
| 160 | + |
| 161 | +This prevents the user from locking the cluster if they misconfigure policies, |
| 162 | +or interfering with the PolicyServers there. For example, expecting _all_ |
| 163 | +container images to be signed by Issuer `my.corp` would make the Deployment of |
| 164 | +the Kubewarden Admission Controller eventually fail, as its container images |
| 165 | +are signed by the Kubewarden team. Or mutating PolicyServers, which may affect |
| 166 | +not only their desired PolicyServers but others. |
| 167 | + |
| 168 | +In some cases though, users may want to run policies in the namespace of the |
| 169 | +Admission Controller, for example if aiding resource allocation or preventing |
| 170 | +core namespaces from being modified. |
| 171 | + |
| 172 | +For those really unusual cases, cluster operators can now deploy Kubewarden |
| 173 | +policies to also apply to the Admission Controller namespace by doing the following: |
| 174 | + |
| 175 | +- Configure the Admission Controller to accept AdmissionReviews for policies in |
| 176 | + the controller namespace by setting the `kubewarden-controller` Helm chart |
| 177 | + values `.Values.alwaysAcceptAdmissionReviewsOnDeploymentsNamespace` to `false`. |
| 178 | + This means that both clusterwide and namespaced policies may apply to the |
| 179 | + namespace where the Deployments for the controller and PolicyServers are. |
| 180 | +- If deploying clusterwide policies, do so with their new |
| 181 | + `spec.allowInsideAdmissionControllerNamespace`to `true`. |
| 182 | + |
| 183 | +We expect cluster operators to rarely use this feature. We |
| 184 | +recommend caution when doing so. If interested, you can see our [documentation |
| 185 | +page](https://docs.kubewarden.io/howtos/policies-eval-resources-in-controller-namespace) |
| 186 | +for it. |
| 187 | + |
| 188 | +## Proxy configuration |
| 189 | + |
| 190 | +Both `kwctl` and `policy-server` support now proxy configuration via either the |
| 191 | +usual environment variables `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` (and their |
| 192 | +lowercase counterparts), or via the `sources.yaml` file. |
| 193 | + |
| 194 | +This proxy configuration routes policy pulling and pushing, as well as those |
| 195 | +context-aware capabilities that make use of the network, such as obtaining an OCI |
| 196 | +image digest or Sigstore operations. Read more about it in our |
| 197 | +[how-to](https://docs.kubewarden.io/howtos/proxy-configuration) docs. |
| 198 | + |
| 199 | +## Versioning of the policy-server cert Secret |
| 200 | + |
| 201 | +Starting with this release, the Secret that contains the PolicyServer |
| 202 | +certificate is now versioned via an annotation, to ease maintenance and |
| 203 | +future migrations. This means that on first install/upgrade of this release, |
| 204 | +the Secret and certificate will be automatically recreated to match this new |
| 205 | +scheme. This doesn't affect users. |
| 206 | + |
| 207 | +## Monorepo cleanup continues |
| 208 | + |
| 209 | +Our monorepo is sailing strong, and we couldn't be happier! |
| 210 | + |
| 211 | +We have restored test coverage submission for our Rust crates, which brings us |
| 212 | +back to [our usual ~80% |
| 213 | +coverage](https://app.codecov.io/github/kubewarden/kubewarden-controller). We |
| 214 | +also have automation back for Rust toolchain updates, spell checking, |
| 215 | +contribution docs, and a general cleanup. |
| 216 | + |
| 217 | +# Getting in touch |
| 218 | + |
| 219 | +Join the conversation on |
| 220 | +[Slack](https://kubernetes.slack.com/?redir=%2Fmessages%2Fkubewarden) or |
| 221 | +[GitHub discussions](https://github.com/orgs/kubewarden/discussions) and let us |
| 222 | +know how you’re finding Kubewarden 1.33! |
0 commit comments