We manage your security to weather the AI storm →

← Resource Hub

Move Smart Contract Security: Guarantees and Common Bugs

By Owen Thurm Published 6 min read

Move Smart Contract Security: Guarantees and Common Bugs

Quick answer. Move stops assets being copied or silently lost, and aborts on most arithmetic overflow. It does not stop logic, validation or math errors: by our count, 54% of the 1,141 findings in the Move Vulnerability Database.

Watch: Move Smart Contract Security: Guarantees and Common Bugs 1:35
Video transcript

Move stops coins being copied or lost by accident. It does not know what your protocol should do, and that is where bugs still ship.

Move treats assets as resources, with four abilities granted on purpose. Arithmetic aborts on overflow, and hot potato structs force flash loans to be repaid.

Yet by our count, 54 percent of the 1,141 findings in the Move Vulnerability Database are logic, validation or math errors.

Business logic leads, then input validation and calculation errors. These are mistakes in protocol code, not Move VM failures.

On Sui, old package versions stay callable after an upgrade. Guardian's public suiUSDe review found two oracle functions skipping the version check, since resolved.

Left shifts are the one arithmetic gap, because they do not abort on overflow. Cetus lost 223 million dollars in May 2025 to a flawed shift check. Sui validators froze 162 million.

Our checklist: strip unneeded abilities, require a capability on privileged functions, version shared objects, test every left shift, and fuzz rounding and casts.

A Guardian audit runs three passes: design review, an invariant suite, then senior researchers attack what is left.

Read the full article for the complete checklist, or talk to Guardian about auditing the logic Move cannot check.

Move was built so a coin cannot be copied or lost by accident. Sui and Aptos both run it, and protocols on both still ship bugs.

On May 22, 2025, Cetus, a decentralized exchange on Sui, lost $223M to one flawed overflow check, Rekt reported. Move's type system could not catch it.

What Move Guarantees

Move treats assets as resources. "By default, a Move value can only be created, moved around, and taken apart," the Move Book says.

Every other permission is an ability the developer grants on purpose. There are four:

  • copy: the value can be duplicated.
  • drop: the value can be discarded.
  • key: the value can be a unit of storage; on Sui, an object.
  • store: the value can be stored inside other values.

A coin without copy cannot be minted by duplication. One without drop cannot vanish because a function forgot it.

Arithmetic is checked too. Addition, subtraction and multiplication abort on overflow, and a downcast aborts if the value does not fit.

A struct with no abilities is a "hot potato." Its module must unpack it in the same transaction, which is how Move flash loans guarantee repayment.

Sui Objects vs Aptos Storage

The two chains store state differently, and that changes where bugs hide.

Sui: objects and ownership

On Sui, stored values are objects. Each can be address-owned, shared, immutable or wrapped inside another object.

Address-owned objects skip consensus. Shared objects go through it, and "anyone can submit a transaction that references a shared object," Sui's docs warn.

So a function that takes a shared object must check authority itself. The usual tool is a capability, an object such as AdminCap that callers must pass in.

The store ability matters here. It "acts as a public modifier on the object," letting any module call public_transfer, public_share_object or public_freeze_object on it.

Aptos: global storage and signers

Aptos keeps resources under accounts: "a forest consisting of trees rooted at an account address." Each address holds at most one resource of a given type.

Code writes with move_to, which needs the account's signer, and reads with borrow_global. Aptos's guidelines warn that "accepting a &signer is not always sufficient for access control purposes."

Aptos also has objects. The guidelines say to check that the signer owns any Object<T> passed in, and never to expose an object's ConstructorRef.

Bugs Move Does Not Prevent

Move removes mechanical bugs. It does not know what your protocol is supposed to do.

The Move Vulnerability Database (MVD) v3.0 compiles 1,141 findings from more than 200 public Move audit reports by 16 firms and auditors.

MVD categoryFindingsShare
Business logic29626%
Input validation17015%
Calculation errors14813%
Coding mistake767%
Access control736%
State management646%
Oracle issues272%
Missing version check121%

These are selected categories; the shares are our calculation from the MVD's counts. The top three are errors in protocol code, not failures of the Move VM.

Shared objects and upgrades

On Sui, old package versions stay callable after an upgrade. "Nothing prevents other packages from accessing the methods and types defined in the old versions," Sui's docs say.

The fix is a version field on each shared object, checked by every function, plus a migrate function to move it forward.

Guardian's public suiUSDe review found this gap. Two oracle functions skipped the version check, so old logic could still create oracle proofs (L-04, resolved).

The same review flagged a shared oracle taken by mutable reference without need (I-23). Mints and redeems then queue with any call to a permissionless function, which could congest them.

Oracles, flash loans and callbacks

Aptos's guidelines warn that prices from pool liquidity ratios can be skewed by large holders. They recommend multiple oracles.

A hot potato guarantees a flash loan is repaid. It does not stop the borrowed funds from moving a price your protocol reads in between.

Function values add callback risk on Aptos. "Callbacks via function values can re-enter the original module," its guidelines say.

Arithmetic and Bit Shifts

Move's arithmetic aborts on overflow, with one exception. "Left Shift (<<), uniquely, does not abort in the event of an overflow," Aptos's guidelines say.

The Move Reference lists one abort case for shifts: a shift amount at or above the type's bit width. Bits shifted out are simply dropped.

That is the Cetus bug. Its checked_shlw function was meant to reject inputs too large to shift left by 64 bits, Dedaub explains.

The mask it compared against was wrong, so "most values greater than 2^192 pass through undetected."

The attacker borrowed 56,700 SUI in a flash loan, opened a narrow position and deposited a single token. The math credited about 10^34 units of liquidity, Rekt reports.

Sui validators froze $162M of the $223M. Rekt notes the same function had been copied into other Sui projects.

Other math risks remain:

  • Division rounds down, so small fees can become zero.
  • Downcasts abort, so an unchecked u64 cast can block a mint or redeem.
  • Decimal scaling: suiUSDe's I-21 found a peg price cap that could still overflow u64 in an unlikely edge case.

Our language comparison sets these limits beside Solidity, Rust and DAML.

Move Audit Checklist

  • List every ability on every struct. Remove copy, drop and store where unneeded.
  • Keep objects key-only when transfers must follow your module's rules.
  • Require a capability or exact-address check on every privileged function.
  • Version every shared object and check the version in every entry point.
  • Take shared objects by immutable reference unless the function writes to them.
  • On Aptos, verify ownership of every Object<T> argument.
  • Never expose a ConstructorRef, for example by returning it from a mint.
  • Constrain generic type parameters so callers cannot swap asset types.
  • Find every left shift and test it at the type's limits.
  • Fuzz rounding, decimal scaling and u64 casts at extreme values.
  • Check oracle prices for staleness and for timestamps in the future.
  • Treat Aptos function values as untrusted callbacks.
  • Confirm copied libraries carry upstream fixes.

How Guardian Audits Move

A Guardian smart contract audit runs three passes: design review, an invariant suite, then senior researchers attack what is left.

The invariant suite turns accounting, solvency, rounding and edge states into properties fuzzed across every reachable state.

Guardian's public portfolio includes a Move review: suiUSDe on Sui, December 2025, with 33 findings and none above Low.

Vanguard, Guardian's enterprise audit, puts two independent teams on one scope, with Helix, Guardian's AI auditor, powering one.

For where contract bugs sit among other risks, see our guide to blockchain security risks.

Frequently Asked Questions

What security guarantees does Move provide?

Move stops values being copied or discarded unless their type allows it, which protects coins and other assets. Addition, subtraction, multiplication and downcasts abort on overflow. Left shifts do not abort on overflow, and logic bugs are not prevented.

Is Move more secure than Solidity?

It removes bug classes Solidity leaves to the developer, such as duplicated or lost assets. It does not remove logic, validation or math errors: by our count, those are 54% of the 1,141 findings in the Move Vulnerability Database.

What caused the Cetus hack?

A flawed overflow check in a math library's checked_shlw function. Its mask let most values above 2^192 through, and the left shift dropped the high bits without aborting. Cetus lost $223M on May 22, 2025; Sui validators froze $162M.

How is Sui Move different from Aptos Move?

Sui stores state as objects that are owned, shared or immutable, and uses capability objects for authority. Aptos stores resources under account addresses and relies on signer checks, with an object model on top.

Sources

Audit the logic Move cannot check

A Guardian audit tests the capability, upgrade, oracle and math logic that Move's type system lets through.