Email kpkim@gluesys.com with [daos-operator] in the subject. Please do not
open a public issue for a suspected vulnerability.
Useful things to include: what an attacker — or an unlucky operator — can do, the
chart and operator versions, the Kubernetes version, the DAOS release, and the
smallest reproduction you have. A DaosSystem/DaosPool manifest and the
operator log around the event are usually enough. If you have a patch, attach it
rather than opening a pull request, since pull requests are public.
We will acknowledge within five working days. This is a small team with no dedicated on-call, so please read that as an honest expectation rather than a service level. We will tell you what we intend to do and when, and we will credit you in the fix unless you ask us not to.
This is a Kubernetes operator for a distributed storage system. The interesting failure is usually something destructive happening without the human approval that was supposed to gate it, or the operator handing out more privilege than it needs.
- A destructive operation running without its approval annotation. The
operator never formats or destroys on its own:
dmg storage formatwaits fordaos.gluesys.com/format-approved, destroying a pool or container waits fordaos.gluesys.com/destroy-approved, and replacing certificates waits fordaos.gluesys.com/certs-renew-approved. The annotation is dropped after one attempt, whatever the outcome. A path that formats, destroys or re-keys without that gate, or that replays an annotation, is a security issue even when it looks like a plain bug — the result is data loss with no operator action behind it. - Reconciling the wrong object. Adopting a DAOS pool that belongs to another
DaosPool, or pointing an engine at a device that another rank already owns. Two ranks writing the same drive corrupts data silently. - Privilege escalation through the pods the operator creates. It already asks
for a lot —
hostNetworkon every DAOS client,/dev/infinibandandprivilegedon an RDMA fabric unless an RDMA device plugin supplies the devices, and ahostprepDaemonSet that raises hugepages and can hand NVMe to SPDK. A change that widens any of that, or lets a workload pod inherit it, is in scope. - Leaking a credential the operator handles.
S3Serviceroot credentials, image pull secrets, and the DAOS agent/admin certificates it mounts. - The operator's RBAC. Anything that lets a user who can create a custom resource reach beyond what that resource is about.
- DAOS itself, and the container images' contents. Report those to the DAOS project. If the issue is in how this operator drives DAOS, it is in scope.
- Misconfiguration of the underlying storage. Notably, two DAOS ranks
formatting the same dual-port drives will corrupt data, and no amount of care
in this code prevents it. Compare PCI device serial numbers across nodes before
you trust any data; the operator publishes them as
daos.gluesys.com/bdev-dsnnode annotations so you can. - Access control inside a DAOS pool or container. Multi-tenant isolation is the deployer's job. The operator creates pools and containers; it does not enforce per-tenant boundaries within them.
- Chart values that are insecure by choice, e.g.
tls: false, or puttings3.services[].rootCredentialsinline instead of naming an existing Secret. Helm values end up in the release Secret, whichvalues.yamlwarns about at that key. We will take reports about the warning being wrong or missing.
Fixes land on main and ship in the next release; there are no maintenance
branches yet. The API is v1alpha1.
| Version | Supported |
|---|---|
main |
yes |
latest v0.1.x (chart 0.2.x) |
yes |
v0.1.0-rc.* |
no -- upgrade to v0.1.0 |
| anything else | no |
These are not vulnerabilities in the code, but they decide whether a deployment is safe:
- Verify that no two DAOS ranks own the same physical drive before you trust
any data. Compare
daos.gluesys.com/bdev-dsnacross nodes and confirm each rank reports distinct device serial numbers. Dual-port backplanes make this easy to get wrong and the damage is silent. - Keep the approval annotations manual. They exist so that a format or a destroy is a decision somebody made. Automating them in a controller or a pipeline removes the only thing standing between a reconcile loop and your data.
- Prefer an RDMA device plugin to
privileged. WithrdmaResourcethe plugin injects only the verbs devices the pod needs, which drops both the/dev/infinibandhostPath andprivileged, leavingIPC_LOCK. Throughput is unchanged;values.yamldocuments the setting next tordma. - Name an existing Secret for S3 root credentials rather than letting the chart create one from values.
- Turn on
tlsfor anything beyond a testbed, so the agent and admin certificates are mounted rather than the system running without them. - Deleting a custom resource does not delete data. Removing a
DaosSystemleaves the storage untouched, and removing aDaosPoolwithoutdaos.gluesys.com/destroy-approved=truekeeps the DAOS pool and emits aPoolOrphanedevent. Plan decommissioning deliberately — see the README's Uninstall section.