Summary
df.metrics() queries the duroxide store directly for system-wide aggregate metrics without any RLS filtering. Unlike df.list_instances() (which filters through RLS), any user who can call df.metrics() sees total instance counts, running/completed/failed counts, and total execution/event counts across all users.
Impact
Information disclosure about other users' workflow activity patterns. While no row-level data is leaked, aggregate counts reveal system-wide usage.
Recommended Actions
Either:
- Restrict
df.metrics() to superusers — remove it from the functions granted by df.grant_usage(), or
- Filter metrics to the calling user's own instances — query through RLS-filtered views instead of the duroxide store directly.
Context
- Security review Finding 6 (severity: Low)
- Affected component:
src/monitoring.rs, function metrics()
Summary
df.metrics()queries the duroxide store directly for system-wide aggregate metrics without any RLS filtering. Unlikedf.list_instances()(which filters through RLS), any user who can calldf.metrics()sees total instance counts, running/completed/failed counts, and total execution/event counts across all users.Impact
Information disclosure about other users' workflow activity patterns. While no row-level data is leaked, aggregate counts reveal system-wide usage.
Recommended Actions
Either:
df.metrics()to superusers — remove it from the functions granted bydf.grant_usage(), orContext
src/monitoring.rs, functionmetrics()