Vulnerability-scanner A/B/C evaluation · OWASP Juice Shop

AudnvsCodexvsAikido

Executive verdict

Three scanners, same Juice Shop source — but three different classes of tool, so this is about which lens you need, not a single winner.

Audn live red-team (SAST + DAST fusion) — "what actually exploits on the running app?" 103 findings, 18 reproduced live. Codex commit-diff code review — "did this change introduce something bad?" 20 findings, all diff-scoped + patched. Aikido commercial SAST + SCA + secrets + CI platform — "give me a fast, broad baseline." 36 issues in ~52 seconds.

Overlap is still modest. All three agree on only 3 issues (JWT signature not verified, unpinned GitHub Actions, CI fetch-without-integrity) — treat those as certainly real. The big story: Aikido closes the one blind spot Audn and Codex shared — it's the only tool that runs SCA, surfacing 3 real dependency CVEs (jsonwebtoken, express-jwt, sanitize-html) — and it adds deep secrets coverage (incl. test fixtures). But it brings no live proof and no diff awareness.

Bottom line — layers, not substitutes: Aikido is the fast continuous baseline (SCA + secrets + SAST), Codex is the PR gate for regressions, Audn is the periodic live pentest and the only one proving exploitability + business logic. Remaining blind spots shrink to: live infra/edge posture, end-to-end business-logic exploitation, client-side runtime depth, and complete SCA (Aikido itself flags a missing lockfile).

103
Audn
18 reproduced live · 2h 28m
20
Codex
diff-scoped · patch per finding
36
Aikido
+3 dependency CVEs · ~52s
3
All three agree
highest-confidence real issues

Three tools, three jobs

Same target (ozgurozkan123/juice-shop). The severity mixes and the "scanner DNA" chips below show how differently each one works — Audn ranges across a live-confirmed critical tier, Codex reports a tight introduced-issue set, Aikido produces a broad static baseline heavy on secrets.

Audn

SAST fused with a live red-team run against the deployed target. CWE, file:line, CVSS, confidence tiers, attack paths.
Severityn = 103
18245254
SAST + live DASTwhole app, deployed2h 28m

Codex

Commit-diff code review of commit 160f306. Validation rubric + evidence + a generated patch per finding.
Severityn = 20
8723
diff-aware SASTchangeset+ patches

Aikido

Commercial platform: SAST + SCA + secrets + CI/IaC in one pass. Continuous per-repo scanning, "fix time" estimates.
Severityn = 36
313812
SAST + SCA + secrets + CIwhole repo, static~52s
CriticalHighMediumLowInfo

Only Audn grades its own certainty

Audn separates "facts about the running system" from "patterns in the source": just 16 confirmed (static+live) and 2 observed live, versus 63 static-only leads. Codex and Aikido are both fully static — every one of their findings sits, in Audn's terms, at the unverified tier.

Audn findings by confidence tier
Confirmed16
Observed live2
Probed, no verdict18
Static lead63
Likely false positive4

A/B/C — pros & cons

Pick by the job. Continuous baseline → Aikido. Gate a pull request → Codex. Prove exploitability / pentest → Audn. Most teams want all three at different points in the lifecycle.

Audn

Pros
  • Live reproduction — 18 findings exploited on the running target. The only exploitability proof here.
  • Business-logic & IDOR depth — basket/order/wallet/coupon abuse that pattern SAST can't reason about.
  • Confidence tiers — you know what's proven vs a lead.
  • Attack-path chains (32) + CVSS.
Cons
  • Mostly unconfirmed — 63 static leads; only ~17% live.
  • No patches; slow (2h 28m); needs a live target.
  • No SCA / dependency CVEs; over-reports intentional vulns.

Codex

Pros
  • Catches introduced regressions — subtle diff bugs (2FA temp-JWT, complaint DoS) nothing else found.
  • Diff-aware — ideal PR gate.
  • Ships a patch per finding.
  • Separates intentional vs real risk — vital on a deliberately-vulnerable app.
Cons
  • Narrow — 20 findings, misses most of the surface.
  • No live proof; scoped to one changeset.
  • No SCA / secrets sweep; near-duplicate findings.

Aikido

Pros
  • Only tool with SCA — 3 dependency CVEs, closing the shared blind spot.
  • Deep secrets scanning — 40+ files incl. test fixtures.
  • Fastest by far — ~52s vs 2h 28m.
  • Multi-engine in one pass (SAST+SCA+secrets+CI); continuous.
Cons
  • Static only — no exploit proof.
  • No diff awareness — misses Codex's regressions.
  • Noisy — many test-fixture "secrets"; no business-logic/IDOR; grouped counts; incomplete SCA (missing lockfile).

Methodology, side by side by side

DimensionAudnCodexAikido
Core methodSAST + live red-team (DAST) fusionStatic review of a commit diffSAST + SCA + secrets + CI (ASPM)
ScopeWhole app, deployedWhat the changeset introducedWhole repo, static
Findings1032036
Live confirmation18 reproduced + confidence tiersNone (static)None (static)
Dependency CVEs (SCA)NoNoYes — 3 (partial; needs lockfile)
Secrets scanningPartial (source)NoYes — 17 (source + tests)
RemediationProse + attack pathsGenerated patchFix-time estimate + guidance
Intentional vs unintendedNoYesNo
SpeedHeavy — 2h 28mLight — diff-scoped~52 seconds
Sweet spotPentest / exploitabilityPR gate / regressionsContinuous baseline

Gap analysis — three ways

Because the taxonomies differ, overlap is mapped at the issue-area level. The clearest read: each tool owns a distinct lane, they agree on very little, and Aikido is what plugs the dependency-CVE hole.

What each tool uniquely brings

Audn

Live exploit proof + business logic

18 findings reproduced against the running target — the only live confirmation across all three tools. Plus the whole IDOR / broken-access-control / business-logic layer (basket, order, wallet overspend, coupon abuse) that pattern-based SAST can't reason about, and 32 attack-path chains.

  • Only tool that proves exploitability live
  • Business-logic & IDOR depth
  • Confidence tiers (confirmed vs lead)

Codex

Introduced-bug & changeset lens + patches

Diff-aware review that catches unintended regressions no whole-repo scan looks for: 2FA temp-JWT accepted as bearer, complaint-scan DoS, Web3 listener race, Google-Fonts privacy leak, Windows i18n bug — and ships a patch per finding.

  • Distinguishes "introduced" vs pre-existing
  • Privacy / DoS / cross-platform regressions
  • Copy-pasteable fix diffs

Aikido

Dependency CVEs + secrets + speed

The only tool that runs SCA: 3 dependency CVEs (jsonwebtoken, express-jwt, sanitize-html) — closing the gap the other two share. Plus aggressive secrets detection across 40+ files incl. tests, CI/IaC hardening, and a full scan in ~52 seconds.

  • Dependency CVEs (SCA) — unique here
  • Secrets in source + test fixtures
  • Fastest by far (52s vs 2h 28m)

① All three agree — 3 issues (highest confidence)

When a live red-team, a diff reviewer, and a commercial SAST/SCA platform independently land on the same thing, it's as close to "definitely real" as this set gets.

1
JWT signature is not verified

Audn (algorithm-confusion + hard-coded key in lib/insecurity.ts) · Codex (forged-JWT registration) · Aikido ("JWT signature is not verified" in insecurity.ts, authenticatedUsers.ts).

2
Unpinned 3rd-party GitHub Actions with repo token

Audn #54 (mutable actions get write) · Codex #1/#2 (unpinned + patch) · Aikido ("3rd party GitHub Actions should be pinned" in image_actions.yml, ci.yml).

3
Remote fetch without integrity check in CI

Audn #32 (remote installer, no integrity) · Codex #6/#12 (npm/lockfile/scripts) · Aikido ("binary pulled from remote without integrity check" in ci.yml).

② Aikido's unique contribution — what only it found

23 of Aikido's 36 are unique to it. The headline: SCA dependency CVEs (nobody else ran SCA) and a broad secrets sweep including test fixtures. Hover a chip for its location.

3
Dependency CVEs (SCA) — closes the shared blind spot
jsonwebtoken — attacker can abuse missing input validationexpress-jwt — attacker can abuse improper authorizationsanitize-html — XSS attack possible
15
Secrets in source & test fixtures
1 exposed secret1 exposed secret1 exposed secret33 exposed secrets1 exposed secretExposed JWTExposed JWTExposed JWT6 exposed secrets4 exposed secrets1 exposed secret1 exposed secret5 exposed secrets2 exposed secrets6 exposed secrets
5
Other SAST / CI findings the others missed
Unsafe YAML load can lead to RCEdocument.write() methods can lead to XSSXSS via window.location.hrefFile inclusion via reading fileactions/checkout persists Git credentials

③ The Audn+Codex overlaps (and where Aikido joins)

ALL 3

Forgeable / weakly-verified JWT

Audn traces the hard-coded key + algorithm-confusion in lib/insecurity.ts; Codex flags a newly-introduced global registration of forged JWTs; Aikido's SAST flags "JWT signature is not verified" in the same files. Rare triple agreement — treat as real.

ALL 3

Unpinned CI actions w/ repo token (image_actions.yml)

image_actions.yml runs mutable third-party actions with the repo token. Audn (Medium lead), Codex (High + pinning patch), and Aikido ("3rd party GitHub Actions should be pinned") all flag it.

Audn + Codex

Release-tag command injection (news workflows)

Shell-command injection from the release tag in the news-update workflows. Aikido did not surface this one.

Audn + Codex (+ Aikido on integrity)

npm lockless / mutable Docker supply chain

Audn: lockless installs + mutable Docker base. Codex: deleted lockfiles + --ignore-scripts removed. Aikido overlaps on "binary pulled without integrity check" in ci.yml.

Audn + Codex

LLM chat order-lookup authorization

Chatbot getOrderById trusts an unverified/unsigned JWT + lossy email match. Aikido's pattern SAST did not reason about this authorization logic.

Audn + Codex

Web3 listener routes (complementary bugs)

Same files, different bug each (missing ownership vs listener race). Aikido did not flag these.

④ Still unique to Codex — 9 findings no one else caught

Adding Aikido does not cover these: they're introduced/diff-scoped logic, privacy, DoS and cross-platform bugs that only a changeset-aware reviewer surfaces.

High
2FA temporary JWTs accepted as bearer auth

A commit stopped inserting no-data JWTs into authenticatedUsers to avoid a crash, but those tokens are still not rejected — they flow through as valid bearer auth. A subtle regression an app-surface red-team wouldn't reach.

routes/2fa flow / insecurity.ts
Medium
Unbounded complaint similarity scan → DoS

A per-request challenge check runs an unbounded ComplaintModel.findAll() plus an O(n) string-similarity loop over every complaint — a denial-of-service amplifier introduced by the changeset.

routes/verify.ts, models/complaint.ts
Medium
Junie AI-skill curls untrusted reference URLs (SSRF)

A newly-added developer/AI-agent skill fetches arbitrary URLs with shell curl and feeds the response back to the agent — untrusted retrieval that can reach localhost/link-local/internal ranges. A supply-chain / agent-tooling surface Audn never scanned.

.junie/skills/add-reference/SKILL.md
Medium
External Google Fonts load leaks CTF visitor metadata

The new default "neon-fire" theme hard-codes remote Google Fonts (fonts.googleapis.com/gstatic.com), leaking every visitor's IP/UA/referer to a third party. A privacy/info-leak class Audn's exploit-focused lens ignores.

config/ctf.yml, index.html
Low
Windows-only i18n restore path bug

New code passes a native Windows absolute glob to Unix-only basename parsing — breaks i18n file restore on Windows. A cross-platform robustness bug, invisible to a Linux live target.

lib/startup/restoreOverwrittenFilesWithOriginals.ts
Info
Challenge-name capitalization hides Hacking Instructor

A display-name capitalization mismatch breaks an exact-match lookup, making the Exposed-Credentials guided tutorial unavailable. Non-security functional regression.

data/static/challenges.yml
Info
Complaint length test drops max-boundary assertion

Test-coverage regression: the spec no longer asserts that exactly 4096 chars is valid. Pure code-health finding.

complaint.component.spec.ts
Info
Missing snippet metadata now causes 500

Optional metadata-file absence is no longer handled gracefully and throws a 500 instead of degrading. Robustness regression.

routes/vulnCodeSnippet.ts

⑤ Still unique to Audn — the live-confirmed & business-logic layer

Aikido's SAST overlaps Audn on injection/XSS/secrets, but the live-confirmed criticals and the whole IDOR / broken-access-control / business-logic set stay Audn-only — pattern scanners don't reason about authorization. Green = reproduced live.

13
Broken Access Control / IDOR
Anonymous users can modify productsUsers can edit reviews owned by othersOrdinary users can enumerate all user profilesAnonymous callers can forge product reviewsBasket IDOR exposes other users' cartsDuplicate BasketId bypasses basket ownership checkCoupon update lacks basket ownership checkCheckout lacks basket ownership validationArray ID exposes multiple recycle recordsPremium content served without authorizationMasked email collisions expose other users' ordersAny commenter can rebase pull requestsAnonymous users can access arbitrary orders
12
Sensitive Data Exposure
· 3 live
CWE-532: Insertion of Sensitive Information into Log FileCWE-200: Exposure of Sensitive Information to an Unauthorized ActorCWE-200: Exposure of Sensitive Information to an Unauthorized ActorEndpoint exposes complete runtime configurationRepository code executes with CI secretsProduction error handler exposes stack tracesMetrics endpoint is exposed without authenticationAnonymous FTP directory listing exposes hidden filesArbitrary field selection exposes credential materialCAPTCHA response discloses its answerCAPTCHA answer disclosed in API responseAuthentication token contains the TOTP seed
10
Hardcoded Secrets/Creds
· 4 live
CWE-321CWE-798: Use of Hard-coded CredentialsCWE-798: Use of Hard-coded CredentialsCWE-798: Use of Hard-coded CredentialsBender account password exposed client-sideJim account password exposed client-sideCommitted CTF key permits flag forgeryGenerated users share a hard-coded passwordTOTP secrets stored unencryptedActive user credentials embedded in client code
6
XSS
· 1 live
Search query causes DOM-based XSSTracking ID enables reflected cross-site scriptingCWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)Remote SVG upload enables stored XSSApplication name injects executable HTMLFeedback XSS compromises administrator sessions
6
Path Traversal
ZIP upload permits arbitrary application file overwriteBackslashes bypass quarantine path validationNull suffix bypass enables Windows file traversalUser-controlled layout enables local file disclosureBackslashes bypass log path validationBackslashes bypass key-file path restriction
4
Improper Input Validation
Unvalidated seed data can create administratorsFeedback accepts ratings outside the valid rangeArbitrary wallet balance top-upsUnanchored coupon validation accepts unbounded discounts
3
NoSQL Injection
· 2 live
CWE-943CWE-943NoSQL selector updates every product review
3
DoS / Resource Exhaustion
Unbounded upload can exhaust server diskYAML aliases block the Node.js event loopUnbounded image download exhausts server storage
3
Broken Authentication
Password change skips current-password verificationSecurity answer bypass permits unverified erasure requestsResponse discrepancy enables account enumeration
3
Race Condition
Wallet debit permits concurrent overspendingNew commits bypass completed compliance decisionsConcurrent requests inflate review likes
2
Auth Rate-Limiting
· 2 live
CWE-307CWE-307
2
Weak Credentials/Hashing
· 2 live
CWE-521CWE-916
2
SQL Injection
· 1 live
Login query permits authentication bypassCWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)
2
Other
· 2 live
Spoofable X-Forwarded-For header bypasses password-reset rate limit (account-takeover enabler)Unauthenticated public access logs contain change-password URLs with cleartext current/new passwords
2
Code Injection / RCE
Order data enables remote code executionStored username enables server-side code execution
2
Cleartext Transmission
Default deployment exposes credentials over plain HTTPProduct link uses cleartext HTTP
2
Broken Anti-Automation
Solved CAPTCHAs remain valid for unlimited reuseMissing CAPTCHA record bypasses verification
2
Insufficient Verification
Failed requests satisfy global anti-cheat checksClient header spoofs stored login IP
2
Business Logic
Client clock controls campaign coupon validityUnverified issue references defeat spam enforcement
2
CSRF
OAuth flow omits state validationProfile update lacks CSRF enforcement
1
Weak Password Recovery
· 1 live
CWE-640: Weak Password Recovery Mechanism for Forgotten Password
1
XXE
Anonymous XML upload discloses local files
1
SSRF
Profile image URL enables SSRF
1
Open Redirect
Substring allowlist permits arbitrary external redirects
1
Supply Chain / CI-CD
Unversioned Playwright install can overwrite master

⑥ Unknown unknowns — updated for three tools

Adding Aikido closes one shared blind spot (dependency CVEs) and dents another (secrets). What still isn't covered by any of the three:

Dependency / component CVEs Now covered — Aikido SCA

Aikido surfaced jsonwebtoken, express-jwt, and sanitize-html. Caveat: Aikido itself flagged a missing lockfile, so its dependency view is still partial — add a lockfile for full transitive SCA.

1
End-to-end business-logic exploitation Broken Access Control

Audn surfaces IDOR component leads and Aikido none; the multi-step chains (GDPR erasure, forged-coupon, premium unlocks) are still not demonstrated end-to-end by anyone.

2
Client-side / runtime front-end depth XSS · CSP

All three are code-centric; Angular DOM sinks beyond those flagged, live CSP behaviour, and client routing/auth remain under-explored.

3
Live infrastructure / edge posture unresolved

Codex & Aikido are static; Audn ran live but its transport/header/container items were either never reached (#61) or probed with no verdict (#21) — so the real TLS, the actual HTTP security-header set the Render edge returns, and container hardening remain unresolved, not measured. One curl -I closes most of it.

4
Exploitability of the static majority confidence

All 20 Codex + all 36 Aikido + 83 of Audn's findings are unverified against a live target. Whether each fires in your deployment is still open.

5
Complete SCA / SBOM supply chain

Even with Aikido, no full transitive dependency graph, license posture, or signed SBOM — the lockfile gap means known-vulnerable transitive packages can still hide.

Coverage matrix — by vulnerability class

Where each tool put its attention. ●●● strong (8+), ●● moderate (3–7), ● light (1–2), — none. Shaded rows are classes only Aikido reached (its SCA / deserialization coverage). This is the clearest single view of the three-way spread.

Vulnerability classAudnCodexAikido
SQL Injection21
NoSQL Injection●●31
XSS●●6●●3
XXE1
SSRF121
Path Traversal●●62
Code Injection / RCE212
Insecure Deserialization1
Broken Access Control / IDOR●●●162
JWT / Token Auth●●321
Auth Rate-Limiting2
Weak Password Recovery1
Weak Credentials/Hashing2
Hardcoded Secrets/Creds●●●11●●●17
Sensitive Data Exposure●●●122
Open Redirect11
CSRF2
Broken Anti-Automation2
Business Logic2
Race Condition●●32
Improper Input Validation●●42
Cleartext Transmission2
DoS / Resource Exhaustion●●31
Supply Chain / CI-CD●●●8●●6●●3
Dependency CVE (SCA)●●3
Insufficient Verification●●3

Counts are findings tagged to each class (Codex/Aikido aggregated from their finding lists incl. grouped items). Shaded = Audn 0, Codex 0, Aikido > 0.

All findings

Every finding from all three reports, filterable — the working index behind the analysis.

Aikido — 36 issues

Severity
Engine
#SevIssueEngineLocationOverlap
#1Criticaljsonwebtoken — attacker can abuse missing input validationDependencydependency (jsonwebtoken)Aikido only
#2CriticalRemote Code Execution via eval()-type functionsCode (SAST)userProfile.tsAudn+Aikido
#3CriticalUnsafe YAML load can lead to RCECode (SAST)vulnCodeSnippet.ts, vulnCodeFixes.tsAikido only
#4HighNoSQL injection attack possibleCode (SAST)deluxe.ts, wallet.ts +19Audn+Aikido
#5HighJWT signature is not verifiedCode (SAST)insecurity.ts, authenticatedUsers.tsAll 3
#6HighPath traversal via Express sendFile()Code (SAST)fileServer.tsAudn+Aikido
#7HighSQL injection via string-based query concatenationCode (SAST)dbSchemaChallenge_1.ts, unionSqlInjectionChallenge_1.ts +3Audn+Aikido
#8HighOpen redirect usable in social engineeringCode (SAST)redirect.tsAudn+Aikido
#9HighServer-Side Template Injection via express.render()Code (SAST)dataErasure.tsAudn+Aikido
#10Highexpress-jwt — attacker can abuse improper authorizationDependencydependency (express-jwt)Aikido only
#11High6 exposed secretsSecretusers.ymlAudn+Aikido
#12High4 exposed secretsSecretlogin.ts, login.jsAudn+Aikido
#13Highdocument.write() methods can lead to XSSCode (SAST)index.tsAikido only
#14HighXSS via window.location.hrefCode (SAST)order-history.component.tsAikido only
#15HighFile inclusion via reading fileCode (SAST)validatePreconditions.ts, rsnUtil.ts +9Aikido only
#16High3rd party GitHub Actions should be pinnedCI / IaCimage_actions.yml, ci.ymlAll 3
#17Mediumsanitize-html — XSS attack possibleDependencydependency (sanitize-html)Aikido only
#18Medium1 exposed secretSecret.travis.ymlAikido only
#19Medium1 exposed secretSecretserver.jsAikido only
#20Medium1 exposed secretSecretusers.jsonAikido only
#21Medium33 exposed secretsSecretdatacreator.js, chat.test.ts +21Aikido only
#22MediumHTTP request might enable SSRFCode (SAST)profileImageUrlUpload.tsAudn+Aikido
#23MediumBinary/code pulled from remote without integrity checkCI / IaCci.ymlAll 3
#24MediumXSS via bypassSecurityTrustUrlCode (SAST)track-result.component.ts, search-result.component.ts +2Audn+Aikido
#25Lowactions/checkout persists Git credentialsCI / IaCci.yml, codeql-analysis.yml +11Aikido only
#26Low1 exposed secretSecretoauth.component.spec.tsAikido only
#27LowExposed JWTSecretlast-login-ip.component.spec.tsAikido only
#28LowExposed JWTSecretapp.guard.spec.tsAikido only
#29LowExposed JWTSecretverify.unit.test.ts, verifySpec.js +4Aikido only
#30Low6 exposed secretsSecretcheckKeys.test.ts, web3.test.ts +1Aikido only
#31Low4 exposed secretsSecret2fa.test.tsAikido only
#32Low1 exposed secretSecret2faSetupSpec.jsAikido only
#33Low1 exposed secretSecrettotpSetup.spec.tsAikido only
#34Low5 exposed secretsSecretcurrentUserSpec.js, currentUserSpec.ts +1Aikido only
#35Low2 exposed secretsSecret2faSpec.js, 2fa.test.tsAikido only
#36Low6 exposed secretsSecretuser.test.ts, userApiSpec.jsAikido only

Audn — 103 findings

Severity
#SevFindingCWELocationConfidenceOverlap
#1CriticalCWE-532: Insertion of Sensitive Information into Log File LIVECWE-532server.ts:280ConfirmedAudn only
#2CriticalCWE-307 LIVECWE-307server.ts:340ConfirmedAudn only
#3CriticalCWE-521 LIVECWE-521frontend/src/app/oauth/oauth.component.ts:27ConfirmedAudn only
#4CriticalCWE-321 LIVECWE-321data/static/users.yml:259ConfirmedAudn only
#5CriticalCWE-798: Use of Hard-coded Credentials LIVECWE-798data/static/users.yml:167ConfirmedAudn only
#6CriticalCWE-798: Use of Hard-coded Credentials LIVECWE-798config/7ms.yml:143ConfirmedAudn only
#7CriticalCWE-640: Weak Password Recovery Mechanism for Forgotten Password LIVECWE-640routes/resetPassword.ts:18ConfirmedAudn only
#8CriticalCWE-798: Use of Hard-coded Credentials LIVECWE-798routes/login.ts:59ConfirmedAudn only
#9HighCWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection) LIVECWE-89routes/search.ts:21ConfirmedAudn only
#10HighCWE-943 LIVECWE-943routes/trackOrder.ts:15ConfirmedAudn only
#11HighCWE-943 LIVECWE-943routes/showProductReviews.ts:31ConfirmedAudn only
#12HighCWE-916 LIVECWE-916models/user.ts:73ConfirmedAudn only
#13HighCWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting) LIVECWE-79models/product.ts:42ConfirmedAudn only
#14HighCWE-200: Exposure of Sensitive Information to an Unauthorized Actor LIVECWE-200routes/memory.ts:22ConfirmedAudn only
#15HighCWE-307 LIVECWE-307routes/2fa.ts:16ConfirmedAudn only
#16HighCWE-200: Exposure of Sensitive Information to an Unauthorized Actor LIVECWE-200lib/challengeUtils.ts:52ConfirmedAudn only
#17CriticalSpoofable X-Forwarded-For header bypasses password-reset rate limit (account-takeover enabler) LIVEObservedAudn only
#18CriticalUnauthenticated public access logs contain change-password URLs with cleartext current/new passwords LIVEObservedAudn only
#19CriticalZIP upload permits arbitrary application file overwrite CWE-22routes/fileUpload.ts:27ProbedAudn only
#20CriticalSearch query causes DOM-based XSS CWE-79frontend/src/app/search-result/search-result.component.ts:135ProbedAudn only
#21CriticalMutable base images enter production builds CWE-829Dockerfile:1ProbedAudn+Codex
#22CriticalHardcoded JWT private key enables token forgery CWE-321lib/insecurity.ts:20ProbedAudn+Codex
#23CriticalRelease tag enables cross-repository command injection CWE-78.github/workflows/update-news-www.yml:18ProbedAudn+Codex
#24CriticalTracking ID enables reflected cross-site scripting CWE-79frontend/src/app/track-result/track-result.component.ts:45ProbedAudn only
#25CriticalBuild argument injects arbitrary npm packages CWE-88Dockerfile:18ProbedAudn+Codex
#26HighAnonymous XML upload discloses local files CWE-611server.ts:307ProbedAudn only
#27HighProfile image URL enables SSRF CWE-918server.ts:307ProbedAudn only
#28HighUnbounded upload can exhaust server disk CWE-400server.ts:698ProbedAudn only
#29HighBackslashes bypass quarantine path validation CWE-22routes/quarantineServer.ts:10ProbedAudn only
#30HighOrder data enables remote code execution CWE-94routes/b2bOrder.ts:19ProbedAudn only
#31HighStored username enables server-side code execution CWE-95routes/userProfile.ts:54ProbedAudn only
#32HighRemote installer executes without integrity verification CWE-494.github/workflows/ci.yml:357ProbedAudn+Codex
#33HighRemote SVG upload enables stored XSS CWE-79server.ts:310ProbedAudn only
#34HighLockless installs execute mutable dependency code CWE-829.npmrc:1ProbedAudn+Codex
#35HighJWT verification trusts attacker-selected algorithm CWE-347lib/insecurity.ts:52ProbedAudn+Codex
#36HighRelease tag injects commands into legacy website update CWE-78.github/workflows/update-news-www-legacy.yml:18ProbedAudn+Codex
#37CriticalLogin query permits authentication bypass CWE-89routes/login.ts:32Static leadAudn only
#38HighNull suffix bypass enables Windows file traversal CWE-22routes/fileServer.ts:16Static leadAudn only
#39HighPassword change skips current-password verification CWE-620routes/changePassword.ts:39Static leadAudn only
#40HighEndpoint exposes complete runtime configuration CWE-200routes/appConfiguration.ts:10Static leadAudn only
#41HighRepository code executes with CI secrets CWE-200.github/workflows/ci.yml:229Static leadAudn only
#42HighSecurity answer bypass permits unverified erasure requests CWE-620routes/dataErasure.ts:74Static leadAudn only
#43MediumProduction error handler exposes stack traces CWE-209server.ts:314Static leadAudn only
#44MediumMetrics endpoint is exposed without authentication CWE-200server.ts:725Static leadAudn only
#45MediumAnonymous FTP directory listing exposes hidden files CWE-548server.ts:267Static leadAudn only
#46MediumAnonymous users can modify products CWE-862server.ts:368Static leadAudn only
#47MediumYAML aliases block the Node.js event loop CWE-400routes/fileUpload.ts:101Static leadAudn only
#48MediumSubstring allowlist permits arbitrary external redirects CWE-601routes/redirect.ts:13Static leadAudn only
#49MediumUnbounded image download exhausts server storage CWE-400routes/profileImageUrlUpload.ts:24Static leadAudn only
#50MediumUsers can edit reviews owned by others CWE-639routes/updateProductReviews.ts:16Static leadAudn only
#51MediumNoSQL selector updates every product review CWE-943routes/updateProductReviews.ts:17Static leadAudn only
#52MediumOrdinary users can enumerate all user profiles CWE-862routes/authenticatedUsers.ts:10Static leadAudn only
#53MediumArbitrary field selection exposes credential material CWE-200routes/currentUser.ts:20Static leadAudn only
#54MediumMutable actions receive repository write capability CWE-829.github/workflows/image_actions.yml:29Static leadAudn+Codex
#55MediumUnversioned Playwright install can overwrite master CWE-829.github/workflows/frontend-bundle-analysis.yml:39Static leadAudn only
#56MediumUnvalidated seed data can create administrators CWE-20data/staticData.ts:55Static leadAudn only
#57MediumApplication name injects executable HTML CWE-79lib/startup/customizeApplication.ts:83Static leadAudn only
#58MediumAnonymous callers can forge product reviews CWE-862routes/createProductReviews.ts:14Static leadAudn only
#59MediumUnverified JWT controls chatbot order identity CWE-347routes/chat.ts:42Static leadAudn+Codex
#60MediumCoupon policy enforced only by the LLM CWE-862routes/chat.ts:176Static leadAudn+Codex
#61MediumDefault deployment exposes credentials over plain HTTP CWE-319server.ts:130Static leadAudn only
#62MediumBender account password exposed client-side CWE-798frontend/src/hacking-instructor/challenges/loginBender.ts:75Static leadAudn only
#63MediumJim account password exposed client-side CWE-798frontend/src/hacking-instructor/challenges/loginJim.ts:64Static leadAudn only
#64MediumCAPTCHA response discloses its answer CWE-200routes/captcha.ts:22Static leadAudn only
#65MediumSolved CAPTCHAs remain valid for unlimited reuse CWE-294routes/captcha.ts:35Static leadAudn only
#66MediumFailed requests satisfy global anti-cheat checks CWE-345lib/antiCheat.ts:51Static leadAudn only
#67MediumCommitted CTF key permits flag forgery CWE-321ctf.key:1Static leadAudn only
#68MediumProduct link uses cleartext HTTP CWE-319config/addo.yml:57Static leadAudn only
#69MediumClient clock controls campaign coupon validity CWE-602frontend/src/app/payment/payment.component.ts:152Static leadAudn only
#70MediumFeedback accepts ratings outside the valid range CWE-20models/feedback.ts:57Static leadAudn only
#71MediumBasket IDOR exposes other users' carts CWE-639routes/basket.ts:18Static leadAudn only
#72MediumDuplicate BasketId bypasses basket ownership check CWE-639routes/basketItems.ts:21Static leadAudn only
#73MediumCoupon update lacks basket ownership check CWE-639routes/coupon.ts:11Static leadAudn only
#74MediumUser-controlled layout enables local file disclosure CWE-22routes/dataErasure.ts:103Static leadAudn only
#75MediumCAPTCHA answer disclosed in API response CWE-200routes/imageCaptcha.ts:24Static leadAudn only
#76MediumMissing CAPTCHA record bypasses verification CWE-693routes/imageCaptcha.ts:42Static leadAudn only
#77MediumWallet debit permits concurrent overspending CWE-362routes/order.ts:148Static leadAudn only
#78MediumCheckout lacks basket ownership validation CWE-639routes/order.ts:34Static leadAudn only
#79MediumArray ID exposes multiple recycle records CWE-639routes/recycles.ts:11Static leadAudn only
#80MediumPremium content served without authorization CWE-862routes/premiumReward.ts:12Static leadAudn only
#81MediumResponse discrepancy enables account enumeration CWE-204routes/securityQuestion.ts:12Static leadAudn only
#82MediumArbitrary wallet balance top-ups CWE-20routes/wallet.ts:23Static leadAudn only
#83MediumClient header spoofs stored login IP CWE-345routes/saveLoginIp.ts:18Static leadAudn only
#84MediumMasked email collisions expose other users' orders CWE-639routes/orderHistory.ts:13Static leadAudn only
#85MediumAuthentication token contains the TOTP seed CWE-200routes/2fa.ts:26Static leadAudn only
#86MediumUnverified issue references defeat spam enforcement CWE-840.github/workflows/pr-compliance.yml:275Static leadAudn only
#87MediumAny commenter can rebase pull requests CWE-862.github/workflows/rebase.yml:3Static leadAudn only
#88MediumLossy email masking breaks order ownership CWE-187routes/chat.ts:158Static leadAudn+Codex
#89MediumNew commits bypass completed compliance decisions CWE-367.github/workflows/pr-compliance.yml:3Static leadAudn only
#90MediumJWT algorithm confusion accepts forged tokens CWE-347routes/verify.ts:111Static leadAudn+Codex
#91MediumAnonymous users can access arbitrary orders CWE-639routes/trackOrder.ts:12Static leadAudn only
#92MediumOAuth flow omits state validation CWE-352frontend/src/app/login/login.component.ts:147Static leadAudn only
#93MediumUnanchored coupon validation accepts unbounded discounts CWE-20lib/insecurity.ts:102Static leadAudn only
#94MediumGenerated users share a hard-coded password CWE-798data/datacreator.ts:310Static leadAudn only
#95LowConcurrent requests inflate review likes CWE-362routes/likeProductReviews.ts:25Static leadAudn only
#96LowPublic wallet address accepted as ownership proof CWE-345routes/nftMint.ts:41Static leadAudn+Codex
#97LowProfile update lacks CSRF enforcement CWE-352routes/updateUserProfile.ts:16Static leadAudn only
#98LowWallet ownership is never verified CWE-862routes/web3Wallet.ts:14Static leadAudn+Codex
#99LowTOTP secrets stored unencrypted CWE-312routes/2fa.ts:105Static leadAudn only
#100InfoActive user credentials embedded in client code CWE-798frontend/src/hacking-instructor/challenges/exposedCredentials.ts:51Likely FPAudn only
#101InfoFeedback XSS compromises administrator sessions CWE-79frontend/src/app/administration/administration.component.ts:86Likely FPAudn only
#102InfoBackslashes bypass log path validation CWE-22routes/logfileServer.ts:9Likely FPAudn only
#103InfoBackslashes bypass key-file path restriction CWE-22routes/keyServer.ts:10Likely FPAudn only

Codex — 20 findings

Severity
#SevFindingKey filesOverlap
#1HighUnpinned CI image actions receive repository token.github/workflows/image_actions.yml, github/workflows/image_actions.ymlAudn+Codex
#2HighUnpinned image workflow actions expose CI token.github/workflows/image_actions.yml, github/workflows/image_actions.ymlAudn+Codex
#3High2FA temporary JWTs accepted as bearer authserver.ts, lib/insecurity.tsAudn+Codex
#4HighGlobal forged-JWT registration enables account takeoverlib/insecurity.ts, server.tsAudn+Codex
#5HighRelease tag command injection in legacy website workflow.github/workflows/update-news-www-legacy.yml, tab_news.mdAudn+Codex
#6HighUnpinned npm installs in release and Docker buildspackage-lock.js, bin/semver.jsAudn+Codex
#7HighChat order tool trusts unverified JWT identityroutes/chat.ts, server.tsAudn+Codex
#8HighChat order tool trusts unsigned JWT identityroutes/chat.ts, lib/insecurity.tsAudn+Codex
#9MediumUnbounded complaint similarity scan enables DoSserver.ts, routes/verify.tsCodex only
#10MediumLazy Web3 imports race creates duplicate listenersserver.ts, routes/nftMint.tsAudn+Codex
#11MediumLazy ethers import races Web3 listener creationroutes/nftMint.ts, routes/web3Wallet.tsAudn+Codex
#12MediumCI smoke test re-enables npm lifecycle scripts.github/workflows/ci.yml, package.jsAudn+Codex
#13MediumJunie skill curls untrusted reference URLs.junie/skills/add-reference/SKILL.md, REFERENCES.mdCodex only
#14MediumUnsafe Junie curl crawling can expose local/internal resources.junie/skills/add-reference/SKILL.md, junie/skills/add-reference/SKILL.mdCodex only
#15MediumExternal Google Font leaks visitor metadataconfig/ctf.yml, frontend/angular.jsCodex only
#16LowUnconditional Google Fonts load leaks CTF visitor metadataserver.ts, frontend/angular.jsCodex only
#17LowWindows i18n restore uses Unix-only basename parsingen.js, lib/startup/restoreOverwrittenFilesWithOriginals.tsCodex only
#18InfoChallenge name mismatch hides Hacking Instructordata/static/challenges.yml, frontend/src/hacking-instructor/challenges/exposedCredentials.tsCodex only
#19InfoComplaint length test no longer checks max boundaryfrontend/src/app/complaint/complaint.component.spec.ts, frontend/src/app/complaint/complaint.component.tsCodex only
#20InfoMissing snippet metadata now causes 500 errors.info.yml, server.tsCodex only

Recommended stack — where each scanner runs

These three aren't competitors; they're gates at different points on the path from commit to main. Cost sets the cadence: Aikido is cheap enough for every push, Codex rides every PR, and Audn — heavy and needing a live target — runs at the merge-to-main gate, exactly as you called it.

On every commit / push
Aikido~52s
SAST + SCA + secrets + CI/IaC baseline
  • Fail on a new dependency CVE
  • Fail on a committed secret
  • Flag obvious injection / XSS sinks
Fast enough to run on every push without slowing anyone down — and it's the only one that catches the dependency-CVE + secrets class.
When a PR is opened
Codexlight
Diff-aware review of the changeset
  • Block introduced regressions / logic bugs
  • Attach the generated patch to the review
  • Skip intentional / known vulns
Rides each pull request; tells reviewers what this change broke vs what was already there — and hands them a fix.
Your call
When the PR is ready to merge → main
Audn~2h 28m
SAST + live red-team against a deployed preview of the branch
  • Block merge on a live-confirmed critical
  • Surface business-logic / IDOR chains
  • Rank by confidence (confirmed vs lead)
The last line before code hits main — the only tool that proves real exploitability. Too heavy for every commit; perfectly placed at the merge gate.
⚑ Prereq: Audn needs a running target — deploy the PR to a preview / staging environment first, then point Audn at it.
On main / in production
main
Keep the baseline live
  • Aikido continuous re-scan (new CVEs land daily)
  • Audn periodic re-run vs prod / staging
Dependency CVEs surface after merge too, so the baseline scan never really stops.

Why this order — cheapest & most frequent first, exploit-proof last

GateToolRuns onCostBlocks the merge when…
BaselineAikidoevery commit / push~52sa new dependency CVE or a secret enters the tree
PR gateCodexPR openedlightthe diff introduces a regression or logic bug
Merge-to-main gateAudnPR ready to merge~2h 28ma vuln is live-confirmed exploitable on a preview deploy
Post-mergeAikido + Audncontinuous / periodicmixed— monitoring for new CVEs & drift, not a gate

The logic: run the cheapest, highest-frequency check (Aikido) earliest and often; reserve the expensive live-target check (Audn) for the merge-to-main milestone, where a false "ship it" is most costly. Codex sits in the middle as the human-review companion. One caveat worth planning for: Audn's ~2h 28m run means the merge gate is not instant — budget for it, or run Audn against the preview as soon as the PR is approved rather than at the moment of merge.