An access control decision is a boolean function \(f: (S, A, R, E) \rightarrow \{Allow, Deny\}\) where \(S\) = subject attributes, \(A\) = action, \(R\) = resource attributes, \(E\) = environment context.
\[P_{ABAC}(s,a,r,e) = \bigwedge_{i=1}^{n} C_i(s,a,r,e)\]
where \(C_i\) are policy conditions that must ALL evaluate to true for access to be granted.
Working through an example:
Given: Operator Bob requests “control actuator valve-42” at 14:00
Subject attributes: \(S = \{role: operator, dept: production, clearance: 2\}\)
Resource attributes: \(R = \{type: actuator, owner\_dept: production, criticality: medium\}\)
Environment: \(E = \{hour: 14, day: weekday, threat\_level: normal\}\)
Action: \(A = \{control\}\)
Step 1: Evaluate role condition \[C_1: S.role \in \{operator, admin\} \Rightarrow true\]
Step 2: Evaluate department match \[C_2: S.dept = R.owner\_dept \Rightarrow production = production \Rightarrow true\]
Step 3: Evaluate time window \[C_3: 6 \leq E.hour \leq 22 \Rightarrow 6 \leq 14 \leq 22 \Rightarrow true\]
Step 4: Final decision \[P_{ABAC} = C_1 \land C_2 \land C_3 = true \land true \land true = \textbf{Allow}\]
Result: Access granted. If time were 03:00, \(C_3\) would be false and entire policy would evaluate to Deny.
In practice: ABAC policies prevent privilege escalation by enforcing context (Bob can only control actuators in his department during work hours). In the 2013 Target breach, HVAC vendor credentials lacked department restrictions, allowing lateral movement from HVAC network to payment systems. Proper ABAC would have blocked cross-department access.