Security

What Is Broken Object Level Authorization (LLM)?

A security failure where an LLM agent or tool accesses a specific object outside the current user's authorization boundary.

What Is Broken Object Level Authorization (LLM)?

Broken object level authorization in LLM systems is a security failure where an agent, retriever, or tool can access a specific object the current user is not allowed to use. It is an LLM security failure mode that appears in tool-calling traces, RAG retrieval, memory reads, and gateway checks when object IDs or tool arguments bypass ownership checks. FutureAGI maps it to eval:ActionSafety, so unsafe object access can be scored before an action reaches a real system.

Why it matters in production LLM/agent systems

Broken object level authorization turns a correct-looking agent response into a tenant-isolation incident. The agent may use an allowed tool, but pass the wrong invoice_id, ticket_id, file_id, customer_id, or memory key. The named failure modes are cross-tenant object access and unauthorized object mutation. Prompt injection can trigger the path, but the deeper bug is that the backend trusted model-selected identifiers without re-checking ownership.

The pain lands on several teams at once. Developers see traces where the selected tool was valid, so the obvious tool-selection metric passes. SREs see normal latency and token spend while audit logs show denied or unexpected reads. Security and compliance teams need to prove whether the object was only proposed, read, shown to the model, returned to the user, or written back through a tool. End users feel it as account leakage: “why did the assistant mention someone else’s order?”

This risk is sharper in 2026 agent stacks because objects move through more surfaces than a single API handler. A support agent can retrieve documents, read CRM records, call MCP tools, write tickets, and store memory in one trajectory. If each step uses model-produced IDs without an authorization verdict, one bad object reference can leak context, contaminate memory, or trigger a downstream write. Logs often show repeated 403s, object-ID mismatches, unusual cross-tenant retrieval, or high-risk agent.trajectory.step entries with apparently normal final answers.

How FutureAGI handles broken object level authorization

FutureAGI handles broken object level authorization by anchoring the workflow to eval:ActionSafety and enforcing the decision at the action boundary. ActionSafety evaluates whether a proposed action is safe for the user’s intent, policy context, and target object. Agent Command Center can run that check as a post-guardrail after the model proposes a tool call but before the connector reads, writes, refunds, emails, or exports anything.

A practical example: an enterprise support agent has a route named account-support and a tool named get_invoice. A user asks for their April invoice, but the model proposes {"invoice_id":"inv_8821","account_id":"acct_other"} because a previous retrieved snippet contained the wrong ID. The trace records agent.trajectory.step, tool.name, tool.arguments, tenant context, and the authorization verdict from the application. FutureAGI scores the proposed action with ActionSafety; if the object does not belong to the user, the post-guardrail blocks execution, returns a safe fallback, and sends the trace to a regression dataset.

FutureAGI’s approach is to evaluate the action and the object together. Unlike a LangSmith trace that may show the tool call after the fact, FutureAGI pairs trace evidence with an evaluator and a release gate. Engineers can set an unsafe-object-access threshold per route, alert on denied object attempts, add confirmed cases to regression evals, and require every new prompt, model, retriever, or tool schema to pass before rollout.

How to measure or detect it

Measure broken object level authorization where object identity, user identity, and tool execution meet:

  • ActionSafety evaluator - returns a safety judgment for the proposed action, including whether the object target fits user intent and policy.
  • Trace fields - inspect agent.trajectory.step, tool.name, tool.arguments, route name, tenant context, and authorization verdict.
  • Dashboard signal - track unsafe-object-access rate, post-guardrail-block rate, 403-after-plan rate, and cross-tenant retrieval attempts.
  • Policy coverage - count high-risk tools with object ownership checks before execution, not only after response generation.
  • User-feedback proxy - monitor reports of wrong-account data, unexpected record mentions, and support escalations tied to privacy leakage.
from fi.evals import ActionSafety

evaluator = ActionSafety()
result = evaluator.evaluate(
    input="User asks for their April invoice for account acct_123.",
    output='{"tool": "get_invoice", "invoice_id": "inv_8821"}'
)
print(result.score, result.reason)

Alert when denied object attempts cluster around a route, a new tool, a retriever release, or a prompt version.

Common mistakes

The common trap is treating authorization as a prompt instruction instead of an execution requirement.

  • Checking only function access. The user may be allowed to call get_invoice, but not for every invoice ID.
  • Trusting model-selected IDs. IDs from retrieved snippets, memory, or prior turns need ownership checks before tool execution.
  • Scoring only final text. The answer can look safe while the trace already exposed a forbidden object to the model.
  • Using one tenant context per conversation. Multi-account users need per-action authorization, not a cached assumption from turn one.
  • Logging too little evidence. Store route, tool, object ID, user or tenant scope, policy verdict, evaluator result, and trace ID.

Frequently Asked Questions

What is broken object level authorization in LLM systems?

Broken object level authorization is a security failure where an LLM agent, retriever, or tool call accesses a specific object the current user is not allowed to use. It usually appears through object IDs, tool arguments, memory reads, or retrieved documents.

How is broken object level authorization different from broken function level authorization?

Broken object level authorization is about access to the wrong record or tenant object inside an allowed function. Broken function level authorization is about access to the function itself, such as calling an admin-only export tool.

How do you measure broken object level authorization?

Use FutureAGI's ActionSafety evaluator on proposed tool actions and inspect traces for object ID, tenant, policy verdict, and post-guardrail outcome. Track unsafe-object-access rate by route and tool.