Skip to content

CodeQL flags request host and path reaching slog in plugins #1621

Open

Description

@evaline-ju

Problem

CodeQL (go/log-injection, medium) will flag plugins that pass pctx.Host or pctx.Path to slog.* unsanitized. Both values are client-controlled. pctx.Host comes from the Host header. pctx.Path is the percent-decoded URL path, so a %0A in a request becomes a real newline in the log line.

Call sites, by log message. Line numbers are as of main at 5ba75a0:

  • cost/settle (core/cost/settle/settle.go:225, :229) — refused an implausible cost header, refused a cost header larger than any inference call could plausibly be
  • a2a-parser (core/plugins/a2aparser/plugin.go:60, :76) — invalid JSON-RPC, not an A2A-namespace method
  • context-guru (core/plugins/contextguru/plugin.go:253, :273) — skipped request with no session identity, and the per-request summary line
  • cpex (core/plugins/cpex/manager_cpex.go:587) — body modification requested but no protocol extension present
  • ibac (core/plugins/ibac/plugin.go:528, :541) — judge uncertain, judge unavailable
  • inference-parser (core/plugins/inferenceparser/plugin.go:90) — no/invalid body
  • mcp-parser (core/plugins/mcpparser/plugin.go:187, :203, :226, :241) — session terminate, transport stream, body is not valid JSON-RPC, not an MCP-namespace method
  • opa (core/plugins/opa/plugin.go:441, :493) — decision error on request, decision error on response
  • sparc (core/plugins/sparc/plugin.go:427, :431, :450) — reflector unavailable, failing open, reflector unavailable, failing closed, no inference context to ground against
  • token-exchange-aiac (core/plugins/tokenexchangeaiac/plugin.go:414, :418, :424, :458, :462) — audience exists but is not granted to this workload, the destination's client is disabled, token exchange failed (twice), host in another namespace names a target

Status

CodeQL reports only flows that pass through lines a PR changes, so any PR that edits code on a path to one of these sites will raise the alert. #1612 and #1533 had the same problem in the listeners and the session store. Found in review of #1616.

Fix

Wrap each value in pipeline.SanitizeLogValue, the helper #1616 added, which CodeQL recognizes as a log-injection sanitizer. Done when a PR that touches these log lines raises no go/log-injection alerts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions