Skip to content

[DNM] fix(security): backport v0.48.0 fixes to v0.43.x#2760

Draft
chmouel wants to merge 6 commits into
release-v0.43.xfrom
security-header-hijacking-v0-43-x
Draft

[DNM] fix(security): backport v0.48.0 fixes to v0.43.x#2760
chmouel wants to merge 6 commits into
release-v0.43.xfrom
security-header-hijacking-v0-43-x

Conversation

@chmouel
Copy link
Copy Markdown
Member

@chmouel chmouel commented Jun 4, 2026

📝 Description of the Change

[DNM] Backport of the security fixes released in v0.48.0 to release-v0.43.x.

This PR backports the public security hardening from v0.48.0:

  • Prevent GitHub Enterprise Host header hijacking before GitHub App token requests.
  • Scope GitHub App installation tokens to the triggering repository for remote task resolution.
  • Deep-copy cached remote Pipeline/Task resources before inlining so one PipelineRun cannot mutate cached resources used by another.
  • Redact incoming webhook query strings from logs so URL-based ?secret= values are not written to stdout.

How this backport was done:

  • Started from release-v0.43.x in a dedicated worktree.
  • Backported the security code paths from the v0.48.0 commits, resolving release-branch API differences manually.
  • Kept the query-string redaction as a separate commit with the original upstream author.
  • Added branch-local golangci/toolchain pinning so PAC CI and local make lint-go use the same known-good linter binary from tmp/.
  • Added dependency security bumps needed for this release stream: go-jose/v3, go-jose/v4, and tektoncd/pipeline.

👨🏻‍ Linked Jira

N/A

🔗 Linked GitHub Issue

N/A

🧪 Testing Strategy

  • Unit tests
  • Integration tests
  • End-to-end tests
  • Manual testing
  • Not Applicable

Validation run locally:

  • make test
  • make lint-go
  • go test ./pkg/adapter after the incoming webhook log redaction backport
  • git diff --check

Full pre-push hooks were not used for this branch because check-links failed on external docs.openshift.com 403 responses unrelated to this backport.

🤖 AI Assistance

  • I have not used any AI assistance for this PR.
  • I have used AI assistance for this PR.

If you have used AI assistance, please provide the following details:

Which LLM was used?

  • GitHub Copilot
  • ChatGPT (OpenAI)
  • Claude (Anthropic)
  • Cursor
  • Gemini (Google)
  • Other: ____________

Extent of AI Assistance:

  • Documentation and research only
  • Unit tests or E2E tests only
  • Code generation (parts of the code)
  • Full code generation (most of the PR)
  • PR description and comments
  • Commit message(s)

✅ Submitter Checklist

  • 📝 My commit messages are clear, informative, and follow the project's How to write a git commit message guide. The Gitlint linter ensures in CI it's properly validated
  • ✨ I have ensured my commit message prefix (e.g., fix:, feat:) matches the "Type of Change" I selected above.
  • ♽ I have run make test and make lint locally to check for and fix any
    issues. For an efficient workflow, I have considered installing
    pre-commit and running pre-commit install to
    automate these checks.
  • 📖 I have added or updated documentation for any user-facing changes.
  • 🧪 I have added sufficient unit tests for my code changes.
  • 🎁 I have added end-to-end tests where feasible. See README for more details.
  • 🔎 I have addressed any CI test flakiness or provided a clear reason to bypass it.
  • If adding a provider feature, I have filled in the following and updated the provider documentation:
    • GitHub App
    • GitHub Webhook
    • Gitea/Forgejo
    • GitLab
    • Bitbucket Cloud
    • Bitbucket Data Center

chmouel and others added 6 commits June 3, 2026 13:37
Validate GitHub App webhook payloads before minting tokens and avoid
trusting a forged enterprise host header. Also include the upstream App
token scoping and remote-resource deep-copy fixes needed for the same
supported release stream.

Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
Download the branch-compatible golangci-lint binary into tmp and use it
from make lint-go. Pin GOTOOLCHAIN for local make targets and PAC Go
steps so linting does not drift with the host Go installation.

Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
Signed-off-by: Shubham Bhardwaj <shubbhar@redhat.com>
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces several security and caching improvements, including webhook signature and enterprise host validation before minting GitHub App tokens, scoping of App tokens, and deep-copying of cached remote pipelines and tasks to prevent mutation leaks. It also updates various dependencies and build configurations. However, several critical issues were identified: the Makefile and Tekton workflows reference non-existent versions of Go (1.25.0) and golangci-lint (v2.12.2), which will cause build failures; comparing URL Host fields directly during enterprise host validation can fail due to port mismatches and should use Hostname(); and a potential nil pointer dereference panic exists in the remote resource resolver if a referenced pipeline is not found before calling DeepCopy().

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread Makefile
Comment on lines +4 to +5
GOLANGCI_LINT_VERSION ?= v2.12.2
GO_TOOLCHAIN ?= go1.25.0
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The pinned versions for GOLANGCI_LINT_VERSION (v2.12.2) and GO_TOOLCHAIN (go1.25.0) do not exist. golangci-lint does not have a v2.x release (it is currently on v1.x), and Go 1.25.0 is not a released version of Go. Using these non-existent versions will cause local builds and linter runs to fail.

GOLANGCI_LINT_VERSION ?= v1.62.2
GO_TOOLCHAIN ?= go1.23.0

Comment thread .tekton/go.yaml
./codecov -P $GITHUB_PULL_REQUEST_ID -C {{revision}} -v
- name: lint
image: docker.io/golangci/golangci-lint:v2.10.1
image: docker.io/golang:1.25
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The Docker image docker.io/golang:1.25 does not exist because Go 1.25 is not a released version. This will cause the Tekton lint task to fail to pull the image and run. Please use a valid, released Go version image such as docker.io/golang:1.23.

              image: docker.io/golang:1.23

Comment on lines +205 to +207
if !strings.EqualFold(enterpriseURL.Host, repoURL.Host) {
return fmt.Errorf("github enterprise host %q does not match repository host %q", enterpriseURL.Host, repoURL.Host)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Comparing enterpriseURL.Host and repoURL.Host directly can cause false validation failures if one of the URLs contains a port number (e.g., github.company.com:8443) and the other does not. Using Hostname() instead of Host ensures that only the hostnames are compared, ignoring any port differences.

Suggested change
if !strings.EqualFold(enterpriseURL.Host, repoURL.Host) {
return fmt.Errorf("github enterprise host %q does not match repository host %q", enterpriseURL.Host, repoURL.Host)
}
if !strings.EqualFold(enterpriseURL.Hostname(), repoURL.Hostname()) {
return fmt.Errorf("github enterprise host %q does not match repository host %q", enterpriseURL.Hostname(), repoURL.Hostname())
}

Comment thread pkg/resolve/remote.go
// if PipelineRef is used then, first resolve pipeline and replace all taskRef{Finally/Task} of Pipeline, then put inlinePipeline in PipelineRun
if pipelinerun.Spec.PipelineRef != nil && pipelinerun.Spec.PipelineRef.Resolver == "" {
pipelineResolved := fetchedResourcesForPipelineRun.Pipeline
pipelineResolved := fetchedResourcesForPipelineRun.Pipeline.DeepCopy()
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

If fetchedResourcesForPipelineRun.Pipeline is nil (which can happen if the referenced pipeline is not found in annotations or local resources), calling DeepCopy() on it will cause a nil pointer dereference panic, crashing the controller. A nil check should be added before calling DeepCopy().

			if fetchedResourcesForPipelineRun.Pipeline == nil {
				return nil, fmt.Errorf("pipeline %s not found", pipelinerun.Spec.PipelineRef.Name)
			}
			pipelineResolved := fetchedResourcesForPipelineRun.Pipeline.DeepCopy()

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants