ABAC Vision: Complexity with "Deny" type permission policies
BLUF (Bottom Line Up Front)
During the stress-testing of our Zero Trust decision chain, we uncovered a flaw in how our linear flowchart handles Effect: Deny policies. Attempting to force an "Explicit Deny" (blacklist) through our single-pass architecture results in a "Blacklist Paradox" that paralyzes the system and locks out authorized users. Consequently, we must either restrict the MVP to positive Allow conditions only, or think about building a multi-stage evaluation engine.
Below is the detailed post-mortem of how we arrived at this conclusion, the explanation of the logic trap, and a proposed architectural blueprint required if we choose to support “Explicit Deny” policies
.
Part 1: The Initial Stance (The Need for a Fail-Safe)
Initially, we validated the Policies grant access? -> Denied -> Access Denied path on our flowchart as a critical INFOSEC fail-safe.
The Intent: We needed a mechanism for administrators to create surgical "Nuclear Overrides." If a specific threat emerges (e.g., a compromised subnet or an unmanaged device type), Security Operations needs to deploy an
Effect: Denypolicy that instantly neutralizes the threat.The Assumption: We assumed our single-pass linear flowchart could handle this because if a threat matched the "bad" attributes, the engine would read the
Denyeffect and route them toAccess Denied.
Part 2: The Logical Collapse (The Blacklist Paradox)
The collapse of this assumption occurred when we stress-tested how a safe user interacts with an Explicit Deny policy within our current linear flowchart.
The Scenario: InfoSec creates a single Explicit Deny policy:
Target: download_file,Effect: Deny,Condition: Device == Unmanaged.The Test Subject: A safe user operating on a Managed device attempts to download a file.
The Fatal Trace (Using our single-pass flowchart):
Existence Check: Are there policies applying to this action? –> YES. (The InfoSec Deny policy exists). Legacy RBAC is now bypassed.
Attribute Match: Do user & session attributes match the policy? –> The engine asks: "Is this user Unmanaged?" The answer is NO. The user is Managed.
The Routing Failure: On our flowchart, the
NOpath exiting the Attribute Match diamond routes directly to Access Denied.
The Paradox: Because our architecture is built on an Implicit Deny backbone (if you don't match a policy's attributes, you are blocked), running a blacklist policy through it ironically blocks everyone who isn't on the blacklist. The safe user failed to meet the conditions of the blacklist, so the system implicitly denied them. The system bricked itself.
Part 3: The MVP Scope Reduction
To resolve this without expanding timelines, the immediate recommendation was to drop Effect: Deny from the MVP.
The Logic: If we force administrators to write Positive Conditions Only (e.g.,
Effect: Allow, Condition: Device == Managed), our linear flowchart works flawlessly.The Protection: Because we enforce a Strict Intersection (Logical AND) combining algorithm for multiple policies, we don't technically need Explicit Deny to stop overly broad policies. If a junior admin writes "Allow Everyone," it is logically
ANDed against InfoSec's "Allow only Managed Devices," resulting in a secure perimeter. Dropping Explicit Deny keeps the MVP mathematically pure and highly performant.
Part 4: Proposal on How to Support Explicit Deny Policies
If we decide that dropping Explicit Deny is unacceptable for our enterprise or DoD customers, we must abandon the single-pass flowchart. We cannot evaluate Allow policies and Deny policies in the same linear step.
To support Explicit Deny without triggering the Blacklist Paradox, and without violating our strict "Denied by Default" mandate, the Policy Decision Point (PDP) must execute a multi-loop engine, evaluating blacklists before whitelists.
Here is the proposed routing in detail:
Phase 0: Jurisdiction & The Fallback Check
Question: Are there any Permission or Resource policies (Allow or Deny) applying to this action?
If NO: Fall back to the legacy RBAC block.
If YES: Enter the ABAC Engine. Legacy RBAC is now permanently bypassed for this request.
Phase 1: The Explicit Deny Loop (The Blacklist)
Question: Does the user positively match any
Effect: Denyconditions?If YES: Access Denied. (Terminal. The threat is neutralized).
If NO: Proceed to Phase 2. (Surviving a blacklist does not grant access; it only means you are not explicitly banned).
Phase 2: The Explicit Allow Loop (The Whitelist)
Question: Are there any
Effect: Allowpolicies, AND does the user positively satisfy the Strict Intersection (AND) of all of them?If YES: Access Granted. (Terminal).
If NO: Access Denied. (This is the strict Option 1 Implicit Deny. You survived the blacklist, but you failed to meet the positive requirements of the whitelist).
Note: This routing guarantees that if a user fails the Allow loop, they are explicitly denied. They do not fall back to RBAC, preventing role-based loopholes.
Part 5: The Strategic "Why" (Business Case for Explicit Deny)
While the multi-stage engine increases complexity (and possibly backend latency?), there are three reasons Tier-1 defense and enterprise clients might eventually demand it:
The Tactical Kill Switch: In an active cyber incident, a Security Operations Center (SOC) cannot waste time auditing 50 different
Allowpolicies to ensure a compromised IP subnet is excluded from all of them. An Explicit Deny allows them to deploy a single, global rule that instantly supersedes all other logic across the platform.The "Orphaned Policy" Risk If linear evaluation fails, the easy engineering solution is to drop
Effect: Denyentirely and force administrators to only write positiveAllowconstraints. Because we use a Strict Intersection (AND) algorithm, overlappingAllowpolicies theoretically tighten the perimeter.
However, this introduces the Orphaned Policy (Accidental Granter) vulnerability.
The Disaster Scenario (Using onlyAllowpolicies):HR's Policy:
Allow IF Rank >= MajorInfoSec's Policy:
Allow IF Device == ManagedCombined State: User must be a Major AND Managed. (Secure).
During a system cleanup, an HR admin accidentally deletes their rank policy. Now, a Private on a Managed Device tries to download a file. The engine checks the only remaining policy (InfoSec's). The Private is on a Managed Device. Access Granted. InfoSec's policy, which was only ever intended to be a hardware constraint, has accidentally become the sole granter of access for the entire organization.
The Explicit Deny Solution: If InfoSec instead writes an Explicit Deny (Deny IF Device == Unmanaged), they create a permanent negative constraint. If HR deletes their Allow policy, the Explicit Deny survives. When the Private on the Managed Device tries to download a file, they survive the Deny check, but because there are no Allow policies left to positively grant them access, they hit the Implicit Deny wall. Explicit Deny policies are essential because they only destroy access; they never build it. They are immune to the Orphaned Policy vulnerability.
Impact Level 6 (IL6) Auditing: It is cognitively simpler for an auditor to verify a single global guardrail ("Deny all access from outside the USA") than to prove the negative by reviewing every individual
Allowpolicy in the database.
Conclusion & Next Steps
We must make a definitive product sequencing decision.
Path A (Speed to Market): Drop Explicit Deny. Enforce positive
Allowconditions only. Keep the current linear flowchart.Path B (Enterprise Readiness): Scope the Multi-Stage Evaluation Engine into the MVP. It delays launch but delivers true hyperscale policy resolution.