agents/skills/aptos/dependency-audit/SKILL.md
Trigger EXTERNAL_LIB flag detected (protocol uses third-party Move dependencies) - Used by Breadth agents, depth-external
npx skillsauth add plamentsv/plamen dependency-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Trigger: EXTERNAL_LIB flag detected (protocol uses third-party Move dependencies) Used by: Breadth agents, depth-external Covers: Third-party library security, upgrade policy risks, critical function correctness, transitive dependency chains
Audit third-party Move dependencies for security risks. Aptos protocols commonly depend on external math libraries, utility modules, and protocol SDKs. Unlike EVM (where dependencies are compiled into the contract), Move dependencies are on-chain modules that can be independently upgraded. A dependency upgrade can silently change the behavior of the audited protocol.
Parse Move.toml for all dependencies. Categorize each:
| # | Dependency | Source | Category | Upgrade Policy | Revision Pinned? | |---|-----------|--------|----------|---------------|-----------------| | 1 | AptosFramework | aptos-framework repo | FRAMEWORK | Framework governance | {rev hash or branch} | | 2 | AptosStd | aptos-framework repo | FRAMEWORK | Framework governance | {rev hash or branch} | | 3 | AptosToken | aptos-framework repo | FRAMEWORK | Framework governance | {rev hash or branch} | | 4 | {third_party_lib} | {git URL} | THIRD_PARTY | {compatible/immutable/unknown} | {YES: rev=abc123 / NO: branch=main} | | 5 | {sub_module} | local path | IN_SCOPE | N/A (part of audit) | N/A |
Categories:
aptos_framework, aptos_std, aptos_token, aptos_token_objects - trusted, framework-governance-controlled. Audit framework USAGE, not framework internals.MANDATORY PARSE: Read Move.toml (and any sub-package Move.toml files) for:
[dependencies] section entriesgit = "..." URLs - identify the source repositoryrev = "..." - pinned revision hash (safe) vs branch = "main" (dangerous)local = "..." - in-scope sub-modulesFor each THIRD_PARTY dependency:
| Dependency | On-Chain Address | Upgrade Policy | Can Upgrade Without Protocol Knowledge? | Risk Level | |-----------|-----------------|---------------|----------------------------------------|-----------| | {lib} | {0x...} | immutable | NO | LOW | | {lib} | {0x...} | compatible | YES - publisher can add functions, change logic | HIGH | | {lib} | {0x...} | unknown | VERIFY ON-CHAIN | ASSESS |
Check for each compatible dependency:
Severity: If a compatible third-party dependency can be upgraded to change behavior of functions the protocol calls, AND the protocol has no way to detect or prevent this -> minimum MEDIUM finding.
Pinning check: If Move.toml uses branch = "main" instead of rev = "abc123":
For each function called from a THIRD_PARTY dependency:
| # | Called Function | From Module | Parameters | Return Type | Frequency | Impact If Wrong | |---|---------------|-------------|-----------|-------------|-----------|----------------| | 1 | {lib::func()} | {our_module} | {params} | {return} | {every tx / periodic / init only} | {describe} |
For each critical function (called frequently OR high impact if wrong):
Overflow/underflow check:
a * b where both are u64 - can overflow)<< or >>? If so, is the shift amount bounded to < 64 (for u64) or < 128 (for u128)? Unbounded bit shifts are a known attack vector (historical exploit: bit shift overflow in a custom shift helper allowed minting tokens from minimal liquidity).Edge case check: | Input | Expected Output | Actual Output | Correct? | |-------|----------------|---------------|----------| | 0 | {expected} | {verify} | YES/NO | | 1 | {expected} | {verify} | YES/NO | | MAX_U64 | {expected: revert or handled} | {verify} | YES/NO | | MAX_U128 | {expected} | {verify} | YES/NO |
Specification check:
For each third-party function call:
| Call | Trusts Dependency To | What If Dependency Lies/Breaks | Detection? | |-----|---------------------|-------------------------------|-----------| | {lib::get_price()} | Return accurate price | Protocol uses wrong price → fund loss | {sanity check present?} | | {lib::sqrt(x)} | Return correct sqrt | Wrong math → accounting error | {no detection} |
Check: Does the protocol validate the RETURN VALUE of third-party calls? Or does it blindly trust the result?
If no validation AND high impact -> FINDING.
Check whether third-party dependencies have their own dependencies:
Protocol
├── aptos_framework (FRAMEWORK)
├── third_party_lib_A
│ ├── aptos_framework (FRAMEWORK - OK, shared)
│ └── third_party_lib_B (THIRD_PARTY - audit this!)
│ └── aptos_std (FRAMEWORK - OK)
└── third_party_lib_C
└── (no additional deps)
| Transitive Dependency | Reached Via | Upgrade Policy | Audited? | Risk | |-----------------------|-----------|---------------|---------|------| | {lib_B} | lib_A -> lib_B | {policy} | YES/NO | {assess} |
Check:
aptos_framework, aptos_std, aptos_token are framework-governed and heavily audited - do not flag as third-party risk (but DO audit usage patterns)immutable policy, upgrade risk is zeromath64::mul_div() and similar are well-tested - focus audit on third-party math libraries## Finding [DEP-N]: Title
**Verdict**: CONFIRMED / PARTIAL / REFUTED / CONTESTED
**Step Execution**: ✓1,2,3,4 | ✗N(reason) | ?N(uncertain)
**Rules Applied**: [R1:✓/✗, R4:✓/✗, R8:✓/✗, R10:✓/✗]
**Severity**: Critical/High/Medium/Low/Info
**Location**: Move.toml or module_name.move:LineN
**Dependency**: {name and source}
**Risk Type**: UPGRADE_RISK / MATH_ERROR / TRUST_BOUNDARY / TRANSITIVE_EXPOSURE
**Upgrade Policy**: {immutable/compatible/unknown}
**Description**: What's wrong
**Impact**: What can happen (silent behavior change, math error, fund loss)
**Evidence**: Code showing the dependency usage and risk
### Precondition Analysis (if PARTIAL/REFUTED)
**Missing Precondition**: [What blocks exploitation]
**Precondition Type**: STATE / ACCESS / TIMING / EXTERNAL / BALANCE
### Postcondition Analysis (if CONFIRMED/PARTIAL)
**Postconditions Created**: [What conditions this creates]
**Postcondition Types**: [List applicable types]
**Who Benefits**: [Who can use these]
| Step | Required | Completed? | Notes | |------|----------|------------|-------| | 1. Dependency Inventory | YES | ✓/✗/? | All Move.toml entries parsed and categorized | | 2. Upgrade Policy Risk | FOR EACH third-party dep | ✓/✗/? | On-chain policy verified | | 3a. Function Inventory | YES | ✓/✗/? | All called functions from third-party listed | | 3b. Correctness Verification | FOR EACH critical function | ✓/✗/? | Overflow, zero, MAX tested | | 3c. Trust Boundary Analysis | YES | ✓/✗/? | Return value validation checked | | 4. Transitive Dependency Analysis | IF transitive deps exist | ✓/✗(N/A)/? | Full tree mapped |
If any step skipped, document valid reason (N/A, no third-party deps, all deps immutable).
development
Prepare Solidity projects for a security audit — test coverage, test quality, NatSpec docs, code hygiene, dependency health, best-practice enforcement, deployment readiness, and project documentation checks. Generates a scored Audit Readiness Report and optionally runs static analysis. Trigger on: "prepare for audit", "audit readiness", "pre-audit check", "audit prep", "NatSpec check", or any request to review a Solidity codebase before a security review.
development
Launch the Plamen deterministic Web3 security audit pipeline
development
Run the Plamen smart-contract audit wizard in Codex
testing
Launch the Plamen deterministic L1 infrastructure audit pipeline