aptos-scanner
A specialized security auditing tool for Aptos-specific Move smart contract development.
Install
mkdir -p .claude/skills/aptos-scanner && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/11078" && unzip -o skill.zip -d .claude/skills/aptos-scanner && rm skill.zipInstalls to .claude/skills/aptos-scanner
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Use when the user wants to audit Aptos Move smart contracts, scan Aptos-specific patterns including global storage model, resource accounts, or coin modules, review Aptos DeFi protocols for framework module interaction vulnerabilities, or analyze Aptos-specific upgrade and governance patterns.Key capabilities
- →Audit Aptos Move contracts
- →Scan for resource safety issues
- →Review framework module interactions
- →Analyze upgrade patterns
How it works
It scans Move code for Aptos-specific patterns like global resource access, resource account capabilities, and framework module usage.
Inputs & outputs
When to use aptos-scanner
- →Auditing Aptos Move contracts
- →Scanning for resource safety issues
- →Reviewing DeFi protocol interactions
About this skill
Aptos Specialized Scanner
Specialized security scanner for Aptos Move smart contracts. Extends the general Move Scanner with Aptos-specific patterns, framework modules, and the global storage model.
Why a Separate Aptos Scanner?
While the Move Scanner covers language-level patterns shared between Aptos and Sui, Aptos has a fundamentally different storage model (global resources under addresses), framework (AptosFramework), and upgrade system that require dedicated detection rules.
| Feature | Aptos | Sui |
|---|---|---|
| Storage | Global resources under addresses | Object model |
| Resource access | move_to, borrow_global, move_from | Passed as function parameters |
| Upgrade | Module upgrade with compatibility policy | Package upgrade with UpgradeCap |
| Tokens | aptos_framework::coin | sui::coin with TreasuryCap |
| Accounts | Account + AuthenticationKey | No account concept |
| Randomness | aptos_framework::randomness (commit-reveal) | sui::random |
Detection Capabilities
| Category | Detection | Severity |
|---|---|---|
| Resource Safety | Resource created but never stored (move_to missing) | High |
| Resource Safety | borrow_global_mut without authorization check | Critical |
| Resource Safety | move_from extracting resource without ownership proof | Critical |
| Resource Safety | Missing exists<T>(addr) check before access | Medium |
| Abilities | Value-holding type with copy ability (duplication) | Critical |
| Abilities | Capability with drop (can be silently discarded) | High |
| Upgrade | Module upgrade authority is single EOA | High |
| Upgrade | compatible upgrade policy on critical module | Medium |
| Coin | MintCapability stored in publicly accessible location | Critical |
| Coin | CoinStore registration not checked before deposit | Medium |
| Auth | Missing signer parameter on privileged entry function | Critical |
| Auth | signer::address_of() not compared to authorized address | High |
| Auth | Resource account SignerCapability exposed publicly | Critical |
| Storage | Table/SimpleMap with unbounded growth | Medium |
| Storage | acquires annotation missing (compile-time, but indicates design) | Low |
| Events | State change without event emission | Low |
Aptos Framework Security-Critical Modules
| Module | Functions to Audit | Key Risk |
|---|---|---|
aptos_framework::coin | initialize, mint, burn, transfer, register | Cap management |
aptos_framework::account | create_account, rotate_authentication_key | Auth key rotation |
aptos_framework::resource_account | create_resource_account, retrieve_resource_account_cap | Signer cap leak |
aptos_framework::object | create_object, transfer, generate_signer | Object ownership |
aptos_framework::fungible_asset | mint, burn, transfer, deposit, withdraw | New token standard |
aptos_framework::multisig_account | create, execute_transaction | Multisig logic |
aptos_framework::staking_contract | create_staking_contract, distribute | Reward calculation |
aptos_framework::governance | create_proposal, vote | Voting power |
Common Aptos Vulnerability Examples
Resource Account Signer Capability Leak
// CRITICAL: SignerCapability stored with 'store' ability allows extraction
struct ResourceAccountCap has key, store {
signer_cap: account::SignerCapability,
}
// If anyone can get a reference to this struct, they can create a signer
// for the resource account and drain all its assets
public fun get_resource_signer(cap: &ResourceAccountCap): signer {
account::create_signer_with_capability(&cap.signer_cap)
}
// SAFE: No public accessor, internal only
struct ResourceAccountCap has key {
signer_cap: account::SignerCapability,
}
fun internal_get_signer() acquires ResourceAccountCap {
let cap = borrow_global<ResourceAccountCap>(@resource_addr);
let signer = account::create_signer_with_capability(&cap.signer_cap);
// Use signer internally only
}
Coin Registration Race Condition
// VULNERABLE: Depositing without checking CoinStore registration
public fun distribute_rewards(recipients: &vector<address>) {
let i = 0;
while (i < vector::length(recipients)) {
let addr = *vector::borrow(recipients, i);
// ABORTS if addr doesn't have CoinStore<RewardToken> registered!
coin::deposit(addr, reward_coins);
i = i + 1;
};
}
// SAFE: Check registration first
public fun distribute_rewards(recipients: &vector<address>) {
let i = 0;
while (i < vector::length(recipients)) {
let addr = *vector::borrow(recipients, i);
if (coin::is_account_registered<RewardToken>(addr)) {
coin::deposit(addr, reward_coins);
} else {
// Handle: skip, queue for later, or register for them
};
i = i + 1;
};
}
Resources
Workflows
See Also
- Move Scanner for general Move patterns
- Chain Guide: Aptos for chain-specific context
Error Code Reference
Aptos-specific error codes and framework abort codes. Aptos uses the Move abort system with standard error categories.
Aptos Error Categories (std::error)
| Category | Constant | Hex Prefix | Meaning |
|---|---|---|---|
INVALID_ARGUMENT | 1 | 0x1____ | Bad input parameter |
OUT_OF_RANGE | 2 | 0x2____ | Value outside acceptable range |
NOT_FOUND | 6 | 0x6____ | Resource or item not found |
ALREADY_EXISTS | 8 | 0x8____ | Resource or item already exists |
PERMISSION_DENIED | 5 | 0x5____ | Insufficient permissions |
RESOURCE_EXHAUSTED | 9 | 0x9____ | Limit reached (e.g., max supply) |
UNAVAILABLE | 13 | 0xD____ | Temporarily unavailable |
Aptos Framework Errors
| Abort Code | Module | Meaning |
|---|---|---|
0x10006 | coin | Coin store not registered for address |
0x10007 | coin | Insufficient coin balance |
0x80001 | account | Account already exists |
0x80002 | account | Account not found |
0x50001 | table | Key already exists |
0x50002 | table | Key not found |
0x60001 | coin | Coin amount is zero |
0x90001 | resource_account | Resource account already exists |
ENOT_OWNER | Common | Signer is not the owner — access control check |
ENOT_AUTHORIZED | Common | Lacking required authorization |
Aptos Token / NFT Errors
| Abort Code | Module | Meaning |
|---|---|---|
ETOKEN_NOT_FOUND | token | Token or collection does not exist |
ECOLLECTION_NOT_FOUND | token | Collection does not exist |
EINSUFFICIENT_BALANCE | token | Token balance too low for operation |
ENOT_CREATOR | token | Caller is not the collection creator |
EFIELD_NOT_MUTABLE | token | Attempting to modify immutable field |
Troubleshooting
| Issue | Likely Cause | Solution |
|---|---|---|
| Global storage vulnerabilities missed | Scanner doesn't audit borrow_global / move_to patterns | Map all global storage operations; check exists<T> before borrow_global and move_to |
| Resource account risks not flagged | Scanner doesn't track SignerCapability lifecycle | Trace resource_account::create_resource_account and verify SignerCapability storage/access |
| Module upgrade attack surface ignored | Scanner only checks current code | Verify UpgradePolicy (immutable vs compatible); check who holds the UpgradeCap |
| View functions not audited | Scanner focuses on entry functions | View functions can leak sensitive state; audit all #[view] functions for information disclosure |
| Event emission gaps not detected | Scanner doesn't check event coverage | Verify all state-changing operations emit events for off-chain tracking |
| Coin type confusion not caught | Scanner trusts Move type system | Verify all coin operations use correct type parameters; check for CoinType aliasing |
When not to use it
- →Non-Aptos Move contracts
- →General web application code
Prerequisites
Limitations
- →Requires Aptos-specific knowledge
- →Does not replace manual audit
How it compares
It focuses on Aptos-specific storage and framework security rather than generic Move language patterns.
Compared to similar skills
aptos-scanner side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| aptos-scanner (this skill) | 0 | 5mo | No flags | Advanced |
| backend-security-coder | 24 | 4mo | No flags | Intermediate |
| xss-testing | 1 | 7mo | Review | Advanced |
| permission-model-change-guide | 1 | 3mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by 0x-Shashi
View all by 0x-Shashi →You might also like
backend-security-coder
sickn33
Expert in secure backend coding practices specializing in input validation, authentication, and API security. Use PROACTIVELY for backend security implementations or security code reviews.
xss-testing
Ed1s0nZ
XSS跨站脚本攻击测试的专业技能
permission-model-change-guide
TencentBlueKing
IAM RBAC 权限模型变更规则,涵盖资源类型定义、操作权限配置、权限迁移脚本、IAM 回调实现。当用户修改权限模型、添加新资源类型、配置操作权限或编写权限迁移脚本时使用。
api-patterns
ngannk-fptu
Security patterns for APIs (REST, GraphQL, tRPC). Broken Object Level Authorization (BOLA), Rate Limiting, Injection, and Mass Assignment.
devisland-approval-proxy
nangchang
Change DevIsland Approval Proxy behavior, IPC framing, policy evaluation, SQLite persistence, pending approval queues, replay logs, PTY transcript handling, fallback policy, or approval-related plugin observation events. Use for AppState, ApprovalProxyController, ApprovalPolicyEngine, SQLiteApproval
blockchain-developer
sickn33
Build production-ready Web3 applications, smart contracts, and decentralized systems. Implements DeFi protocols, NFT platforms, DAOs, and enterprise blockchain integrations. Use PROACTIVELY for smart contracts, Web3 apps, DeFi protocols, or blockchain infrastructure.