SSSwap

First Flight #41
Beginner FriendlyRust
100 EXP
View results
Submission Details
Severity: medium
Valid

Vault Account Front-Running Leading to Denial of Service

Description

The vault token accounts vault_a and vault_b are initialized using the init attribute with associated token account seeds derived only from the token mint and liquidity pool authority. These seeds are predictable and not unique per pool initialization, allowing an attacker to pre-create (front-run) the vault accounts before the legitimate pool initialization.

Infected Code

#[account(
init,
payer = creator,
associated_token::mint = token_mint_a,
associated_token::authority = liquidity_pool,
associated_token::token_program = token_program
)]
pub vault_a: InterfaceAccount<'info, TokenAccount>,
#[account(
init,
payer = creator,
associated_token::mint = token_mint_b,
associated_token::authority = liquidity_pool,
associated_token::token_program = token_program
)]
pub vault_b: InterfaceAccount<'info, TokenAccount>,

Impact

Attackers can pre-initialize vault accounts, causing the pool initialization to fail and resulting in a denial of service by blocking new pool creation.

Recommendation and Fix

Use Program Derived Addresses (PDAs) with additional unique seeds such as the pool address or a nonce to generate vault accounts. This ensures vault account addresses are unique and cannot be pre-created by others.

Fixed Code Snippet

#[account(
init,
payer = creator,
seeds = [b"vault_a", liquidity_pool.key().as_ref()],
bump,
token::mint = token_mint_a,
token::authority = liquidity_pool,
token::token_program = token_program,
)]
pub vault_a: Account<'info, TokenAccount>,
#[account(
init,
payer = creator,
seeds = [b"vault_b", liquidity_pool.key().as_ref()],
bump,
token::mint = token_mint_b,
token::authority = liquidity_pool,
token::token_program = token_program,
)]
pub vault_b: Account<'info, TokenAccount>,
Updates

Lead Judging Commences

0xtimefliez Lead Judge 4 days ago
Submission Judgement Published
Validated
Assigned finding tags:

PDA collision due to non-unique salt

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.