Agent skill

semi-trusted-roles

Trigger Pattern SEMI_TRUSTED_ROLE flag (required) - Inject Into Breadth agents, depth-state-trace

Stars 215
Forks 33

Install this agent skill to your Project

npx add-skill https://github.com/PlamenTSV/plamen/tree/main/agents/skills/sui/semi-trusted-roles

SKILL.md

Skill: Semi-Trusted Role Analysis (Sui)

Trigger Pattern: SEMI_TRUSTED_ROLE flag (required) Inject Into: Breadth agents, depth-state-trace Purpose: Analyze capability-based privilege model in Sui Move protocols for both role-to-user and user-to-role attack vectors

Trigger Patterns

AdminCap|OwnerCap|TreasuryCap|OperatorCap|KeeperCap|GovernanceCap|
MinterCap|ManagerCap|UpgradeCap|PublisherCap|has_cap|assert_cap|
capability|cap_check|admin_only

Reasoning Template

Step 1: Inventory Role Permissions

Enumerate ALL capability objects in the protocol:

Capability Type Abilities Holder Functions Callable State Modifiable Transferable?
{AdminCap} {key, store?} {deployer/multisig} {list all functions requiring &AdminCap} {list state} {YES if has store / NO if only key}

Sui capability model:

  • Capabilities are owned objects. Holding the object = having the role.
  • key ability: object can exist on-chain. Transferred with transfer::transfer (module-only) or transfer::public_transfer (if also has store).
  • key + store: freely transferable by anyone. High risk -- capability can be sent to arbitrary addresses.
  • key only: transferable only by the defining module's functions. Lower risk -- controlled transfer.
  • Capabilities are checked by reference: fun admin_action(cap: &AdminCap, ...) -- presence of reference proves ownership.

For each capability at {CAPABILITY_OBJECTS}:

  • What state does it grant access to modify?
  • What external calls does it authorize?
  • What parameters does it allow setting?
  • Is the capability shared (share_object) or owned? Shared caps are NOT single-holder.

Step 2: Analyze Within-Scope Abuse

For each permitted action, ask:

Timing Abuse:

  • Can {ROLE_NAME} execute at harmful times? (front-run users via shared object contention, during rebalance)
  • Can {ROLE_NAME} delay execution to harm users? (withhold keeper actions)

Parameter Abuse:

  • Can {ROLE_NAME} pass harmful parameters? (max slippage, wrong recipient, extreme fee)
  • Are parameters validated against bounds, or trusted implicitly?

Sequence Abuse:

  • Can {ROLE_NAME} execute operations out of order?
  • Can {ROLE_NAME} skip required operations in a multi-step flow?

Omission Abuse:

  • Can {ROLE_NAME} harm users by NOT acting? (skip price update, delay distribution, not calling keeper function)

Step 3: Model Attack Scenarios

Scenario A: Timing Attack
1. {ROLE_NAME} monitors pending transactions on shared objects
2. {ROLE_NAME} submits transaction to modify shared object state
3. Due to Sui's object-based execution, contention determines ordering
4. User's transaction executes with worse conditions
5. Impact: {TIMING_IMPACT}

Scenario B: Parameter Attack
1. {ROLE_NAME} calls {ROLE_FUNCTION} with {MALICIOUS_PARAMS}
2. Parameters are not validated against {EXPECTED_CONSTRAINTS}
3. Impact: {PARAM_IMPACT}

Scenario C: Key Compromise / Capability Theft
1. {ROLE_NAME} capability object is transferred to attacker
2. If cap has `store` ability: attacker can receive it via `transfer::public_transfer`
3. Attacker can call: {ROLE_FUNCTIONS}
4. Maximum extractable value: {MAX_DAMAGE}
5. Recovery options: {RECOVERY_PATH}
   - Can a higher-level cap revoke or re-create the compromised cap?
   - Is there an UpgradeCap that can patch the module?

Scenario C2: Shared Capability Abuse
1. {ROLE_NAME} capability is a shared object (created via `transfer::share_object`)
2. ANY user can include the shared cap in their PTB as `&SharedCap` reference
3. Attacker calls admin functions by passing the shared cap reference
4. Attacker can atomically compose admin operations with exploitation in a single PTB
5. Maximum extractable value: {MAX_DAMAGE}
6. NOTE: Shared caps effectively give EVERYONE the admin role -- this is almost always a critical finding

Step 4: Assess Mitigations

Mitigation Present? Effective?
Timelock on {ROLE_NAME} actions YES/NO {clock-based delay?}
Multisig ownership (Sui multisig or custom) YES/NO {threshold?}
Removal/revocation function for {ROLE_NAME} YES/NO {who can revoke?}
Rate limits or cooldowns (clock-based) YES/NO {duration?}
Parameter bounds enforcement YES/NO {min/max checked?}
UpgradeCap held separately YES/NO {who holds it?}

Does a removal/revocation function for {ROLE_NAME} EXIST? If NO -> FINDING: capability is irrevocable without module upgrade. Severity: minimum Medium if cap can modify user-facing state.

Capability transfer control:

  • If cap has store: anyone holding it can transfer freely. Is this intended?
  • If cap has only key: only module functions can transfer. Are those functions properly access-controlled?
  • Is there a destroy function for the capability? If NO and cap has store: it can never be burned.
  • Is the capability frozen (immutable via transfer::freeze_object)? Frozen caps can be read (&Cap) but not consumed or mutated -- limits authorized actions to read-only gating.

PTB composition risk: Can the capability holder compose a PTB that atomically: (1) changes parameters via admin function, (2) exploits the changed parameters via user function? If YES and cap is owned by a semi-trusted role -> the role can atomically manipulate + exploit without time for users to react.

Step 5: Model User-Side Exploitation (Reverse Direction)

Predictability Analysis:

  • Is the role's behavior predictable? (scheduled tasks, triggered by events, epoch-based)
  • Can users observe when the role will act via on-chain state?
  • Can users front-run or back-run the role's actions via shared object contention?

Scenario D: User Exploits Keeper Timing

1. User observes that {ROLE_NAME} executes {ROLE_ACTION} at predictable times (e.g., epoch boundaries)
2. User positions themselves before {ROLE_ACTION} (deposit/stake before reward distribution)
3. {ROLE_ACTION} executes, changing state
4. User benefits from known state change
5. Impact: {USER_EXPLOIT_IMPACT}

Scenario E: User Griefs Role Preconditions

1. {ROLE_FUNCTION} has precondition: {PRECONDITION} (stored in shared object)
2. User calls a permissionless function that modifies the shared object to violate {PRECONDITION}
3. {ROLE_NAME} calls {ROLE_FUNCTION}, which aborts
4. System enters degraded state (no keeper actions possible)
5. Impact: {GRIEF_IMPACT}

Scenario F: User Forces Suboptimal Role Action

1. {ROLE_NAME} must choose between options based on shared object state
2. User manipulates shared object state to make worst option appear best
3. {ROLE_NAME} (following honest behavior) chooses suboptimal path
4. User profits from forced suboptimal execution
5. Impact: {SUBOPTIMAL_IMPACT}

Scenario G: Same-Chain Rate Staleness via Discrete Updates

1. Protocol's exchange rate only updates when {ROLE_NAME} acts (discrete updates)
2. Between role actions, rate is stale -- does not reflect accumulated value
3. User monitors for {ROLE_NAME} pending transaction on shared object
4. User enters at stale rate (favorable), {ROLE_NAME} executes, rate updates
5. User exits at updated rate (or holds appreciating position)
6. Impact: {RATE_ARBIT_IMPACT}

Step 6: Precondition Griefability Check

For each function callable by {ROLE_NAME}:

Function Preconditions Stored In User Can Manipulate? Grief Impact
{func} balance > 0 Shared pool object YES - withdraw all Keeper stuck
{func} epoch elapsed Clock (0x6) NO - time-based N/A
{func} threshold met Shared config object YES - partial withdraw Delayed execution

Generic Rule: Any admin/keeper function precondition that depends on user-modifiable shared object state is potentially griefable.

Sui-specific griefability: Shared object contention can cause transaction ordering issues. If a keeper transaction and a user transaction both touch the same shared object, Sui's consensus determines ordering -- neither party can guarantee priority.

Step 6b: Admin/Privileged Function Griefability (EXHAUSTIVE)

MANDATORY: Enumerate ALL functions that require a capability parameter. Do NOT rely on manual scanning -- grep for all capability types found in Step 1.

For each function requiring ANY capability:

Function Required Cap Preconditions Shared Object Dependency? User Can Manipulate? Grief Impact
{admin_fn} {AdminCap} {preconditions} YES/NO YES/NO {impact if griefed}

Enumeration completeness check:

  • Grep count for functions accepting capability references: {N}
  • Functions analyzed in this table: {M}
  • If M < N -> INCOMPLETE -- analyze missing functions before proceeding

Specific checks:

  • Can users create shared object state that blocks admin operations? (pending withdrawals blocking migration, non-zero balances blocking cleanup)
  • Can users create dynamic field entries that block operations? (table entries preventing deletion)
  • Can users initiate multi-step operations whose in-flight state blocks admin actions?

RULE: If ANY admin function has a user-griefable precondition -> severity >= MEDIUM if it blocks critical protocol operations.

Key Questions (must answer all)

  1. What is the maximum damage if {ROLE_NAME} acts maliciously?
  2. What is the maximum damage if {ROLE_NAME} capability is stolen?
  3. Are there time-sensitive operations where {ROLE_NAME} timing matters?
  4. What user funds or protocol state can {ROLE_NAME} affect?
  5. Can users predict when {ROLE_NAME} will act?
  6. Can users manipulate preconditions to block {ROLE_NAME}?
  7. Can users profit by positioning around {ROLE_NAME}'s scheduled actions?
  8. What happens if {ROLE_NAME} cannot execute? (system degradation)
  9. Can users block admin operations via shared object state manipulation?

Common False Positives

  • View-only operations: If role can only read state, no abuse vector
  • Idempotent operations: If calling twice has same effect as once, timing abuse is limited
  • User-initiated dependency: If role action requires user to initiate first, front-running may not apply
  • Economic alignment: If role is economically aligned (staked collateral), malicious action has cost
  • Module-locked capability: If cap has only key and no transfer function exists, theft requires module compromise

Instantiation Parameters

{CONTRACTS}           -- Move modules to analyze
{ROLE_NAME}           -- Specific capability type (AdminCap, OperatorCap, etc.)
{CAPABILITY_OBJECTS}  -- Capability object types and their abilities
{ROLE_FUNCTIONS}      -- Functions this capability grants access to
{USER_ACTION}         -- User action that could be front-run
{ROLE_ACTION}         -- Role action used in attack
{TIMING_IMPACT}       -- Impact of timing attack
{MALICIOUS_PARAMS}    -- Harmful parameter values
{EXPECTED_CONSTRAINTS}-- What params should be validated against
{PARAM_IMPACT}        -- Impact of parameter attack
{MAX_DAMAGE}          -- Maximum extractable value
{RECOVERY_PATH}       -- How to recover from compromise

Output Schema

Field Required Description
capability_inventory yes All capability objects and their permissions
timing_vectors yes Timing-based abuse opportunities
parameter_vectors yes Parameter-based abuse opportunities
omission_vectors yes Harm from inaction
user_exploit_vectors yes How users can exploit the role (reverse direction)
transfer_risk yes Capability transferability analysis
max_damage yes Worst-case damage assessment
mitigations yes Existing protections
finding yes CONFIRMED / REFUTED / CONTESTED / NEEDS_DEPTH
evidence yes Code locations with line numbers
step_execution yes Status for each step

Step Execution Checklist (MANDATORY)

Step Required Completed? Notes
1. Inventory Role Permissions YES
2. Analyze Within-Scope Abuse YES
3. Model Attack Scenarios (A,B,C,C2) YES Including shared cap scenario
4. Assess Mitigations YES
5. Model User-Side Exploitation (D,E,F,G) YES MANDATORY -- never skip
6. Precondition Griefability Check YES MANDATORY -- never skip
6b. Admin Function Griefability YES MANDATORY -- never skip

Cross-Reference Markers

After Step 4 (Assess Mitigations):

  • DO NOT STOP HERE -- Steps 5-6 analyze the reverse direction
  • IF role has any preconditions depending on shared object state -> MUST complete Step 6

After Step 5 (User-Side Exploitation):

  • Cross-reference with TOKEN_FLOW_TRACING.md for token-related griefing vectors
  • IF keeper actions are predictable -> document MEV/front-running vectors

After Step 6 (Precondition Griefability):

  • IF any precondition is user-griefable -> severity >= MEDIUM
  • Document system degradation if keeper is blocked

Expand your agent's capabilities with these related and highly-rated skills.

Didn't find tool you were looking for?

Be as detailed as possible for better results