GuardAPI Logo
GuardAPI
GuardAPI Logo GuardAPI

Fix Logic Flow Bypass in AdonisJS

Logic Flow Bypass in AdonisJS typically manifests when multi-step processes (like password resets, checkouts, or onboarding) rely on client-side state or fail to verify that 'Step N-1' was successfully completed before executing 'Step N'. Attackers exploit this by directly hitting internal API endpoints, skipping validation middleware, or manipulating request payloads to jump straight to the privileged action.

The Vulnerable Pattern

// app/Controllers/Http/PasswordResetController.ts

// Step 2: Finalize password change public async update({ request, response }) { const { email, newPassword } = request.only([‘email’, ‘newPassword’]);

// VULNERABILITY: This endpoint assumes the user has already verified their OTP. // An attacker can bypass the OTP step and directly POST here with a target email. const user = await User.findByOrFail(‘email’, email); user.password = newPassword; await user.save();

return response.ok({ message: ‘Password updated successfully’ }); }

The Secure Implementation

The exploit works because the vulnerable controller trusts the 'email' parameter as a source of truth for the reset flow. The fix implements a 'Strict State Transition' pattern. By requiring a server-side generated token that is only issued upon successful OTP/Email verification, we ensure the logic flow is followed. The secure version also includes token expiration checks and an immediate 'burn-on-use' policy to prevent replay attacks, effectively closing the bypass window.

// app/Controllers/Http/PasswordResetController.ts

public async update({ request, response }) { const { token, newPassword } = request.only([‘token’, ‘newPassword’]);

// FIX: Force a state check using a single-use, high-entropy token. // This ensures the user actually completed the verification step. const resetToken = await Token.query() .where(‘token’, token) .where(‘type’, ‘password_reset’) .where(‘expires_at’, ’>’, DateTime.now().toSQL()) .first();

if (!resetToken) { return response.badRequest(‘Invalid or expired reset flow.’); }

const user = await User.find(resetToken.userId); if (!user) return response.notFound();

user.password = newPassword; await user.save();

// Burn the token immediately to prevent replay attacks await resetToken.delete();

return response.ok({ message: ‘Password reset successful’ }); }

System Alert • ID: 2459
Target: AdonisJS API
Potential Vulnerability

Your AdonisJS API might be exposed to Logic Flow Bypass

74% of AdonisJS apps fail this check. Hackers use automated scanners to find this specific flaw. Check your codebase before they do.

RUN FREE SECURITY DIAGNOSTIC
GuardLabs Engine: ONLINE

Free Tier • No Credit Card • Instant Report

Verified by Ghost Labs Security Team

This content is continuously validated by our automated security engine and reviewed by our research team. Ghost Labs analyzes over 500+ vulnerability patterns across 40+ frameworks to provide up-to-date remediation strategies.