The Fluentd configuration renderer in Logging operator writes strings from CRDs such as Flow directly into fluent.conf without escaping them. As a result, a user who can create Flow resources can inject Fluentd configuration by providing values that contain newlines.
In the confirmed path, a value in record_transformer.records can close the current <record> / <filter> block and add a new <match **> block. By specifying Fluentd's core @type exec plugin in that injected block, an attacker can execute arbitrary commands inside the Fluentd aggregator.
The issue is in FluentRender in pkg/sdk/logging/model/render/fluent.go.
https://github.com/kube-logging/logging-operator/blob/98275d2984aa8d731c4c975b8006aa433fc7bafa/pkg/sdk/logging/model/render/fluent.go#L60-L87
Each parameter is rendered as key value, but values are not quoted, and newlines or characters such as < and > are not rejected. In addition, indentedf builds the string with fmt.Sprintf and then splits it on \n, so newlines inside CRD values become new lines in the generated Fluentd configuration.
One input source is record_transformer.records. ToDirective passes Record (map[string]string) into Params without validation or escaping.
https://github.com/kube-logging/logging-operator/blob/98275d2984aa8d731c4c975b8006aa433fc7bafa/pkg/sdk/logging/model/filter/record_transformer.go#L92-L103
The config check in pkg/resources/fluentd/appconfigmap.go runs fluentd -c ... --dry-run, but it passes as long as the injected configuration is syntactically valid Fluentd configuration. @type exec is a core Fluentd plugin and is available in the official Fluentd image.
The prerequisite is that Logging operator is running with a Fluentd aggregator configuration and that the attacker can create Flow and Output resources in a watched namespace, for example tenant-a.
First, create a minimal Output as the log destination.
0.0.0-20260608145523-cf437d7f1e05Exploitability
AV:NAC:LPR:LUI:NScope
S:CImpact
C:HI:HA:H9.9/CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:HInput Validation