velero: docs: Add STRIDE threat model - #1238
Open
Ralthos wants to merge 1 commit into
Open
Conversation
An assessment of the system a Velero plugin would sit on, written before any component so the security posture can be argued with rather than retrofitted. The two mechanisms carrying the risk are Velero's rather than a plugin's. DownloadRequest turns a namespaced CR create into a ten minute unauthenticated URL to backup contents, and backups include Secrets unless excluded, so the permission to create one is closer to cluster-wide secret read than its name suggests. Restore turns a CR create into arbitrary object creation, including objects that grant permissions. Follows the OWASP four-question framework with STRIDE, and labels every claim Verified, Plausible or Open. Nothing here was run against a multi-tenant cluster with a restricted subject, so the escalation paths are Plausible while the mechanisms they rest on are Verified. Contains no plugin code. Signed-off-by: saral <ilovegojo2580@gmail.com>
Ralthos
requested review from
ashu8912,
illume,
joaquimrocha,
skoeva,
sniok,
vyncent-t and
yolossn
as code owners
August 23, 2026 18:19
Open
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.
This is a document, not an implementation. #939 says not to start the plugin, and there is no
plugin code here: no
index.tsx, no components, nopackage.json. It is a security assessmentof the system a plugin would sit on, put up now so the posture can be argued with before anyone
writes a component rather than retrofitted afterwards.
It follows the same shape as the threat models already in this repo (#883, #885, #888, #1208):
the OWASP four-question framework with STRIDE, an evidence-confidence label on every claim, a
qualitative risk method, a response register, and maintenance triggers.
What it found
Almost all of the risk belongs to Velero rather than to anything a plugin would invent, which is
the useful part: it constrains the design before the design exists.
DownloadRequestwithtarget.kind: BackupContentscauses the controller to sign a ten minuteobject store URL (
pkg/persistence/object_store.go:642,:96). The controller runs noauthorization check on whoever created the request; it reconciles any
DownloadRequestthatexists (
pkg/controller/download_request_controller.go:229). The URL is then fetched with anordinary GET carrying no Kubernetes credentials. Backups include Secrets unless an operator
excluded them, and exclusion is an explicit flag
(
site/content/docs/main/resource-filtering.md:185).So
createondownloadrequestsin the Velero namespace is closer to cluster-wide secret readthan its name suggests. That is Velero's behaviour and predates any plugin. It matters here
because a download control in a details view makes it routine, and because the plugin's install
documentation is where an operator will form their idea of what Velero namespace access implies.
Restoreis the other one: creating the CR causes Velero to create the objects in a backup withits own credentials, and those objects can include RoleBindings and ServiceAccounts.
The rest of the register covers irreversible backup deletion, actions addressed to the wrong
cluster in a multi-cluster selection, a health dashboard rendering "could not check" as green,
attribution, and the shared renderer context.
On confidence
Every claim carries Verified, Plausible or Open. The mechanisms above are Verified against
source and cited by line. The escalations they imply are Plausible, not Verified: nothing
here was executed against a multi-tenant cluster with a restricted subject, and the document
says so in its scope section rather than leaving it to be discovered.
I would rather have this argued with than agreed to. The four open questions at the end are the
parts I think a maintainer has to decide, particularly whether signed URLs should be fetched by
the browser at all, and whether restore belongs in a first release.