[9.3](backport #7009) fix: enforce policy-based access control on artifact downloads#7163
Open
mergify[bot] wants to merge 1 commit into
Open
[9.3](backport #7009) fix: enforce policy-based access control on artifact downloads#7163mergify[bot] wants to merge 1 commit into
mergify[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)
5 tasks
Contributor
Author
|
This pull request has not been merged yet. Could you please review and merge it @ycombinator? 🙏 |
1 similar comment
Contributor
Author
|
This pull request has not been merged yet. Could you please review and merge it @ycombinator? 🙏 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.