Describe the normal behavior in one or more sentences
Answer: The vault should keep a user’s secret confidential so that only the owner can know its contents.
Explain the specific issue or problem in one or more sentences
Answer: Move (and Aptos) state is public. Storing the secret as a String/vector in a has key resource means anyone can read it off-chain via a node/Explorer/CLI, regardless of function-level “auth checks.” Even with perfect access control in functions, the plaintext is still retrievable from global storage.
Likelihood:
Reason 1 // Describe WHEN this will occur (avoid using "if" statements)
Whenever the module publishes or updates a Vault, the plaintext is committed to global storage, which is readable by full nodes and RPCs.
Reason 2
Whenever an observer queries the owner’s resources (e.g., explorer/CLI), the Vault.secret field can be inspected without calling any contract function.
Impact:
Impact 1
Any third party can read the secret using standard state-read tools, defeating the purpose of a “secret vault.”
Impact 2
Loss of user trust and potential leakage of sensitive data (e.g., API keys, passwords), rendering the app unsuitable for real-world secrets.
This test shows that the secret is readable by simply borrowing the global resource—no authentication step needed. Off-chain, the same is possible with explorers or CLI (e.g., querying the secret_vault::vault::Vault resource for the owner’s address).
nonReentrant: Prevents reentrancy exploits during withdrawals.
onlyAuthorized: Ensures only allowed roles (e.g., owner, whitelisted users, or those meeting criteria) can perform withdrawals.
This significantly reduces abuse risks and protects pooled funds.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.