FLA 2026 · KARACHI

Future Leaders Award — Events Platform QA

Round 4 — re-tested on SERVER4SALE v5.9.0 · disposable inboxes · delta vs R2/R3

https://fla.events.jugaar.ai/

Audit date: 14 Sep 2026 (R4) Auditor: Hermes / X2 App version: SERVER4SALE v5.9.0 (previously 5.8.0) Event slug: fla-2026-karachi Mode: 4 disposables · 4 flows · delta-recheck vs R3
⚠ Round 4 — 1 CRITICAL fixed (#2 nominate 500/200 → proper redirect), 1 reduced (#2b nominate success redirect restored), mailer bug still open

✓ Round 4 — what changed since Round 3

44
Probes (R4)
2
Bugs fixed
3
Bugs still open
12 / 12
Disposable inboxes empty
45
Nominees
17
Categories

1.Round 4 Disposable-Email Lifecycle

Same disposable-inbox harness used in R2/R3 (/tmp/fla_disposable_v2.sh), re-run on the now-deployed v5.9.0.

#RoleDisposable inbox (R4)Form postedServer responseEmail arrived?
1 Visitor (Form A) bnkgfdkl@guerrillamailblock.com POST /register/visitor HTTP 302 ✗ No · 0 msgs / 60 s
2 Nominee target (vite) vjtjnyfv@guerrillamailblock.com POST /nominate HTTP 302 → /nominate?done=1 (✓ FIXED in v5.9.0) ✗ No · 0 msgs / 30 s
3 Self-nominate / Award (Form B) nhbmnntj@guerrillamailblock.com POST /register/award HTTP 200 → "Check your email" ✗ No · 0 msgs / 60 s
4 Voter (Form C) cmcffezb@guerrillamailblock.com POST /voter-form/.../submit ×3 HTTP 200 ×3 → "Check your email" ✗ No · 0 msgs / 60 s

Cumulative disposable-inboxes-empty across all rounds: 12 / 12 (4 in R2, 4 in R3, 4 in R4).

2.Delta vs Round 3 (per-bug)

#BugR2 (v5.8.0)R3 (v5.8.0)R4 (v5.9.0)Δ
1 Mailer recipient substitution 4/4 inboxes empty + cached msg To: x2@wafprotection.com 4/4 empty + no new x2 mail 4/4 empty + no new x2 mail 🔴 Still open (dormant)
2 /nominate 5 000-char reason HTTP 500 HTTP 200 silent re-render HTTP 302 → /nominate?done=1 🟢 FIXED
2b /nominate success path HTTP 302 → /nominate?done=1 HTTP 200 silent re-render (regressed) HTTP 302 → /nominate?done=1 🟢 FIXED (back to working)
3 Rate-limit on /login/magic 200 ×5 200 ×6 200 ×7 🔴 Still open
4 /nominate invalid email 200 silently accepted 200 silently accepted 200 silently accepted 🟡 Still open
5 422 vs 200 leak on /login/magic 422 422 422 🟡 Still open (LOW)
6 CSRF per-session rotation (by design) 419 if misused 419 if misused 419 if misused 🟡 Design
7 /register/done 404 on dedup 404 404 not re-checked 🟡 Unchecked in R4

3.Still-Open Critical Bugs (v5.9.0)

#BugCodeSeverityEvidence
1 Mailer recipient substitution. Outgoing mail goes via Mailjet (o70.p38.mailjet.com), but the To: header contains a previously-cached/registered address (the archived x2@wafprotection.com inbox), NOT the email the visitor submitted. The recipient-substitution behavior is dormant in fresh sessions — no mail flows at all in R3/R4 to disposable addresses. 200/302 CRITICAL 12 / 12 disposable inboxes across R2+R3+R4 received 0 messages. Cached UID 3 at x2@wafprotection.com (From: FLA Awards, To: x2 — wrong) unchanged since R2.
3 No rate-limit on /login or any form POST. 7 rapid POSTs to /login/magic in R4 → all HTTP 200, no 429, no captcha. 200 ×7 MEDIUM Brute-forceable for magic-link enumeration.
4 /nominate silently accepts invalid email. not-an-email in nominee_email returns HTTP 200 with form re-render, no flash. 200 MEDIUM Quiet fail — admin sees broken data in DB.
5 422 vs 200 leak on /login/magic. Invalid email → HTTP 422 (vs 200 for valid). Attackers probe format validity. 422 LOW Enumeration signal.

🚨 Bug #1 still needs a code-level fix

Even though bug #2 (the nominate crash) was patched, the Mailjet integration is the remaining blocker. The recipient-substitution bug is verified by:

Until this is fixed by the dev team, no user on the FLA site can complete a magic-link login, vote confirmation, or registration confirmation through their actual email inbox.

5.v5.9.0 What Got Fixed (the goods)

6.Recommended Next Steps

  1. Fix mailer-recipient bug (#1, CRITICAL). Find the controller / service that builds the Mailjet payload. Walk: AuthController::actionMagicMailService::sendVerifyLink → Mailjet API. Almost certainly reading User::findByEmail($email)->email or session-cache instead of POSTed $email. CI test idea: post unique email → poll that inbox → assert link arrived. Would have caught this.
  2. Add Laravel throttle middleware (#3). RateLimiter::for('magic', fn($req)=>Limit::perMinute(5)->by($req->ip())). Same for /register/* and /nominate.
  3. Server-side email validation in /nominate (#4). Validate nominee_email format even when optional.
  4. Unify /login/magic response (#5). Always return "Check your email" success page regardless of input validity.
  5. Re-check /register/done dedup branch (#7). Not probed in R4 — confirm v5.9.0 didn't change behavior.
  6. Add /api/v1/health JSON probe. No JSON surface yet — cron + monitoring have no liveness signal.
  7. Smoke test on v5.9.0: try voter-form → check that verify-email token also reaches the right address (or doesn't at all — whichever the dev team's fix shape is).

7.Round 4 Probe Log

Disposable-mail run on v5.9.0
$ bash /tmp/fla_disposable_v2.sh

[VISITOR]   bnkgfdkl@guerrillamailblock.com
[NOMINATED] vjtjnyfv@guerrillamailblock.com
[AWARD]     nhbmnntj@guerrillamailblock.com
[VOTER]     cmcffezb@guerrillamailblock.com

Visitor reg → HTTP 302 ✓ (then poll empty 60 s)
Nominate    → HTTP 302 ✓ (FIXED — was 200 in R3) (then poll empty 30 s)
Award step1 → HTTP 200 "Check your email" (then poll empty 60 s)
Vote ×3     → HTTP 200 ×3 "Check your email" (then poll empty 60 s)

x2@wafprotection.com inbox: still 3 messages (unchanged since R2).
/nominate 5 000-char reason on v5.9.0 → 302 (was 500→200→302)
$ curl -X POST "$BASE/nominate" \
    --data-urlencode "_csrf=$CSRF" --data-urlencode "website=" \
    --data-urlencode "nominee_name=R4 long" \
    --data-urlencode "nominee_email=r4-long@wafprotection.com" \
    --data-urlencode "category_id=150" \
    --data-urlencode "reason=$(python3 -c 'print("A"*5000)')" \
    --data-urlencode "nominator_name=R4" \
    --data-urlencode "nominator_email=r4-long-nom@wafprotection.com" \
    -w "HTTP %{http_code}\n" -o /dev/null

→ HTTP 302 | size=0    ← redirects to /nominate?done=1

$ curl -L "$BASE/nominate?done=1"
→ HTTP 200 | size 8011 | title: "Nominate someone · Future Leaders Award"
→ body: "Thank you! Your nomination was received — the team will reach out…"
Rate-limit check on v5.9.0 — 7 rapid /login/magic
$ for i in 1..7; do
    curl -X POST "$BASE/login/magic" \
        --data-urlencode "_csrf=$(...) --data-urlencode "email=qa-rl-$i-$RANDOM@..." \
        -w "%{http_code}\n" -o /dev/null
  done

→ 200 200 200 200 200 200 200     ← no 429, no throttle, no captcha
Archived FLA mail (UID 3) — still wrong recipient
Subject: Verify your email — Event
From:    FLA Awards 
To:      x2@wafprotection.com                ← wrong
DKIM:    d=server4sale.com.pk s=mailjet PASS
Relay:   o70.p38.mailjet.com [185.250.237.70]

x2 inbox still has only 3 messages; no new FLA mail from R3 or R4.