Skip to content

Proposal: Capability-scoped tool authorization for AutoGen multi-agent pipelines #7528

@pshkv

Description

@pshkv

The security problem

When Agent A delegates a subtask to Agent B, and Agent B calls Tool X — what stops Tool X from being invoked with Agent A's full permission set?

AutoGen's recent OPA authorization work (#7524) addresses what an agent is allowed to do in isolation. But in multi-agent delegation chains, the question is subtler: does the delegated agent inherit, attenuate, or escalate the caller's permissions when it invokes tools?

Concretely:

Orchestrator (has: read_files, write_files, call_external_api)
  └─ delegates to: CodeReviewAgent
       └─ calls: file_write("malicious_output.py")  # should this be allowed?

Without capability scoping, the answer depends on how the tool was registered — and in most frameworks today, there's no mechanism to attenuate permissions through the delegation chain. The CodeReviewAgent can call anything the Orchestrator could call.

This is OWASP ASI04 (Privilege Escalation) and ASI06 (Excessive Agency) in the OWASP Agentic Security Initiative taxonomy.

A solution: attenuating capability tokens

SINT Protocol addresses this with Ed25519 capability tokens that enforce attenuation: a delegated agent can only receive a token equal-to or more-restrictive than the delegator's own token. Escalation is cryptographically impossible.

Here's a 15-line sketch of wrapping an AutoGen tool with SINT:

from autogen_agentchat.agents import AssistantAgent
from sint_autogen import sint_tool, CapabilityToken

# Token issued to the CodeReviewAgent — read-only on files, no external API calls
review_token = CapabilityToken(
    resources=["files://repo/**"],
    actions=["read"],           # NOT write, NOT call_external_api
    tier="T1_read",
    issued_to="code_review_agent",
    signed_by=orchestrator_key,
)

# Wrap the tool — SINT enforces the token's constraints at call time
@sint_tool(token=review_token)
def read_file(path: str) -> str:
    return open(path).read()

# Any call to write_file or call_external_api raises CapabilityViolation
agent = AssistantAgent("code_reviewer", tools=[read_file])

The orchestrator can't accidentally (or through prompt injection) grant the code reviewer more than read on files://repo/**.

Questions for the AutoGen team

  1. Is there a planned mechanism for tool-level capability scoping in multi-agent scenarios?
  2. Would an autogen_ext.tools.sint extension (similar to the existing MCP tool support) be an appropriate contribution path?
  3. Does AutoGen's GroupChat / Swarm pattern have any existing guardrails for inter-agent permission inheritance?

Happy to put together a concrete extension proposal or draft PR if there's interest. The packages/bridge-a2a in SINT already handles A2A-protocol agent delegation — AutoGen's tool-use pattern would be a natural next target.

/cc @microsoft/autogen-maintainers

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions