[GRAYBOX PENTEST]

They got the credentials.
What can they get next?

They got the credentials.
What can they get next?

Test how far an authenticated identity can reach—with reproducible proof for every failed boundary.

Logo 9
Logo 7
Logo 11
Logo 13
Logo 5
Logo 14
Logo 12
Logo 2
Logo 4
Logo 3
Logo 4
Logo 7
Logo 14
Logo 9
Logo 4
Logo 11
Logo 3
Logo 15
Logo 2
Logo 10
Logo 12

[Beyond payload scanning]

Your code explains the risk.
A real login proves it.

CodeAnt combines source-level context with authenticated access to prove what each user, role and tenant can reach.

START PENTEST

NO CC REQUIRED

Code context

Authenticated context

Runtime validation

Proven reachability

Code context

Authenticated context

Runtime validation

Proven reachability

Every request traced to the guard that should stop it. We map each route's middleware chain and flag handlers that hit a query with no owner or tenant check.

Static analysis · api-service
middleware chain per route
37 routes3 flagged
GET
/invoices/:id
invoices.controller.ts
PATCH
/members/:id/role
members.controller.ts
POST
/billing/apply-credit
billing.controller.ts
GET
/exports/:id
exports.controller.ts
DELETE
/api-keys/:id
keys.controller.ts
GET
/me/billing
account.controller.ts
2 unguarded1 to verify34 clean
Guard chain requireAuth requireRole claim check
Data flow req.body.rolemembers.update()write · privileged
Role guard present in sourceClaim validation queued for runtime
Check present

Source to sink

We follow each parameter to its query. An unfiltered id hitting findOne() surfaces on its own.

Source
req.params.id
untrusted
Propagates
InvoiceService.getById()
no check
Sink
db.invoices.findOne({ id })
no owner filter
Source
req.params.id
untrusted
Propagates
InvoiceService.getById()
no check
Sink
db.invoices.findOne({ id })
no owner filter

Guard chain resolved

We read the guards each handler runs. A missing assertTenant is a BOLA candidate before we send a packet.

requireAuthenforced
requireRole('admin')enforced
assertTenant(req.user, id)absent
BOLA candidate, queued for runtime

The same path, replayed as every identity you issue. We drive requests across roles, tenants and claims, then check the response against the policy the code claims.

Authorization matrix
same path · replayed as every identity
24 requests1 crossed
M
Membertenant A · member
V
Viewertenant B · viewer
F
Forged JWTrole=admin · unsigned
R
Revokedtoken · after logout
RequestReplayed asPolicy expectsServer returnedResult
GET /workspaces/B/invoicesMMember403403as policy
PATCH /members/88/roleVViewer403403as policy
DELETE /api-keys/prodFForged JWT401401as policy
GET /exports/7731VViewer403403as policy
POST /coupons/applyMMember403403as policy
GET /me/billingRRevoked401200 OKcrossed

Real roles and tenants

Sessions carry the exact tenant_id and role your users hold. Tenant A asking for tenant B is a real test.

Sessions under test2 tenants
M
member@acmeAcme workspace
tenant Amember
V
viewer@globexGlobex workspace
tenant Bviewer
member@acme → tenant BGET /workspaces/B/invoices
200 · leaked

Claim and session tampering

We flip role in the token, strip the signature, and replay after logout to see if the server revalidates.

Token tampering4 edits
jwt.role
"member""admin"
accepted
header.alg
HS256none
rejected
session
replay after /logout
session valid
claims.exp
+1h+30d
accepted

Suspicion in. Executed evidence out. Each candidate fires against the running app. It returns unauthorized data with a captured exchange, or it's dropped.

Runtime execution · staging
5 candidates from code · fired at the live app
target reachable
In queue5
Confirmed0
Dropped0
Progress
Candidate from codeSent asExpectedLive responseVerdict
GET /workspaces/B/invoicesmember@acme403waitingqueued
GET /exports/7731viewer@globex403waitingqueued
PATCH /members/88/rolemember@acme403waitingqueued
GET /me/billingrevoked token401waitingqueued
POST /billing/apply-creditmember@acme409waitingqueued

Run against the live app

Nothing is a finding until it runs. We send it, capture status, latency and body, and diff the baseline.

Live requestready
Request
GET /workspaces/B/invoicessent as member@acme
Baseline
401 · 0 recordswhat the policy allows
Response
200 OK · 42 records142 ms · 18.4 kB
unauthorized

No false positives

Paths the server blocks are dropped. You triage confirmed access, not a scanner's guesses.

Triage5 fired
1 confirmed4 dropped
PATCH /members/88/role200 · confirmed
GET /exports/7731403 · dropped
POST /coupons/apply409 · dropped
GET /me/billing401 · dropped
DELETE /api-keys/prod403 · dropped

Exactly what the identity accessed or changed. Every finding ships with the identity, request, response and a one-command repro, mapped to its class.

Proven findings · api-service
6 boundaries crossed · each backed by a runtime exchange
6 findingsall reproducible
BoundaryCrossed withProven accessClass
TenantMember · tenant ATenant B's invoicesBOLA / IDOR
RoleStandard memberAdmin-only mutationPrivilege escalation
ClaimUnsigned JWTProtected admin APIAccess control
WorkflowValid credit requestBalance drained ×3Business logic
SessionRevoked tokenAccess after logoutSession control
Rate limit5 attempts / min400 attempts acceptedAbuse control
bb-0142 · Tenant boundary
captured exchange
BOLA / IDOR
Identitymember@acme · tenant A
RequestGET /workspaces/B/invoices/8812
HTTP/1.1 200 OK { "tenant_id": "B", "total": 18400 }
42records read
0records changed
1 cmdto reproduce
Suggested fixre-test queued
- findOne({ id })
+ findOne({ id, tenantId: user.tenantId })

Blast radius, counted

We report records read and writes committed, not a severity label with nothing behind it.

Blast radiusbb-0142
0records read cross-tenant
0privilege writes committed
A→Btenants traversed
Counted from the captured exchange

One-command repro

The exact identity, headers and payload ship as curl your team can paste and confirm.

One-command reproCopy

[CUSTOMER STORIES]

Teams trust CodeAnt
to prevent breaches

"CodeAnt is the most advanced and thorough penetration test we've run to date. It delivered superior results in a fraction of the time of our previous engagements."

Jason Powell

SVP, Engineering & Product, Phunware (Public Company)

"CodeAnt is the most advanced and thorough penetration test we've run to date. It delivered superior results in a fraction of the time of our previous engagements."

Jason Powell

SVP, Engineering & Product, Phunware (Public Company)

"CodeAnt is the most advanced and thorough penetration test we've run to date. It delivered superior results in a fraction of the time of our previous engagements."

Jason Powell

SVP, Engineering & Product, Phunware (Public Company)

[HOW IT WORKS]

Your software changes.
Your threat model should too.

01 / SIGN IN

Establish the principal.

Record the identity, role, tenant, claims and permissions.

02 / PROBE

Break authorization

Manipulate identifiers, roles, methods, claims and workflow state.

03 / PROVE

Validate exploitability.

Capture the identity, request, response and failed control.

04 / TRACE

Trace the impact.

Show the data, operations and systems now reachable.

[THE FULL SECURITY LIFECYCLE]

[THE FULL SECURITY LIFECYCLE]

One security graph.
Code to attack surface.

CONTEXT

THREAT MODEL

ATTACK

PROOF

Source, IaC, dependencies, secrets, endpoints, cloud config, commit history read the way an attacker would, resolved into one context graph.

The graph shows where the application breaks: auth boundaries, trust assumptions, data flows, paths from untrusted input to something worth reaching. Ranked before anything runs.

500+ agents run those paths against the running application, chaining recon, injection, access control, and business logic the way a real attacker does.

Nothing reaches you unless it was exploited — with the request, the response that proved it, and steps to reproduce. Review, not investigation.

[WHY GRAYBOX]

Why security teams
choose gray box.

Black box

Unauthenticated external exposure

Starting point

Public URL

Authentication

No

Best for

External exposure

Sees internal roles

Limited

GRAYBOX

Post-authentication exposure

Starting point

Scoped credentials

Authentication

Yes

Best for

Authorization + logic

Sees internal roles

Deeply

White box

Full code-to-runtime exposure

Starting point

Source + application

Authentication

Yes

Best for

Deepest coverage

Sees root cause

Directly

[What your team receives]

A report you can share.
Evidence engineers can use.

[SECURE & COMPLIANT]

Security first design

built for enterprises

Security first design

built for enterprises

Security first design

built for enterprises

AICPA

SOC2

TYPE 2

AICPA

SOC2

TYPE 2

SOC 2 Type II

COOL
VENDOR
2026

COOL
VENDOR
2026

Gartner Cool Vendor 2026

HIPAA Compliant

[FAQ]

Frequently Asked
Questions

What access does gray box testing need?

How is gray box different from black box?

What kinds of issues is gray box best at finding?

Can testing be done safely in production?

[GET STARTED]

See how far trusted
access can go.

Put your hardest security questions
to the test.

START PENTEST

NO CC REQUIRED