Summary
Cronicle contains an authorization and privilege-management weakness that lets certain non-administrator users or scoped API keys inject process identity fields into scheduled events. On installations where the daemon runs with elevated privileges, this may allow jobs to execute as unintended users, potentially including root.
Cronicle contains an authorization and privilege-management weakness that lets certain non-administrator users or scoped API keys inject process identity fields into scheduled events. On installations where the daemon runs with elevated privileges, this may allow jobs to execute as unintended users, potentially including root.
Affected context
The issue affects Cronicle deployments where:
- A non-administrator user or scoped API key has both
create_eventsandrun_eventsprivileges. - Events are created or updated through the
/api/app/create_eventor/api/app/update_eventAPIs. - The event-processing logic accepts unrecognized top-level
uidorgidfields. - The Cronicle daemon or job runner has greater operating-system privileges than the requesting user.
Risk is highest when jobs are launched by a root-owned daemon and the selected plugin does not replace the event-supplied identity.
The issue affects Cronicle deployments where:
- A non-administrator user or scoped API key has both
create_eventsandrun_eventsprivileges. - Events are created or updated through the
/api/app/create_eventor/api/app/update_eventAPIs. - The event-processing logic accepts unrecognized top-level
uidorgidfields. - The Cronicle daemon or job runner has greater operating-system privileges than the requesting user.
Risk is highest when jobs are launched by a root-owned daemon and the selected plugin does not replace the event-supplied identity.
Exploit preconditions
- Attack surface: Cronicle event creation and update APIs.
- Required access: An authenticated non-administrator account or scoped API key with
create_eventsandrun_eventsprivileges. - Trigger point: Job launch after an event containing attacker-controlled
uidorgidvalues is stored. - Why exploitation is possible: Event validation partially checks supported fields but silently retains unknown fields, and job construction propagates them into child-process execution when the selected plugin does not define its own identity.
- Attack surface: Cronicle event creation and update APIs.
- Required access: An authenticated non-administrator account or scoped API key with
create_eventsandrun_eventsprivileges. - Trigger point: Job launch after an event containing attacker-controlled
uidorgidvalues is stored. - Why exploitation is possible: Event validation partially checks supported fields but silently retains unknown fields, and job construction propagates them into child-process execution when the selected plugin does not define its own identity.
Why this happens
The underlying bug combines incomplete input allow-listing with insufficient privilege enforcement. The event validator treats an optional-parameter check as though it were a complete schema, allowing unknown identity fields to be stored without rejection. Later, the job launcher copies event properties into the runtime job, allowing attacker-controlled uid and gid values to influence process identity. This maps primarily to CWE-269, Improper Privilege Management, and is also related to CWE-862, Missing Authorization, and CWE-915, Improperly Controlled Modification of Dynamically-Managed Code Elements.
The underlying bug combines incomplete input allow-listing with insufficient privilege enforcement. The event validator treats an optional-parameter check as though it were a complete schema, allowing unknown identity fields to be stored without rejection. Later, the job launcher copies event properties into the runtime job, allowing attacker-controlled uid and gid values to influence process identity. This maps primarily to CWE-269, Improper Privilege Management, and is also related to CWE-862, Missing Authorization, and CWE-915, Improperly Controlled Modification of Dynamically-Managed Code Elements.
Potential impact
- A low-privileged user could run scheduled jobs under another operating-system identity.
- Jobs could execute with root-level privileges where the Cronicle daemon runs as root.
- Attackers may read, modify, or delete files accessible to the selected identity.
- The affected host could be used for persistence, lateral movement, or further compromise.
- Security boundaries between Cronicle users and operating-system accounts could be bypassed.
- A low-privileged user could run scheduled jobs under another operating-system identity.
- Jobs could execute with root-level privileges where the Cronicle daemon runs as root.
- Attackers may read, modify, or delete files accessible to the selected identity.
- The affected host could be used for persistence, lateral movement, or further compromise.
- Security boundaries between Cronicle users and operating-system accounts could be bypassed.
General mitigation guidance
Mitigation should focus on enforcing privilege boundaries at both the API and process-launch layers.
Common defensive patterns include:
- Rejecting unknown event fields with strict, complete schemas rather than silently preserving them.
- Treating
uidandgidas protected server-controlled properties. - Authorizing run-as-user behavior independently from event creation and execution permissions.
- Allowing identity changes only through an explicit, administrator-controlled policy.
- Running scheduler services and worker processes with the lowest practical operating-system privileges.
- Applying allow-listed execution identities and validating that requested identities are permitted for the caller.
- Ensuring every supported plugin enforces the same identity and authorization rules.
Mitigation should focus on enforcing privilege boundaries at both the API and process-launch layers.
Common defensive patterns include:
- Rejecting unknown event fields with strict, complete schemas rather than silently preserving them.
- Treating
uidandgidas protected server-controlled properties. - Authorizing run-as-user behavior independently from event creation and execution permissions.
- Allowing identity changes only through an explicit, administrator-controlled policy.
- Running scheduler services and worker processes with the lowest practical operating-system privileges.
- Applying allow-listed execution identities and validating that requested identities are permitted for the caller.
- Ensuring every supported plugin enforces the same identity and authorization rules.
How teams detect issues like this
Detection approaches can include:
- Static analysis for partial allow-lists that preserve unknown request properties.
- Code review of event-to-job object copying and process-spawn identity handling.
- API and schema tests that submit unexpected top-level fields and verify rejection.
- Policy checks for non-administrative permissions that combine event creation with execution.
- Runtime monitoring for jobs launched under identities inconsistent with the requesting account or event policy.
- Audit logging of requested, authorized, and effective operating-system identities.
Automated code review and API security testing tools may help identify incomplete validation and authorization gaps.
Detection approaches can include:
- Static analysis for partial allow-lists that preserve unknown request properties.
- Code review of event-to-job object copying and process-spawn identity handling.
- API and schema tests that submit unexpected top-level fields and verify rejection.
- Policy checks for non-administrative permissions that combine event creation with execution.
- Runtime monitoring for jobs launched under identities inconsistent with the requesting account or event policy.
- Audit logging of requested, authorized, and effective operating-system identities.
Automated code review and API security testing tools may help identify incomplete validation and authorization gaps.

