[8.19](backport #7009) fix: enforce policy-based access control on artifact downloads#7164
[8.19](backport #7009) fix: enforce policy-based access control on artifact downloads#7164mergify[bot] wants to merge 1 commit into
Conversation
* fix: enforce policy-based access control on artifact downloads
The artifact download endpoint (/api/fleet/artifacts/{id}/{sha256})
previously only validated the agent's API key but never checked whether
the requested artifact belonged to the agent's assigned policy. This
allowed an agent enrolled under one policy to download artifacts from
a different policy if it knew the artifact ID and SHA256 hash.
Add authorizeArtifact implementation that fetches the agent's policy
from the in-memory policy monitor cache and verifies the requested
artifact appears in the policy's artifact_manifest before serving it.
Returns 403 Forbidden if the artifact is not in the agent's policy.
Resolves: https://github.com/elastic/security/issues/8396
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: add changelog fragment for artifact access control fix
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: document race condition tradeoffs in authorizeArtifact
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use any instead of interface{} per Go conventions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: add typed ArtifactManifest struct for policy input parsing
Defines model.ArtifactManifest and model.ManifestEntry structs so
policyHasArtifact no longer navigates untyped map[string]any chains.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit caa8b2d)
# Conflicts:
# internal/pkg/api/handleCheckin_test.go
# internal/pkg/policy/monitor.go
|
Cherry-pick of caa8b2d has failed: To fix up this pull request, you can check it out locally. See documentation: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally |
TL;DR
Remediation
Investigation detailsRoot CauseThis is a configuration/backport integration failure from an incomplete cherry-pick resolution, not a runtime code regression. Build logs show Go parser errors in both files at lines containing conflict-marker tokens, e.g. The PR already contains Mergify’s conflict note indicating these exact files were left unmerged:
Evidence
Verification
Follow-upAfter conflict resolution, if CI still fails, re-check for any remaining conflict markers with: What is this? | From workflow: PR Buildkite Detective Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not. |
|
This pull request has not been merged yet. Could you please review and merge it @ycombinator? 🙏 |
1 similar comment
|
This pull request has not been merged yet. Could you please review and merge it @ycombinator? 🙏 |
What is the problem this PR solves?
The artifact download endpoint (
/api/fleet/artifacts/{id}/{sha256}) only validates the agent's API key but never checks whether the requested artifact belongs to the agent's assigned policy. This means an agent enrolled under one policy can download artifacts belonging to a different policy if it knows the artifact ID and SHA256 hash. For example, an agent enrolled under a policy with no integrations can retrieve Elastic Defend trust lists, exception lists, and other security artifacts from another policy.How does this PR solve the problem?
Implements the
authorizeArtifact()function (previously a no-op that returnednil) to enforce policy-based access control:GetPolicy(ctx, policyID)method to thepolicy.Monitorinterface that returns the cached policy for a given ID (reloads from ES on cache miss).authorizeArtifact, fetches the agent's policy via the monitor usingagent.AgentPolicyIDand verifies that the requested artifact (identifier+decoded_sha256) appears in the policy'sinputs[].artifact_manifest.artifacts.ErrUnauthorizedArtifact) if the artifact is not listed in the agent's assigned policy.How to test this PR locally
Design Checklist
Checklist
./changelog/fragmentsusing the changelog toolThis is an automatic backport of pull request fix: enforce policy-based access control on artifact downloads #7009 done by Mergify.