Non-functional
Security testing for financial applications
Security testing for financial applications attacks web apps, APIs, and mobile apps through payment and transfer logic abuse, access to other customers' accounts, race conditions on money movement, card data exposure, and leaked partner API keys. Buyers receive a penetration test report, findings with retest results, PCI DSS requirement 11 test evidence, and an access control and authorisation test matrix.
What fintech penetration testing covers
A refund call on another merchant's payment, a withdrawal sent twice in the same millisecond, or a processor secret key inside a mobile build moves money directly. We run web, API, and mobile penetration tests for payment acquirers, banking-as-a-service platforms, neobanks, crypto exchanges, business banking, spend management, open banking, KYC and AML providers, and trading platforms. PCI DSS v4.0.1 requirement 11.4.1 requires a methodology that includes application-layer testing to identify, at a minimum, the vulnerabilities listed in requirement 6.2.4. Our test cases follow the OWASP API Security Top 10 2023 (checked 2026-09-16) and the financial failure patterns below.
Payment and transfer business logic
Business logic flaws move money with valid requests and no injection payload. Tests per flow:
- a refund or reversal above the captured amount, in a different currency, or on a payment already refunded;
- negative, zero, and over-precise amounts, such as three decimals on a currency with two minor units, and rounding that credits a fraction on each call;
- a skipped state: capture without authorisation, payout before KYC approval, or transfer from a frozen account, by calling the later endpoint directly;
- a daily transfer limit, card spend control, or withdrawal cap that only the client app enforces;
- an FX quote reused after expiry, or a quote for one amount applied to a larger amount.
OWASP API6:2023, Unrestricted Access to Sensitive Business Flows, covers flows exposed without compensating for how the functionality could harm the business if used excessively in an automated manner. We script that use: referral bonuses and promotional credits claimed from batches of new accounts, and FX quotes requested in bulk so that only the most favourable rate gets executed. Each finding records the ledger effect: which account gained funds and which account or balance sheet lost them.
Authorisation between accounts
Broken Object Level Authorization (API1:2023, CWE-639 Authorization Bypass Through User-Controlled Key) is the defect where customer A reads or acts on customer B's balance, statement, beneficiary, card, or KYC document by changing an ID. We create at least two customers, two tenants, and every documented role, then call each operation with another party's object IDs. Random UUIDs do not fix a missing ownership check, so we collect IDs from responses, webhooks, and exports.
Property and function checks follow. A customer sets limit, fee_rate, or status through a field the API should ignore (API3:2023). A customer token calls a support endpoint for manual balance adjustment or limit override (API5:2023). In multi-user business accounts, a viewer approves a payment, or an approver approves a payment they created. Every result goes into the access control and authorisation test matrix.
Race conditions on money movement
CWE-362, Concurrent Execution using Shared Resource with Improper Synchronization, turns one balance into two withdrawals. We send parallel requests that each spend the full balance, redeem one voucher, or move funds during a concurrent limit change, then count ledger entries and the final balance instead of trusting HTTP responses. Idempotency abuse tests reuse a key from another account and check that the key is bound to the caller. Functional retry behaviour sits in API and webhook testing, and the payment idempotency guide shows the request sequences.
Card and account data exposure
We search API responses, error messages, logs, analytics events, crash reports, and mobile storage for full PANs, card verification codes, and account numbers. Handling of cardholder data and account data in our own test environment follows our security page. A full PAN in a log platform or crash reporting service brings that system into PCI DSS scope; a full PAN in app storage on a customer device is reported as a finding against requirement 3.5.1. Findings cite PCI DSS v4.0.1 requirements 3.3.1, 3.4.1, and 3.5.1, which the PCI DSS page explains. A payment token that charges a card outside the merchant or wallet it was issued for is also a finding.
Step-up authentication on money movement
Adding a beneficiary, raising a transfer limit, and revealing full card details are the actions an account takeover needs. We replay a step-up token from one payment on a second payment, change the amount or beneficiary after the challenge completes, and call the payment endpoint with a session created before a password reset or device removal. Each accepted request is a finding with the amount it could move.
Partner API keys and secrets
Secret keys for processors, partner banks, and KYC vendors leak through mobile bundles, JavaScript, repositories, and CI logs. Tests confirm that a publishable key cannot run a secret-key operation, that a key scoped to one merchant cannot reach another, that production rejects sandbox keys, and that a rotated key stops working. For mobile app penetration testing we test against OWASP MASVS v2.1.0 (18 January 2024), including certificate pinning with the proxy CA trusted on the device, where the app must still refuse the connection.
Related
Segments
Standards
Scenarios
- Answering a bank's vendor due diligence questionnaire
- Preparing a DORA resilience testing programme
- Adding embedded payments to a vertical SaaS platform
- QA before a partner bank integration goes live
- Preparing for a PCI DSS assessment
- Responding to audit findings on testing and change control
- Preparing for technical due diligence before a funding round or acquisition
Deliverables
Web, API, and mobile penetration test report
A report that records the agreed scope, test dates, methodology, attack paths tried against each web, API, and mobile target, and every finding, for a security lead, a PCI DSS assessor, or a partner bank's vendor review.
Findings with severity, reproduction steps, and retest results
One record per finding with a severity rating, the affected endpoint or screen, the requests or steps that reproduce the finding, the effect on accounts or funds, and the dated retest result after the fix.
PCI DSS requirement 11 test evidence
Penetration test methodology, scope, dates, results, and retest records mapped to PCI DSS v4.0.1 requirements 11.4.1 to 11.4.4, as input to the PCI DSS assessment of a Qualified Security Assessor.
Access control and authorisation test matrix
A matrix of roles, tenants, and API operations that records the expected and the observed result of each call made with another user's, tenant's, or role's credentials, for engineering leads and auditors.
How penetration tests fit your release process
Scope and environment. Tests run against a staging build with production configuration, synthetic customers, test card numbers, and tenants we create. Production tests run only with written authorisation, named test accounts, and an agreed time window. Effort depends on the number of roles and tenant types, state-changing API operations, mobile platforms, and retest rounds; that list is the basis of the quote.
Triggers. PCI DSS v4.0.1 requirements 11.4.2 and 11.4.3 require penetration tests at least once every 12 months and after any significant infrastructure or application upgrade or change. We scope a change test when a release adds a payment flow, a processor or partner bank integration, a new role, or a new public API version.
During the test. Critical findings, such as funds moved between accounts, go to your security lead as soon as they are confirmed, with the reproduction requests. Other findings arrive in the report.
Fix and retest. Under requirement 11.4.4, exploitable vulnerabilities and security weaknesses found during penetration testing are corrected according to the entity's assessment of risk defined in requirement 6.3.1, and penetration testing is repeated to verify the corrections. We retest each fix against the original finding ID and record the retest date in the findings record.
Into CI. Each authorisation and race condition finding becomes an automated API test in your repository. The access control and authorisation test matrix runs on each pull request that changes an endpoint, so a removed ownership check fails the build instead of reaching the next annual test.
Handover. You receive the report, findings in your issue tracker format, and the PCI DSS requirement 11 test evidence for the assessor. The PCI DSS assessment preparation scenario shows where the evidence enters the assessment timeline. Your team owns the fixes, severity acceptance, and any decision to accept a residual risk.
Sample deliverable
Sample, synthetic data
| Control or requirement | Test case IDs | Run date | Result | Evidence file | Reviewer role |
|---|---|---|---|---|---|
| PCI DSS v4.0.1 3.3.1: the card verification code is not stored after authorisation | TC-PCI-031, TC-PCI-032, TC-PCI-033, TC-PCI-034 | 2026-09-08 | Passed: 4 of 4 test cases, no card verification code found in databases, logs, or queues | EP-01_pci-3.3.1_data-store-search.csv | Security test lead |
| PCI DSS v4.0.1 3.4.1: a displayed PAN shows at most the BIN and the last four digits | TC-PCI-040, TC-PCI-041, TC-PCI-042 | 2026-09-10 | Passed on retest: 3 of 3 test cases after the fix for defect DEF-118 (full PAN on the support detail view) | EP-02_pci-3.4.1_masking-per-role_retest.pdf | QA lead |
| PCI DSS v4.0.1 6.2.4: the refund API rejects a refund on a payment that another account owns | TC-SEC-210, TC-SEC-211 | 2026-09-09 | Passed: 2 of 2 test cases, each cross-account refund request returned HTTP 404 | EP-03_pci-6.2.4_refund-object-authorisation.pdf | Security test lead |
| SOC 2 CC6.2: sessions and API tokens of a deactivated user are rejected | TC-ACC-015, TC-ACC-016, TC-ACC-017 | 2026-09-09 | Passed: 3 of 3 test cases, each request after deactivation returned HTTP 401 | EP-04_soc2-cc6.2_deprovisioning-log.csv | QA lead |
| SOC 2 CC8.1: every change in the release ran the regression suite before production | RUN-REG-0907, RUN-REG-0910 | 2026-09-10 | Passed: 27 of 27 change tickets link to a green CI run | EP-05_soc2-cc8.1_ci-runs-per-change.csv | Test automation lead |
| PSD2 RTS Article 4(3)(b): access is blocked after five consecutive failed authentication attempts | TC-SCA-007, TC-SCA-008, TC-SCA-009, TC-SCA-010 | 2026-09-10 | Failed: 3 of 4 test cases passed; the app resets the attempt counter on a new session (defect DEF-131, release blocker) | EP-06_rts-art4-3b_lockout-per-channel.pdf | QA lead |
| PSD2 RTS Article 5(1): the payment executes only with the amount and payee shown at authentication | TC-SCA-020, TC-SCA-021, TC-SCA-022 | 2026-09-08 | Passed: 3 of 3 test cases, a changed payee after authentication invalidated the authentication code | EP-07_rts-art5-1_dynamic-linking.csv | Payments QA engineer |
| PSD2 RTS Article 10a: account information access through a third-party provider requires SCA again after 180 days | TC-AIS-004, TC-AIS-005, TC-AIS-006 | 2026-09-09 | Passed: 3 of 3 test cases, access allowed on day 179 and refused on day 181 without a new SCA | EP-08_rts-art10a_access-decisions.csv | Payments QA engineer |
Test case IDs, defect IDs, run dates, and evidence file names belong to a fictional release; PAN checks used scheme test card numbers, and no real account, customer, or person appears.
Questions
How often should fintech companies conduct penetration testing?
Which compliance frameworks require fintech penetration testing?
What is cybersecurity in fintech?
Scope your security testing
Send your API specification, the list of user roles, and the flows that move money, and we return a penetration test scope per application and role.
Scope your testing