A session token that grants access to wire transfers and payments is the highest-value credential in a financial application. If that token is stolen — via XSS, network interception, or session fixation — the attacker can execute high-value transactions without any additional authentication barrier. Step-up authentication requires a second proof-of-identity at the moment the sensitive operation is initiated, so a stolen token alone is insufficient. CWE-306 (Missing Authentication for Critical Function), OWASP A07, PCI-DSS Req 8.4, and NIST 800-63B IA-11 all address this gap. Without server-side step-up enforcement, client-side UI guards are trivially bypassed with a direct API call.
High because an absent server-side step-up on financial endpoints means any actor possessing a valid session token — regardless of how it was obtained — can initiate transfers, wires, and payments with no additional authentication challenge.
Enforce step-up via server-side middleware, not client state, in src/middleware/requireStepUp.ts:
export async function requireStepUp(req: Request): Promise<Response | null> {
const session = await getSession(req);
const verified = await checkStepUpStatus(session.id);
if (!verified) {
return Response.json(
{ error: 'Step-up authentication required' },
{ status: 403 }
);
}
return null; // proceed
}
// src/app/api/transfer/route.ts
export async function POST(req: Request) {
const block = await requireStepUp(req);
if (block) return block;
// safe to process transfer
}
Apply requireStepUp to every sensitive route: transfers, wires, payments, account changes, and password resets. Do not rely on a client-side flag or cookie indicating that step-up was completed — verify the server-side step-up record on every request.
finserv-session-security.step-up-auth.step-up-sensitive-opshigh"2 of 5 sensitive endpoints lack step-up — POST /api/transfer and POST /api/wire have session-only auth. 0 step-up middleware found on these routes."finserv-session-security.step-up-auth.step-up-strength-equivalent for strength requirements, and finserv-session-security.session-integrity.suspicious-activity-step-up for anomaly-triggered step-up.src/middleware/requireStepUp.ts):
// middleware/requireStepUp.ts
export async function requireStepUp(req: Request) {
const session = await getSession(req);
const stepUpVerified = await checkStepUpStatus(session.id);
if (!stepUpVerified) {
return Response.json({ error: 'Step-up authentication required' }, { status: 403 });
}
}
// app/api/transfer/route.ts
export async function POST(req: Request) {
await requireStepUp(req); // Enforces step-up before processing
const { fromAccount, toAccount, amount } = await req.json();
// Process transfer
}