<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>NIST on Matt Goodrich</title><link>https://mattgoodrich.com/tags/nist/</link><description>Recent content in NIST on Matt Goodrich</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 27 May 2026 12:00:00 -0700</lastBuildDate><atom:link href="https://mattgoodrich.com/tags/nist/index.xml" rel="self" type="application/rss+xml"/><item><title>Agents Need Capabilities, Not Roles</title><link>https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/</link><pubDate>Wed, 27 May 2026 12:00:00 -0700</pubDate><guid>https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/</guid><description>&lt;img src="https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/header.png" alt="Featured image of post Agents Need Capabilities, Not Roles" />&lt;p>&lt;strong>An AI agent is not a user, and permissioning one like a user is the most expensive shortcut in the AI rollout.&lt;/strong>&lt;/p>
&lt;p>A user is a person with judgment, a slow reaction time, and a strong incentive not to do anything that gets them fired. The permission model you grant a user assumes all three. A user with database write access does not, in practice, drop tables, because their hand stalls at the keyboard before the command runs.&lt;/p>
&lt;p>An agent has none of those properties. It executes the action it was prompted into in milliseconds. It does not stall. It does not weigh the social consequence. It carries the user&amp;rsquo;s identity, and therefore the user&amp;rsquo;s access, but applies none of the user&amp;rsquo;s judgment. The shortcut of just inheriting the invoking user&amp;rsquo;s auth at agent runtime is the version of this mistake most companies are making right now, and the bill for it will come due in a postmortem nobody wants to write.&lt;/p>
&lt;p>I argued in &lt;a class="link" href="https://mattgoodrich.com/posts/ai-governance-existing-controls-identity-guardrails/" >AI Governance, Calibrated&lt;/a> that most of the controls we need already exist and the gap is the identities granted to agents. This post goes one layer deeper. The identity model itself has to change. The right model has been sitting in security infrastructure for fifty years. Most teams just have to apply it.&lt;/p>
&lt;h2 id="security-has-known-this-since-1973">Security Has Known This Since 1973
&lt;/h2>&lt;p>Unix shipped with &lt;code>rwx&lt;/code> in the early seventies, and POSIX formalized it in 1988. Three bits per principal, granting one specific action each: read, write, execute. It is the original implementation of action-based authorization. The system did not ask whether you were &lt;em>senior&lt;/em> or &lt;em>trusted&lt;/em>. It asked whether the action you were trying to perform was on your list. The granularity was the action, not the role.&lt;/p>
&lt;p>Capability-based security predates even that. &lt;a class="link" href="https://dl.acm.org/doi/10.1145/365230.365252" target="_blank" rel="noopener"
>Dennis and Van Horn published the idea in 1966&lt;/a>: instead of asking the system whether a subject is allowed to take an action against an object, hand the subject an unforgeable token (a &lt;em>capability&lt;/em>) that authorizes the specific action against the specific object. The model held for decades, mostly in academic and high-assurance contexts, because issuing and revoking capabilities at scale was inconvenient.&lt;/p>
&lt;p>The cloud era brought it back. &lt;a class="link" href="https://docs.aws.amazon.com/IAM/UserGuide/reference_policies_actions-resources-contextkeys.html" target="_blank" rel="noopener"
>AWS IAM actions&lt;/a> are exactly this idea, named in modern form. &lt;code>s3:GetObject&lt;/code> is read. &lt;code>s3:PutObject&lt;/code> is write. &lt;code>iam:DeleteRole&lt;/code> is destruction. The policy grants the action against the resource, and the identity is just whoever happens to carry the policy. OAuth scopes are the same thing at the application layer. &lt;code>read:user&lt;/code>, &lt;code>write:repo&lt;/code>, &lt;code>admin:org&lt;/code>: each scope is a capability the third-party app received from the user. Modern security architects have been writing these policies for fifteen years.&lt;/p>
&lt;p>What none of that was designed for was an identity that acts thousands of times per minute at machine speed and was never told no by an HR conversation. That is what an AI agent is. The heritage is right; the application has to catch up.&lt;/p>
&lt;h2 id="six-action-classes-by-blast-radius">Six Action Classes by Blast Radius
&lt;/h2>&lt;p>The granularity of &amp;ldquo;every AWS IAM action&amp;rdquo; works for human-written IAM policies, but it is too fine for governing an agent&amp;rsquo;s overall behavior. An agent that can call &lt;code>s3:GetObject&lt;/code> against ten buckets but not &lt;code>s3:DeleteObject&lt;/code> against any is doing something coherent at the policy level and incoherent at the program level. The security-relevant question for an agent is not &amp;ldquo;which API calls is it allowed to make,&amp;rdquo; it is &amp;ldquo;what class of damage can it do, and how reversible is that damage.&amp;rdquo;&lt;/p>
&lt;p>Six classes, grouped by what fails if it is wrong, and ordered by escalating blast radius.&lt;/p>
&lt;p>&lt;strong>Observation.&lt;/strong> Reads, queries, searches, inspections. The agent looks at something but does not change it. Reversible by definition, because the system state does not move. Default-grant for any new agent within its data classification boundary.&lt;/p>
&lt;p>&lt;strong>Drafting.&lt;/strong> Recommendations, summaries, proposed changes that exit the system as text to a human or another agent for review. The output is consumed downstream but no state in the system has been modified. Reversible because the &lt;em>agent&lt;/em> did not act, the downstream consumer did.&lt;/p>
&lt;p>&lt;strong>Modification.&lt;/strong> Writes, updates, configuration changes inside the system. Reversible with effort: a git revert, a configuration rollback, a database restore. Default-deny; granted per workflow with logging and a defined recovery path.&lt;/p>
&lt;p>&lt;strong>Sanction.&lt;/strong> Approvals, denials, escalations. The agent makes a downstream-binding decision on someone else&amp;rsquo;s behalf: approves a refund, denies a ticket, escalates a deal-terms negotiation. Reversibility depends on what the downstream consumer does. Default-deny; granted only with a maker-checker pattern in place.&lt;/p>
&lt;p>&lt;strong>Execution.&lt;/strong> Triggering side effects beyond the current system. Running a deployment, kicking off a workflow, initiating a transaction, posting to a customer-facing channel. The agent has reached out of the sandbox. Default-deny; granted only with a documented kill switch and a per-action approval policy.&lt;/p>
&lt;p>&lt;strong>Destruction.&lt;/strong> Deletes, revokes, permanent terminations. Irreversible by definition. Default-deny, always, with no exceptions automated by the agent itself. Every destruction action escalates to a named human, regardless of the agent&amp;rsquo;s confidence in itself.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Class&lt;/th>
&lt;th>Example actions&lt;/th>
&lt;th>Reversibility&lt;/th>
&lt;th>Default policy and grant requirement&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Observation&lt;/strong>&lt;/td>
&lt;td>Reads, queries, searches, inspections&lt;/td>
&lt;td>Reversible by definition&lt;/td>
&lt;td>Default-grant within data classification boundary&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Drafting&lt;/strong>&lt;/td>
&lt;td>Recommendations, summaries, proposed changes that exit as text for review&lt;/td>
&lt;td>Reversible — downstream consumer acts, not the agent&lt;/td>
&lt;td>Earned after Observation period; review and acceptance rate tracked&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Modification&lt;/strong>&lt;/td>
&lt;td>Writes, updates, configuration changes inside the system&lt;/td>
&lt;td>Reversible with effort (revert, rollback, restore)&lt;/td>
&lt;td>Default-deny; granted per workflow with logging and a defined recovery path&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Sanction&lt;/strong>&lt;/td>
&lt;td>Approvals, denials, escalations on someone else&amp;rsquo;s behalf&lt;/td>
&lt;td>Depends on what the downstream consumer does&lt;/td>
&lt;td>Default-deny; granted only with a maker-checker pattern in place&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Execution&lt;/strong>&lt;/td>
&lt;td>Deployments, transactions, customer-facing posts&lt;/td>
&lt;td>Often irreversible&lt;/td>
&lt;td>Default-deny; granted only with a documented kill switch and per-action approval policy&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Destruction&lt;/strong>&lt;/td>
&lt;td>Deletes, revokes, permanent terminations&lt;/td>
&lt;td>Irreversible by definition&lt;/td>
&lt;td>Default-deny always; every action escalates to a named human&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Read this as a security-architecture reference, not as a coined dichotomy. The class names are what I find useful; the underlying axis is what matters. What does the agent do? What fails if it is wrong? How hard is it to put back? Every authorization decision an agent&amp;rsquo;s policy makes is one of those three questions answered.&lt;/p>
&lt;h2 id="promotion-through-classes-is-the-trust-ladder">Promotion Through Classes Is the Trust Ladder
&lt;/h2>&lt;p>A new agent does not get all six classes on day one. It gets &lt;em>Observation&lt;/em> and earns the rest, one class at a time, against measured evidence.&lt;/p>
&lt;p>The promotion path runs from least to most consequential. An agent in &lt;em>Observation&lt;/em> runs read-only against the systems in its scope, with full logging. After a defined observation period (measured in incidents avoided and false positives caught, not calendar days), the agent earns &lt;em>Drafting&lt;/em>. Its output goes to humans for review, the review is logged, and the percentage of accepted drafts is tracked. After a second window of measured eval, with the catch rate of its reviewer holding above threshold, &lt;em>Modification&lt;/em> unlocks with a per-write approval gate. &lt;em>Sanction&lt;/em> requires the maker-checker pattern to be wired in and measured for false-positive rate on the checker. &lt;em>Execution&lt;/em> requires a documented kill switch tested in a non-production drill. &lt;em>Destruction&lt;/em> may never unlock at all for some agents, and that is the correct answer.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/diagram-trust-ladder.png"
width="595"
height="2541"
srcset="https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/diagram-trust-ladder_hu3577549802464180522.png 480w, https://mattgoodrich.com/posts/agents-need-capabilities-not-roles/diagram-trust-ladder_hu9597434463706962401.png 1024w"
loading="lazy"
alt="Trust ladder: six action classes connected by measurement gates, with demotion automatic on threshold breach"
class="gallery-image"
data-flex-grow="23"
data-flex-basis="56px"
>&lt;/p>
&lt;p>The mistake every team makes here is allowing time to substitute for evidence. Six months on the job is not promotion criteria. A measured drift indicator within tolerance, an incident rate at or below baseline, a reviewer catch rate above a numerical threshold: those are promotion criteria. Demotion is automatic on threshold breach.&lt;/p>
&lt;p>The shape of this ladder is not new either. &lt;a class="link" href="https://csrc.nist.gov/pubs/sp/800/37/r2/final" target="_blank" rel="noopener"
>NIST SP 800-37&amp;rsquo;s Risk Management Framework&lt;/a> already structures the &lt;em>authorize-to-operate&lt;/em> progression as a sequence of gates evidenced by measurement. &lt;a class="link" href="https://www.fedramp.gov/" target="_blank" rel="noopener"
>FedRAMP&amp;rsquo;s authorization levels&lt;/a> follow the same pattern. What changes for agents is the cadence. Human service accounts get promoted over months. Agents have to be re-evaluated continuously, because the model underneath them changes, and so does the input distribution they operate on.&lt;/p>
&lt;h2 id="mapping-to-the-isms-you-already-run">Mapping to the ISMS You Already Run
&lt;/h2>&lt;p>Here is the part that most agent-governance content skips, and most security leaders will care about most. The framework above does not require a new control set. It maps onto the standards already in your ISMS.&lt;/p>
&lt;p>The action-class taxonomy maps to &lt;strong>&lt;a class="link" href="https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final" target="_blank" rel="noopener"
>NIST SP 800-53 AC family&lt;/a>&lt;/strong> directly. &lt;em>Observation&lt;/em> is AC-3 access enforcement against the read role. &lt;em>Modification&lt;/em> and &lt;em>Destruction&lt;/em> fall under AC-6 Least Privilege and AC-6(9) Auditing of Privileged Use. &lt;em>Execution&lt;/em> triggers AC-17 Remote Access concerns. The agent&amp;rsquo;s per-class authorization policy is just an AC-2 Account Management exercise with the agent as a new class of account.&lt;/p>
&lt;p>The promotion ladder maps to &lt;strong>&lt;a class="link" href="https://csrc.nist.gov/pubs/sp/800/37/r2/final" target="_blank" rel="noopener"
>NIST SP 800-37 Risk Management Framework&lt;/a>&lt;/strong>. The agent goes through Categorize, Select, Implement, Assess, Authorize, Monitor exactly the way a system component does. Each class-promotion is an authorize-to-operate decision with evidence packaged for the AO.&lt;/p>
&lt;p>The evidence-packet discipline maps to &lt;strong>&lt;a class="link" href="https://csrc.nist.gov/pubs/sp/800/218/a/final" target="_blank" rel="noopener"
>NIST SP 800-218A&lt;/a>&lt;/strong> (Secure Software Development Framework for AI Systems). The packet is what the SSDF asks for: artifact-level proof of testing, adversarial probing, and human review.&lt;/p>
&lt;p>The agent-as-a-managed-system view maps to &lt;strong>&lt;a class="link" href="https://www.iso.org/standard/42001" target="_blank" rel="noopener"
>ISO/IEC 42001:2023&lt;/a> Annex A&lt;/strong>. A.6 covers the AI lifecycle (design through operation). A.9 covers the responsible use of the system. A.10 covers supplier and customer relationships when the agent acts on someone&amp;rsquo;s behalf.&lt;/p>
&lt;p>The threat surface maps to &lt;strong>&lt;a class="link" href="https://genai.owasp.org/resource/agentic-ai-threats-and-mitigations/" target="_blank" rel="noopener"
>OWASP Agentic AI Threats v1.1&lt;/a>&lt;/strong>. Privilege Compromise (action-class scoping is the mitigation), Tool Misuse (the tool surface is enumerated and bounded), Resource Overload (cost cap and rate limit), Memory Poisoning (the &lt;em>Modification&lt;/em> class includes memory writes and requires the same governance as state writes).&lt;/p>
&lt;p>None of this is new control work. It is mapping the agent into the existing controls. The ISMS already has the management-system spine: risk assessment, policy, internal audit, management review, continual improvement. The agent extends the scope; it does not start a parallel program.&lt;/p>
&lt;h2 id="what-holds-the-taxonomy-up-in-production">What Holds the Taxonomy Up in Production
&lt;/h2>&lt;p>Three pieces of operational discipline make the action-class taxonomy work in production. None of them are AI-specific; all of them are sharper now because the agent acts faster than the human reviewer.&lt;/p>
&lt;p>&lt;strong>The evidence packet.&lt;/strong> Every consequential output the agent produces ships with a packet: the spec it was given, the tests run against the output, the adversarial probes (fuzzing, prompt-injection, edge cases), the static analysis or symbolic exploration results where they apply, the change history, and the signature of the reviewer (human or agent) that signed off. The packet is the audit trail a future investigator will look at, and it is the eval set the next month&amp;rsquo;s drift detection will run against. It is also what an auditor wants instead of &amp;ldquo;the agent did this and we trust it.&amp;rdquo; &lt;a class="link" href="https://slsa.dev/" target="_blank" rel="noopener"
>SLSA&lt;/a> gave us this discipline for build provenance. Agents need it for action provenance.&lt;/p>
&lt;p>&lt;strong>The maker-checker pattern.&lt;/strong> A primary agent makes the proposal. A second system, whether a review agent with a different objective function, a hard-coded check, or a human at the consequential gates, examines whether the proposal matches the spec, fits within policy, and avoids the irreversible class without explicit authorization. The pattern is older than computing; banking has run it for centuries. The novel part is making the checker an agent rather than a person at the volumes agents now produce. OpenAI&amp;rsquo;s internal alignment team &lt;a class="link" href="https://alignment.openai.com/scaling-code-verification/" target="_blank" rel="noopener"
>published a number worth remembering&lt;/a>: their Codex-based PR reviewer leaves comments that the author addresses with a code change 52.7% of the time. That is the right kind of metric. Calibrate your eval coverage against the checker&amp;rsquo;s measured catch rate, not against the absence of incidents.&lt;/p>
&lt;p>&lt;strong>Escalation triggers.&lt;/strong> Some conditions always escalate, regardless of agent state: any action in the &lt;em>Destruction&lt;/em> class, any &lt;em>Execution&lt;/em> against production. Some escalate based on agent state: cost over threshold, the agent&amp;rsquo;s own confidence below cutoff, telemetry drift against baseline. &lt;a class="link" href="https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf" target="_blank" rel="noopener"
>NIST AI 600-1&lt;/a> MG-2.4-001 and MG-2.4-002 already require auto-suspension on resource consumption breaches; OWASP Agentic adds confidence-based and drift-based escalation. The work is not deciding &lt;em>whether&lt;/em> to escalate. The standards already say. The work is choosing the thresholds and the path.&lt;/p>
&lt;h2 id="where-this-fails">Where This Fails
&lt;/h2>&lt;p>The action-class taxonomy carries the load for everything that maps cleanly to permission, but three concerns do not, and the post would oversell if it skipped them.&lt;/p>
&lt;p>&lt;strong>Memory poisoning has no Unix analog.&lt;/strong> An agent&amp;rsquo;s memory layer is not a file with rwx bits on it. When upstream input contains instructions that change the agent&amp;rsquo;s future behavior (a document the agent retrieved, a tool response, a teammate-agent message), no per-action policy catches it. The mitigation is OWASP&amp;rsquo;s: session isolation, source attribution for memory updates, version control on the memory layer, snapshots for forensic rollback. None of those look like POSIX. This is genuinely new security work.&lt;/p>
&lt;p>&lt;strong>Prompt injection lives at the tool boundary.&lt;/strong> A tool that returns text the agent will read can contain instructions the agent will follow. Action-class authorization does not stop the agent from reading the malicious text and then performing an authorized action it was tricked into performing. The mitigation is at the tool layer (sanitize inputs, contain tool outputs, never let an agent loop indefinitely on uncontrolled inputs), and it is partially solvable, but the solution is not the action taxonomy.&lt;/p>
&lt;p>&lt;strong>Cost runaway is fast.&lt;/strong> A human service account that decides to retry an expensive API call eats one cycle of cost and gets noticed at scale. An agent that decides to retry can burn the monthly cloud budget in an hour. The kill switch has to fire on cost the same way it fires on irreversibility, and the cost telemetry has to be in the agent&amp;rsquo;s loop, not in a dashboard a human reviews next week.&lt;/p>
&lt;p>The action-class taxonomy is the right model for what an agent &lt;em>does&lt;/em>. It is not the model for what gets &lt;em>done to&lt;/em> the agent, or for what the agent does to itself. Those need their own controls, and they need to be wired in alongside the per-class policy, not instead of it.&lt;/p>
&lt;h2 id="what-posix-knew-applied-forward">What POSIX Knew, Applied Forward
&lt;/h2>&lt;p>The security discipline that governs an AI agent has been written down for fifty years. POSIX scoped the action to the file. Capability-based security gave the action a token. AWS IAM actions and OAuth scopes generalized the model. The principle has been the same since 1973: the permission belongs to the action, not the identity.&lt;/p>
&lt;p>What is new in 2026 is that the identity now acts faster than the change-management process can move. The mitigation is not a new framework. It is a tighter application of the framework already in your ISMS, with the agent enrolled as the new class of privileged service account it actually is.&lt;/p>
&lt;p>Permission an agent the way you would permission any service account that runs as root in production: by action, by blast radius, by the evidence it can produce. The architecture is half a century old. The work is teaching your existing program to apply it to a new kind of caller.&lt;/p></description></item></channel></rss>