Findings

What a verified finding looks like.

Illustrative, anonymised findings that show how Countermind reports web, API, cloud and Web3 issues. Each one is laid out the way a researcher signs it in a report.

findings shown
12
surfaces
3
signed by a researcher
12

Filter findings

12 of 12 findings

Severity
Class
ZF-0147-02
Severity
Critical
Class
CWE-639
CVSS 3.1
9.6

Merchants can read each other's settlements

With one merchant's API key, the settlements and IBANs of 1,284 merchants could be read.

Evidence

  1. # Merchant MRC-40977 key, merchant MRC-58213 data
  2. GET /v2/merchants/MRC-58213/settlements
  3. Authorization: Bearer ██████████████████
  4. HTTP/1.1 200 OK

Web & API · Authorisation

ZF-0139-03
Severity
Critical
Class
CWE-284
CVSS 3.1
9.1

A build runner can take the production admin role

Any pull request could run code that assumed the production administrator role in the cloud account.

Evidence

  1. # From a pull request build job
  2. aws sts assume-role --role-arn ████████████████:role/prod-admin
  3. "AssumedRoleUser": {"Arn": "...:assumed-role/prod-admin/ci"}

Cloud · AuthorisationDetail in the report

ZF-0147-05
Severity
High
Class
CWE-362
CVSS 3.1
7.5

A refund can be paid twice with two parallel requests

Two approvals sent at the same moment both succeeded, so one refund was paid out twice.

Evidence

  1. # Two requests at the same moment
  2. POST /v2/refunds/RFD-20417/approve
  3. 1 200 OK {"status": "paid"}
  4. 2 200 OK {"status": "paid"}

Web & API · Business logicDetail in the report

ZF-0152-01
Severity
High
Class
CWE-269
CVSS 3.1
8.1

A member can promote themselves to workspace admin

A regular member could change their own role and gain billing and member management rights.

Evidence

  1. # Member token, own profile
  2. PATCH /v1/members/me {"role": "admin"}
  3. HTTP/1.1 200 OK
  4. {"role": "admin"}

Web & API · AuthorisationDetail in the report

ZF-0158-02
Severity
High
Class
CWE-682
CVSS 3.1
8.2

Rounding in withdraw pays out more than a user's share

Repeated small withdrawals rounded in the user's favour and slowly drained the vault's other depositors.

Evidence

  1. # Fork test, 1 share redeemed 400 times
  2. vault.withdraw(1, user, user) x400
  3. expected 400 wei
  4. received 800 wei

Web3 · Business logicDetail in the report

ZF-0144-07
Severity
Medium
Class
CWE-640
CVSS 3.1
5.4

Reset links still work after the password changes

An old reset link stayed valid after a password change, so anyone who later got into the user's inbox could still reset the account.

Evidence

  1. # Link issued before the password change
  2. POST /auth/reset {"token": "████████████"}
  3. HTTP/1.1 200 OK {"reset": true}

Web & API · Session and identityDetail in the report

ZF-0158-04
Severity
Medium
Class
CWE-754
CVSS 3.1
6.5

A stale oracle price is accepted for liquidations

If the price feed stopped updating, liquidations would continue at an hours-old price.

Evidence

  1. # Feed paused for 6 hours on a fork
  2. oracle.latestRoundData() updatedAt: now - 21600
  3. liquidate(position_77) success

Web3 · Business logicDetail in the report

ZF-0139-06
Severity
Medium
Class
CWE-532
CVSS 3.1
5.3

Signed upload URLs are written to a shared log group

Anyone with read access to application logs could reuse valid upload links for up to an hour.

Evidence

  1. # Shared log group, developer read role
  2. INFO upload_url=https://████████████████████?X-Signature=██████████
  3. expires_in=3600

Cloud · Data exposureDetail in the report

ZF-0161-03
Severity
Low
Class
CWE-204
CVSS 3.1
3.7

The login form reveals which emails have accounts

Different error messages let anyone check whether an email address belongs to a customer.

Evidence

  1. POST /login known@ "Wrong password"
  2. POST /login unknown@ "No account found"

Web & API · Session and identityDetail in the report

ZF-0144-09
Severity
Low
Class
CWE-200
CVSS 3.1
3.1

An internal health endpoint is reachable from the internet

The endpoint lists service names and versions, which makes later probing easier.

Evidence

  1. GET /internal/health (no auth)
  2. HTTP/1.1 200 OK
  3. {"api": "4.2.0", "queue": "3.11", "db": "15.4"}

Cloud · ConfigurationDetail in the report

ZF-0152-08
Severity
Info
Class
CWE-1275
CVSS 3.1
n/a

The session cookie relies on browser defaults for SameSite

No direct risk today. Setting the attribute explicitly keeps behaviour stable across browsers.

Evidence

  1. Set-Cookie: sid=████████████; Secure; HttpOnly
  2. # SameSite not set

Web & API · ConfigurationDetail in the report

ZF-0158-09
Severity
Info
Class
CWE-778
CVSS 3.1
n/a

Two admin functions change settings without emitting events

No direct risk. Monitoring cannot see fee or pause changes until someone reads the state.

Evidence

  1. setFee(30) tx ok, logs: []
  2. setPaused(true) tx ok, logs: []

Web3 · ConfigurationDetail in the report

Illustrative findings. Anonymised, not customer data.

Anonymised, with the evidence kept intact.

We publish a finding only when the agreed terms allow it. Names, domains, keys and personal data are removed; the mechanism, the request and the response stay.

  1. Removed

    Customer names, domains, tokens, personal data and anything that identifies the system.

  2. Kept

    The class of flaw, the request and the response, the impact and the fix.

  3. Signed

    In a delivered report, every finding is reproduced in clean runs and signed by a named researcher.

Read the plus before the words.

Each filled arm is one step of impact. Colour never carries the meaning alone.

  1. Critical

    Direct, low-privilege access to the data or money of many customers.

    2 of 12 findingsShow these
  2. High

    Loss of data, money or privilege for a single customer or account.

    3 of 12 findingsShow these
  3. Medium

    An issue that grows when combined with another flaw, or exposes limited data.

    3 of 12 findingsShow these
  4. Low

    A gap that makes an attacker's job easier but has limited impact alone.

    2 of 12 findingsShow these
  5. Info

    No direct risk; a recommendation that strengthens defences.

    2 of 12 findingsShow these

Every finding is one page of a report.

In a delivered report, each finding sits with the scope, the limits and the retest record.

See how the report is built

Questions about these findings

Are these real customer findings?

The findings on this page are illustrative and anonymised. Real findings are published only when the agreed terms allow it, with names, domains and data removed.

Why are there no company names?

A finding describes a flaw, not a customer. We never publish who was affected, where, or when the work took place.

How is severity set?

A researcher sets it from the demonstrated impact. The Zaaf plus shows it at a glance; CWE and CVSS sit beside it for your tooling.

Do you publish every finding you make?

No. Most findings stay in the customer's report. Publication is opt-in and agreed in writing.

Can I see a full report?

Ask for a shareable sample during the scoping call. A finding page here is one page of a report, without the scope and limits around it.

Bring your scope. Let's plan the Countermind.

Thirty minutes with a Zaaf researcher. You bring one scope; we show you what a Countermind would look at first.

Next step
30-minute call
With
A Zaaf researcher
You bring
One scope
Runs before you agree
Nothing
Book a call