You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Helm: a YAML merge key (<<) in Chart.yaml gives Helm another name and version than Forge reads (follow-up to #232, #422) #428
Forge reads Chart.yaml with yaml-rust2 (parse_chart_yaml in plugins/helm/src/chart.rs). yaml-rust2 does not implement YAML merge keys: a top-level << is an ordinary key, and Forge ignores it.
Helm parses Chart.yaml with sigs.k8s.io/yaml, which is based on a fork of go-yaml v2. go-yaml v2 does merge: the mapping (or each mapping of a sequence) under << is decoded into the surrounding mapping where the << stands. Its keys overwrite the keys written before it.
Found while fixing #422 (#427). Checked with a throwaway Go harness that runs Helm 3.17.0's loader.LoadFiles on a Chart.yaml:
Unlike #422, this can change the chart's name, which is the class of #232: a publisher whose package selector allows only good publishes a chart that helm install loads as evil. A merged mapping can also bring in a key that #427's folding check never sees, such as <<: {verſion: 6.6.6}.
Failure scenario
Push: a publisher allowed only good pushes name: good / version: 1.0.0 / <<: [{name: evil}]. Forge stores and lists good 1.0.0. Helm installs evil 1.0.0.
requirements.yaml accepts only the exact key dependencies, so a << there is refused.
An index entry carries only the exact METADATA_KEYS.
Suggested fix
In parse_chart_yaml, refuse a Chart.yaml whose top-level mapping has a << key (400 on a push, a rejection on a proxy download). A chart has no use for one.
After loading, yaml-rust2 cannot tell a plain << from a quoted or !!str-tagged one. Refusing every top-level << is the simple, safe rule; Helm ignores the quoted forms anyway.
Add tests for each row of the table, including an alias (base: &b {name: evil} … <<: *b).
Helm charts are now served only through the OCI registry. There a chart's identity is its image path and tag: content selectors match the path, and helm install oci://… resolves only that path. No access or serving decision reads the name from Chart.yaml, so this class of mismatch doesn't apply.
Activity
schmitch commentedon Oct 24, 2026
Closing as not planned: the code this is about is gone.
helmas a format, soparse_chart_yamlwas only reachable from tests after that.plugins/helmalong with WebAssembly plugins.Helm charts are now served only through the OCI registry. There a chart's identity is its image path and tag: content selectors match the path, and
helm install oci://…resolves only that path. No access or serving decision reads the name fromChart.yaml, so this class of mismatch doesn't apply.Generated by Claude Code