Summary
A CEL rule can decide an execution from dynamic properties of the invocation, such as its arguments or environment. Because the answer depends on that context, Santa correctly marks such a decision as applying only to the invocation that produced it.
When the decision granted compiler authority, that marking was discarded. The result was stored as a settled answer for the executable, keyed on its identity on disk. A later execution of the same file matched the stored answer and was allowed without the rule being consulted again, including in a context the rule denies. That execution also received compiler authority.
Whether an invocation is permitted and whether that answer may be reused are separate properties. Merging them let an answer that was only ever true of one invocation stand in for every later one.
Impact
A local user with no special privileges could run an executable under arguments or other context that policy denies, after one permitted invocation of the same file. The denied invocation runs with the user's own permissions, so this is not a privilege escalation.
The same execution is also marked as a compiler. Where transitive rules are enabled, a process holding compiler authority causes Santa to record durable allow rules for executables it produces, which turns a single denied invocation into standing permission for further code. The reporter demonstrated the execution bypass at runtime and established this downstream effect from the source.
Affected configurations
A deployment is affected when a CEL rule grants compiler authority conditionally, so that the same executable is permitted in one context and denied in another. Rules that grant compiler authority unconditionally are unaffected, because there is no context for a cached answer to contradict. Fallback compiler results are also unaffected, since Santa reduces those to an ordinary allow.
The transitive-rule consequence additionally requires EnableTransitiveRules, which is off unless a configuration profile or sync server turns it on.
The stored answer is tied to the executable as it exists on disk. It does not survive a cache flush, modification of the file, unmounting the volume it lives on, a daemon restart, or a reboot.
Granting compiler authority conditionally is an uncommon policy shape. Compiler authority is already a broad grant, and deployments that use it generally target build tooling regardless of how it is invoked. If you use compiler rules at all, check whether any of them are conditional.
What changes in 2026.7
A compiler decision that came from a context-dependent rule now authorizes only the invocation that produced it. Each later execution of the same file re-evaluates the rule.
Administrators using conditional compiler rules should expect executions that previously succeeded to start being denied, since those were the invocations relying on a reused answer. Rules that grant compiler authority unconditionally behave as before and continue to be cached.
Affected versions
| Field |
Value |
| Affected |
Santa <= 2026.6 |
| Fixed in |
Santa 2026.7 |
| Severity |
High, CVSS v4.0 base score 8.2 |
| CVSS |
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:H/SA:N |
| CWE |
CWE-863: Incorrect Authorization |
Mitigation
Upgrade to Santa 2026.7 or later.
On affected versions, administrators can remove the exposure through policy:
- Review CEL rules that return compiler authority conditionally. These are the only rules affected. A rule that grants compiler authority for every context is not.
- Consider whether compiler authority needs to be context-dependent at all. Where the contextual test exists to narrow which invocations may mint transitive rules, splitting the executable into separately identified builds, or granting compiler authority unconditionally to a narrower identity, avoids relying on a per-invocation decision.
- Confirm whether
EnableTransitiveRules is on. It is off by default, and the durable-rule consequence does not apply when it is off.
Credit
Reported by OpenAI Codex Security, Jamie Brim (@jamieb-oai).
Summary
A CEL rule can decide an execution from dynamic properties of the invocation, such as its arguments or environment. Because the answer depends on that context, Santa correctly marks such a decision as applying only to the invocation that produced it.
When the decision granted compiler authority, that marking was discarded. The result was stored as a settled answer for the executable, keyed on its identity on disk. A later execution of the same file matched the stored answer and was allowed without the rule being consulted again, including in a context the rule denies. That execution also received compiler authority.
Whether an invocation is permitted and whether that answer may be reused are separate properties. Merging them let an answer that was only ever true of one invocation stand in for every later one.
Impact
A local user with no special privileges could run an executable under arguments or other context that policy denies, after one permitted invocation of the same file. The denied invocation runs with the user's own permissions, so this is not a privilege escalation.
The same execution is also marked as a compiler. Where transitive rules are enabled, a process holding compiler authority causes Santa to record durable allow rules for executables it produces, which turns a single denied invocation into standing permission for further code. The reporter demonstrated the execution bypass at runtime and established this downstream effect from the source.
Affected configurations
A deployment is affected when a CEL rule grants compiler authority conditionally, so that the same executable is permitted in one context and denied in another. Rules that grant compiler authority unconditionally are unaffected, because there is no context for a cached answer to contradict. Fallback compiler results are also unaffected, since Santa reduces those to an ordinary allow.
The transitive-rule consequence additionally requires
EnableTransitiveRules, which is off unless a configuration profile or sync server turns it on.The stored answer is tied to the executable as it exists on disk. It does not survive a cache flush, modification of the file, unmounting the volume it lives on, a daemon restart, or a reboot.
Granting compiler authority conditionally is an uncommon policy shape. Compiler authority is already a broad grant, and deployments that use it generally target build tooling regardless of how it is invoked. If you use compiler rules at all, check whether any of them are conditional.
What changes in 2026.7
A compiler decision that came from a context-dependent rule now authorizes only the invocation that produced it. Each later execution of the same file re-evaluates the rule.
Administrators using conditional compiler rules should expect executions that previously succeeded to start being denied, since those were the invocations relying on a reused answer. Rules that grant compiler authority unconditionally behave as before and continue to be cached.
Affected versions
<= 2026.62026.7CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:H/SA:NMitigation
Upgrade to Santa
2026.7or later.On affected versions, administrators can remove the exposure through policy:
EnableTransitiveRulesis on. It is off by default, and the durable-rule consequence does not apply when it is off.Credit
Reported by OpenAI Codex Security, Jamie Brim (@jamieb-oai).