Nemesis Labs · Research Passive scan · Aggregate · Aug 2026

The State of App Security · Africa

African finance runs on the internet. Here is what the internet already knows about it.

We mapped and passively scanned 618 public applications belonging to 347 African banks, fintechs, payment companies, crypto exchanges and insurers across 21 African countries. One browser-style request each. No logins, no probing, no institution named.

618
Public apps scanned
347
Institutions
21
African countries
34%
Publish a public API
50% of financial apps grade C or below on passive posture. ABC DF

By the numbers

What one afternoon of passive scanning turned up.

83%
carry XSS exposure — no Content-Security-Policy, or one defeated by unsafe-inline.
188
apps carry 3+ exposures at once — nearly one in three of everything scanned.
39%
have no clickjacking protection on the page a user logs in through.
79
financial apps run on WordPress — a CMS attack surface under a bank or fintech brand.
37
answer any site on earth with a wildcard CORS policy, a few on login pages.
14
are serving on invalid or expired certificates right now.

Finding 01 — The inversion

The banks and the fintechs are each half-secure, in opposite ways.

On the edge — a recognizable WAF or CDN out front — the fintechs win easily. On the application itself — the actual defenses in the app — it flips. The newest, fastest companies lean on a CDN and ship the app almost bare. The banks did the opposite.

Institution type Detectable edgeHigh app-attack exposure
Crypto exchanges43 assets
79%
14%
Remittance30 assets
63%
20%
Traditional banks174 assets
30%
22%
Mobile money50 assets
24%
24%
Payment gateways82 assets
61%
27%
Fintechs130 assets
59%
42%
Neobanks36 assets
36%
47%
Lending27 assets
41%
52%
Insurtech18 assets
44%
56%

Crypto — the most-attacked category on earth — is the only one that defends both layers: highest edge adoption, lowest exposure. Everyone else picked one, or neither.

Finding 02 — Susceptibility

Who is actually weak to application attacks.

Measured passively, from missing or defeated defenses — never by attacking. A quarter of the apps that send a Content-Security-Policy weaken it with unsafe-inline, which defeats its XSS protection, so a naive "has a CSP" check would score them safe. This one does not. Share of all 618 apps exposed to each attack:

XSS no / defeated CSP
83%
Clickjacking no frame guard
39%
MITM / SSL-strip no HSTS · bad TLS
32%
WordPress CMS under a bank brand
13%
CSRF no SameSite
12%
Wildcard CORS some on logins
6%
High exposure 3+ at once
30%

Finding 03 — The estate everyone under-serves

Finance became an API business, and the API is the part no header protects.

A third of these institutions now publish a public developer API — 145 developer and API-doc surfaces in all. On the newest fintechs the API ships before the app does.

None of what this report measures — not a single header, not the CDN, not the certificate — touches the risk that has moved to the center of the industry. The attacks that break an API are broken object-level authorization, broken function-level authorization, and business-logic abuse: a request that is perfectly well formed and simply should not have been allowed. There is no header for that. There is no CDN rule for it. A signature-matching WAF cannot see it, because there is no signature for "you asked for an account that is not yours."

The uncomfortable part

This took one afternoon, passively, from a laptop. An attacker has the same view of your estate right now.

Nothing here required special access. No exploit, no login, no permission. Just the response a server hands to any browser that asks. Every institution in this report was mapped that way — and so is yours. The only question the data leaves open is where yours lands on the spectrum.

Scan your own app — free → One request. Passive. See your grade in seconds.

What actually closes the gap

Headers are table stakes. The API layer needs something that learns your app.

A CSP stops a class of injection. A CDN filters known-bad traffic. Neither knows that this user should not be able to read that account, or that a refund should never exceed the original charge. That judgment lives in your app's own logic — so the defense has to learn your app's normal behavior and block the deviation. That is positive security, and it is what Nemesis builds.

Method & ethics

How this was done, and the line it does not cross.

Passive only

One browser-style GET plus a TLS handshake per asset. We read response headers, cookies, CORS, TLS state, and the page's own markup. No authentication, no path probing, no payloads, no exploitation.

Validated twice

Every URL passed liveness (with retries) and an identity check — including TLS-certificate confirmation — before scanning. The scanner is validated against known-good and known-weak controls.

Susceptibility, not exploits

"Weak to X" means the defense against X is missing or defeated, inferred from the public response. We never attacked anyone to find out.

Aggregate, never named

No institution is identified as exposed, here or anywhere. A list of which bank has the weakest headers is the opposite of helpful, and building it is not the point.

Scope: public homepages, login landings, and developer docs of financial institutions, gathered from public sources. Figures reflect the latest validated snapshot and may move by a percentage point between runs as live infrastructure changes. Security teams: scan your own estate, or reach out for the methodology.