Describe the normal behavior in one or more sentences
Answer: Initialization functions (e.g., creating a user profile, vault, or token registry) should only be called once per account. After the resource exists, repeated calls should be rejected to avoid overwriting or duplicating sensitive state.
Explain the specific issue or problem in one or more sentences
Answer: The initialize_vault function does not check whether a Vault already exists. A malicious or accidental re-call of initialize_vault will overwrite the victim’s existing vault, erasing their balance or data.
Likelihood:
Reason 1 // Describe WHEN this will occur (avoid using "if" statements)
Answer: This occurs whenever a user (or attacker) calls initialize_vault again.
Reason 2
Answer: No guard condition prevents repeated initialization, so the risk is inherent.
Impact:
Impact 1
Answer: Victim loses existing vault state (funds, balance, or private data).
Impact 2
Answer: Could be abused by an attacker who tricks victims into re-initializing their account, leading to denial of service or permanent loss.
Step 1: The user legitimately stores a vault with balance = 500.
Step 2: initialize_vault is called again, overwriting the vault without warning.
Step 3: The balance resets to 0, showing how the lack of existence checks causes destructive overwrites.
The exists
Repeated calls will fail with an assertion error, protecting existing state.
This aligns with Move’s principle of resource safety — resources should be unique and not overwritten without explicit destruction.
Optional enhancement: add a destroy_vault function controlled by the user, allowing re-initialization only after explicit deletion.
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.