Authentication and session logic
Login, registration, password reset, multi-factor and token issuance — reviewed line by line, because these are the functions where a single wrong comparison is a total compromise.
Application Security
A penetration test tells you the door is unlocked. A code review tells you why the lock was built that way, where else the same pattern was used, and what to change so it stops happening.
Black-box testing can only reach what is exposed. If a dangerous function is behind a feature flag that is currently off, behind an administrative role you were not given, or in a code path that only executes on the first day of the month, no amount of external testing will find it. The source has no such limits — every path is visible, including the ones that are not currently reachable but will be after the next release.
Code review is also the only assessment that finds patterns rather than instances. A test finds one endpoint missing an authorisation check. A review finds that the codebase has three different ways of checking authorisation, that two of them are correct, and that new endpoints are being written using the third. That is a far more useful thing to know, because fixing it prevents the next fifty instances rather than the one.
We combine both halves. Automated analysis provides breadth — our definition library covers 27 languages and runtimes across 50 technology packs, which catches dependency risk, unsafe API usage and configuration issues at scale. Manual review provides judgement, applied to the areas where judgement is what is needed: the authentication code, the authorisation model, the cryptography, the multi-tenancy boundary and anything handling money or personal data.
Coverage
Full coverage on the automated pass; manual effort concentrated where the consequences of an error are highest.
Login, registration, password reset, multi-factor and token issuance — reviewed line by line, because these are the functions where a single wrong comparison is a total compromise.
How access decisions are made, whether they are made consistently, and whether the pattern is enforceable by anything other than developer discipline.
Query construction, command execution, template rendering, deserialisation and file path handling across every entry point.
Algorithm and mode selection, key generation and storage, randomness, and the custom encryption routine somebody wrote in 2019.
Credentials, keys and tokens in source, configuration, container images and version control history — the history matters, because a rotated secret that is still in the git log is still a secret.
Whether tenant separation is enforced at the data layer or hopefully applied in application code.
Third-party components matched against current vulnerability intelligence, with exploit probability so you can triage sensibly rather than chasing every advisory.
The rules that make your product work, checked against the ways they could be made to work differently.
Approach
Sized by codebase and by how much of it needs manual attention. Read-only repository access, and we can work in your environment if code cannot leave it.
A session with a senior engineer: what the system does, where the trust boundaries are, what would be worst. Then we know where to spend the manual hours.
Full static analysis across the codebase, plus dependency and secrets scanning including version-control history.
Automated output is triaged by a person. False positives are removed before you ever see them, which is the difference between a report and a tool export.
Deep review of authentication, authorisation, cryptography, tenancy and money-handling paths, plus anything triage flagged as worth a closer look.
Recurring issues identified as patterns, with the root cause and the systemic fix, not fifty individual tickets.
Findings referenced to file and line, delivered with a session for your engineers, and exported as SARIF so they land in your existing tooling.
Deliverables
The report is the product. If it cannot be acted on by a developer and understood by a director, we have not finished.
Every issue referenced precisely, with the vulnerable code shown and the corrected version alongside it.
The systemic issues behind the individual findings, with the change that prevents recurrence.
Third-party components ranked by exploit probability rather than by advisory count.
What was found in code, configuration and history, with rotation guidance in priority order.
Loadable directly into GitHub, GitLab or your code-scanning dashboard.
A working session with the developers who will implement the fixes.
Is this for you?
If none of them are, say so on the call and we will tell you honestly whether this is the right piece of work — or point you at the one that is.
Book a scoping callHow we work
The same engagement model applies to every piece of work we take on, so you always know what happens next.
A 30-minute call, then a written scope: what is in, what is out, what we need from you and what it costs. Nothing starts before you sign it.
Rules of engagement, testing windows, escalation contacts and a signed authorisation. Out-of-hours windows where production cannot take the load.
Automated coverage first, then manual testing where judgement is required. Critical findings are reported the day we confirm them, not at the end.
One report a developer can act on and an executive can read, with evidence, reproduction steps, business impact and a fix for every finding.
A walkthrough call with your engineers. We answer questions on the fix, not just the finding.
A free retest cycle to confirm the fixes hold, and a clean summary you can hand to a customer, auditor or board.
Questions
The questions clients actually ask during scoping. If yours is not here, ask it directly.
You have to give us read access to it, but it does not have to leave your environment. We can work over a screen-shared session, from a virtual machine you host, or from a read-only repository account, whichever your policy allows. Where code is handled by us, it is covered by an NDA, held only for the engagement and destroyed afterwards on request.
No. Static analysis tools are one input, and we run them — they are excellent at breadth. But they produce a large volume of output, much of it false positives, and they cannot tell you whether an authorisation check is correct for your business rules. Our reports contain only findings a person has confirmed, and the manual review targets exactly the areas that tools handle worst.
Automated coverage spans 27 languages and runtimes across 50 technology packs, including PHP, Java, C#/.NET, JavaScript and TypeScript, Python, Go, Ruby, Rust, Kotlin, Swift, Dart, Scala, Elixir, C and C++. Manual review is language-agnostic in practice — the flawed authorisation patterns are the same everywhere, only the syntax changes.
It depends on size and on how much needs manual attention. A focused review of the security-critical paths in a mid-sized application is typically five to ten working days. A full review of a large codebase is scoped in phases so you get the highest-value areas first rather than waiting weeks for everything.
Yes. Findings export as SARIF, which loads natively into GitHub code scanning, GitLab and most dashboards, and we can help configure automated analysis to run on pull requests so the baseline holds after we leave. Continuous scanning between manual reviews is part of what the platform does.
Yes, and it is worth doing. Removing a credential from the current version of a file does not remove it from the history, and repository history is one of the first places an attacker looks after gaining any level of access. We report what is recoverable and in what order it should be rotated.
Next step
A 30-minute call, then a scope document with what is in, what is out and what it costs. No obligation, and no charge for the conversation.