What secure code review finds that a penetration test misses
Secure code review is a manual and tool-assisted examination of application source code for vulnerabilities, and it is usually commissioned when a compliance framework, a customer security questionnaire, a product launch or an insurer asks for assurance that goes below the running application. A penetration test shows what an attacker can reach from outside. A code review shows why the application behaves the way it does, including logic that is never exercised by a single request, such as an authorization check that is missing from one of forty endpoints or a token that is validated in one service but not another. The focus is usually authentication, authorization, input handling, cryptography and the insecure use of third-party libraries inside the code itself. Reviewers also look for the category OWASP lists as A03 Software Supply Chain Failures in the OWASP Top 10:2025, where a dependency, build step or vendored component introduces weakness that no external test would isolate.
The OWASP Application Security Verification Standard (*ASVS*) 5.0.0 notes that verifying many Level 2 and Level 3 requirements needs access to documentation, source code, configuration and the development team, not only black box testing. This is the practical reason the two activities complement each other. A penetration test can confirm that a session cookie is missing a flag or that an admin route answers to a low-privilege user. A source review can confirm whether the authorization decision is enforced server side, how session tokens are generated, whether cryptographic primitives are current, and whether input is parsed safely before it reaches a query or template. Ask the provider which ASVS level they will verify against and which requirements need code or configuration access, because that list determines what you must provide.
Before commissioning a review, confirm three things with your team: the languages and frameworks in scope, read-only access to the relevant repositories and build configuration, and a named developer who can explain design decisions during testing. Also confirm whether the provider will run tools against the code and what they will verify manually. Findings should be reported with the file, line or component, the requirement or weakness category, a reproducible explanation, and a suggested fix, so the development team can act on them and an auditor can trace them. Where the test supports a framework such as ISO/IEC 27001 Annex A control A.8.29 on security testing in development, ask how results will map back to the development life cycle.
What a secure code review can cover in scope
Scope decides what a reviewer can actually test and how much of the codebase the findings represent. Each decision below changes effort, access and the confidence a report can claim, so they are agreed in writing before work starts.
Repositories and branches
Name each repository, the default branch and any release branches that ship to customers. A review of main alone may miss code that is deployed from a long-lived release branch or a hotfix line. Ask which branches are production-bound, whether feature branches are in scope, and which commit or tag the review baseline will use, so findings can be traced to a fixed version of the code.
Components and services
List the services, modules or microservices that handle authentication, authorization, payments, personal data or cryptographic operations. Reviewers focus here first, because a flaw in a session handler matters more than one in a reporting script. Confirm which components are customer-facing, which sit behind an internal gateway, and which are deprecated but still deployed.
Languages and frameworks
Confirm every language, framework and template engine in the scope, including build scripts and serverless functions. Reviewer skill and tooling depend on the stack, so a mix of languages can extend the work. Ask whether the team uses framework security features such as built-in query parameterization or auto-escaping, because the reviewer needs to check that they are used consistently rather than bypassed.
First-party and vendored code
Separate code your team wrote from copied libraries, generated code and vendored third-party components. Reviews normally cover first-party code in depth and check vendored code only for how it is used, since its dependency risks belong to the SBOM and dependency review. Ask for a list of directories that contain vendored or generated code, and for any patched upstream code that differs from its original release.
Configuration and infrastructure-as-code
Decide whether deployment manifests, Terraform or Helm charts, container files and application configuration are reviewed with the source. Insecure defaults such as permissive CORS settings, debug flags or overly broad IAM roles often live in these files, not in application logic. If they are excluded, record that exclusion in the report, because a clean code review does not show the deployed configuration is safe.
Running test instances and access
Decide whether the reviewer needs a running test environment to confirm a suspected issue. Source reading alone can show a missing check, but a test instance shows whether a control is reachable and whether it works end to end. Agree on read-only repository access as the default, the use of non-production data, and who provisions and removes any accounts the reviewer uses.
Rules of engagement
Set rules for secrets discovered in code. Reviewers should report the file path, the commit where the secret appears and its type, but should not copy the secret value into reports or tickets. Also agree on the named developer contacts, how urgent findings are escalated, and whether the team must rotate any exposed credentials. Written rules protect both sides and keep the review inside the agreed boundary.
How a secure code review runs from scoping to retest
The sequence turns a request for a code review into a verified set of findings, each with evidence, a fix path and a retest result. Each phase builds on the one before, so the reader can see what they receive at every stage.
Agree scope and secure repository access
Scoping starts with a written statement of which repositories, branches, services, languages and frameworks are in scope, and which are excluded. The client confirms read access to source, build configuration and dependency manifests, and names a technical contact who can answer questions about design decisions. The step is complete when the scope, access list and rules of engagement are signed off in writing. Ask the provider how it will handle any secrets it encounters during review and where code will be stored during the engagement.
Walk through threat context and architecture
The reviewer meets the development team to learn the application's trust boundaries, data flows, identity provider, session model and deployment topology. Together they identify which assets matter most, such as payment data, personal records or administrative functions, and which components face untrusted input. The output is a short architecture note that maps entry points and trust zones to the code areas that will receive the deepest attention. The step closes when the client confirms the note reflects how the system actually runs.
Run tool-assisted triage across the codebase
Static analysis, dependency and secrets scanners run across the in-scope code to surface candidate issues and map the codebase by size and complexity. The reviewer tunes rules to the framework in use and discards noise, so that manual effort goes where the tools show signal. Tool output is treated as leads, not findings. The step is complete when each lead is either queued for manual review or recorded with a reason for dismissal.
Review high-risk paths manually
A reviewer reads the code paths that tools handle poorly, focusing on authentication flows, session lifecycle, authorization checks on every sensitive operation, input parsing and output encoding, and the use of cryptographic primitives, key storage and random number generation. Business logic is traced end to end, because access control failures often sit between components rather than inside one function. The step produces working notes with file references and a list of suspected weaknesses. It is done when every high-risk path in the architecture note has been read and either cleared or logged.
Validate findings before reporting
Each suspected weakness is confirmed against the code and, where safe, in a test environment that the client provides. The reviewer checks reachability, preconditions and impact, and removes duplicates and false positives. Validation describes weakness categories and the conditions that make them exploitable, without producing exploit code for the client's systems. The step closes when every reported finding has a clear location, a validated condition and a severity rationale that the client's team can reproduce.
Report findings with fix guidance
The report lists each finding with its location in the code, the weakness category, the evidence, the affected requirement or framework mapping, and specific remediation guidance tied to the framework in use. A findings summary helps leadership prioritize, and the detailed section helps developers fix issues. The report should map to the Produce Well-Secured Software practices in NIST SP 800-218 so the client can show where review fits in its secure development life cycle. Ask the provider for a sample report before signing, and confirm how the report will be delivered and who receives it.
Retest fixes and close the cycle
After the development team applies fixes, the reviewer retests each finding against the changed code and records whether the fix addresses the root cause. Findings that remain open or are accepted as risk are documented with the owner's decision. The final document states what was retested, what passed, and what remains, which supports the Respond to Vulnerabilities practices in NIST SP 800-218. The retest scope and any fee for it should be written into the original quote so the client knows what is included.
Weakness categories a secure code review targets
This table maps the main weakness categories a secure code review targets to what they look like in source code and why they matter to the business. Read each row as a pattern for reviewers to search for and trace, with the OWASP Top 10:2025 category noted where it applies. Findings are confirmed by tracing data flow and control flow, not by matching keywords alone.
| Weakness category | What it looks like in source code | Why it matters |
|---|---|---|
| Broken authentication logic | Custom login, token or session code that skips checks on some paths, trusts client-supplied identity claims, or accepts expired or unsigned tokens. Look for password reset and MFA flows built outside the framework's standard components. Maps to A07:2025 Authentication Failures. | Attackers who bypass login logic gain accounts without needing valid credentials, and the flaw often sits in a rarely used branch that tests miss. |
| Missing or inconsistent authorization checks | Endpoints or service methods that check permissions in the UI but not on the server, object lookups by identifier with no ownership test, and role checks that differ between controllers. Maps to A01:2025 Broken Access Control. | This is the most common reason one user can read or change another user's data, and it is hard to see in black box testing because the flaw depends on internal logic. |
| Injection and unsafe input handling | String concatenation used to build queries, shell commands, template output or file paths from request data, and validation applied in one layer but not where the data is used. Maps to A05:2025 Injection. | Unsafe input handling lets untrusted data change how the application or its database behaves, which can expose or alter data across the system. |
| Insecure deserialization | Code that reconstructs objects from request, cache or message data using native serializers, or that trusts types supplied by the sender. Review the libraries used for serialization and the places where their output is read. | Deserializing untrusted data can lead to code execution or logic abuse, and the risk follows the library version, which reviewers must confirm against the dependency inventory. |
| Weak or misused cryptography | Custom encryption routines, deprecated algorithms or modes, fixed or reused initialization vectors and nonces, weak random number generators for tokens, and comparisons of secrets that are not constant time. Maps to A04:2025 Cryptographic Failures. | Cryptographic misuse can look correct in testing while still exposing protected data or allowing forged tokens, and it often affects every user at once. |
| Hard-coded secrets | API keys, passwords, signing keys or connection strings in source files, configuration templates, test fixtures or commit history, and default credentials left in code paths. Maps to A02:2025 Security Misconfiguration where configuration is involved. | A secret in a repository is exposed to everyone with read access and persists in history after the code changes, so it must be treated as compromised once found. |
| Unsafe handling of third-party components | Direct use of libraries with known vulnerabilities, unpinned dependencies, untrusted code loaded at runtime, and third-party SDKs given broad permissions. Maps to A03:2025 Software Supply Chain Failures. | Flaws in components the team did not write are still exploitable in its product, and the review must check how the code calls them, not only which versions are installed. |
How the review approach changes by architecture
A monolithic web application keeps authentication, session handling, authorization checks and data access inside one codebase and usually one deployable unit. The review can follow requests from the HTTP entry point through middleware, controllers and the persistence layer, which makes it easier to confirm that every sensitive route passes through the same checks. Access needed is typically read access to the full repository, the framework configuration and a developer who can explain the request lifecycle.
- Trust boundary: The main boundary sits at the HTTP edge and at the database, so reviewers trace input from each route to each query and template.
- Manual attention: Authorization logic scattered across controllers, custom session code and password reset flows usually needs line-by-line reading.
- Shared libraries: Internal helper modules and vendored framework code are reviewed for how the application calls them, not re-audited in full.
- Generated code: Scaffolding, ORM migrations and template output are checked for the configuration that produced them.
- Framework dependence: Reviewer skill must match the framework and language in use, so confirm supported languages during scoping.
Before the review starts, confirm that the repository, branch and build configuration under review match what is deployed.
In an API or microservices estate, the trust boundary moves between services, gateways and message queues, so a single route may pass through several codebases before it reaches data. Authorization decisions can be split between an edge gateway, an identity provider and each service, and gaps appear where one service assumes another has already checked the caller. Reviewers need access to multiple repositories, the service contracts and enough deployment context to see which services are reachable from outside.
- Trust boundary: Each service-to-service call is a boundary, and reviewers check whether the receiving service re-validates identity and scope.
- Manual attention: Token validation, object-level authorization and the logic that maps caller identity to tenant or record ownership need the closest reading.
- Shared libraries: Common authentication or logging packages are reviewed once for their guarantees, then checked where each service depends on them.
- Generated code: Client and server stubs produced from OpenAPI or protobuf definitions are checked for the schemas they enforce.
- Language mix: Polyglot services need reviewers for each language, so confirm which languages each service uses.
Ask the client to provide a service inventory with ownership and external exposure, so the review covers the paths that actually reach the internet.
A mobile app combined with a backend splits security decisions between code running on a device the user controls and services the organization controls. The review must assume the client can be inspected and modified, so any check that exists only in the app is treated as a convenience rather than a control. Access needed includes both the mobile project and the backend repository, plus the build settings that determine how the app stores keys and communicates with servers.
- Trust boundary: The device is untrusted, so reviewers focus on what the backend enforces and what the client is trusted to hold.
- Manual attention: Local storage of tokens, certificate pinning decisions, deep link handling and the backend endpoints the app calls need careful reading.
- Shared libraries: Third-party SDKs in the app are reviewed for the data they collect and the permissions they request.
- Generated code: Code produced by cross-platform toolchains is checked for the platform APIs it wraps.
- Platform skill: Reviewers need knowledge of the mobile platform and language in use, so confirm which platforms and frameworks are in scope.
Confirm whether the mobile testing pillar or a combined engagement covers the device side, so no layer is left without an owner.
When the organization builds software that customers or internal teams install into their own infrastructure, the review must account for configuration the vendor does not control. Defaults, secret generation, update mechanisms and integration points with the customer's identity and storage systems become part of the code under review. Access needed includes the installer, default configuration files, upgrade scripts and the documentation that tells operators what to change.
- Trust boundary: The boundary often sits at the install and upgrade path, where code runs with elevated privileges on infrastructure the vendor does not operate.
- Manual attention: Default credentials, hard-coded keys, insecure fallback modes and update verification need close reading.
- Shared libraries: Bundled dependencies are reviewed for version and patch status, since operators may not update them.
- Generated code: Container images, Helm charts or generated configuration are checked for the values they set by default.
- Deployment variation: Confirm which deployment targets, operating systems and languages the customer environments use before scoping.
Check whether the reviewer can test with a representative default installation, since many findings only appear in the configuration operators receive.
What drives the cost of a secure code review
This table compares the factors that change the effort and price of a secure code review, with the reason each one matters and how to keep it proportionate. Read it as a checklist for scoping: each driver shows where the reviewer's hours go and where a buyer can narrow the work without losing coverage. The main takeaway is that a quote should be built from a written, itemized scope rather than from a headline figure.
| Driver | Why it matters | How to scope efficiently |
|---|---|---|
| Lines or volume of code in scope | Reviewer time grows with the code read, and generated or vendored code can inflate the count without adding risk. | Agree which repositories, branches and directories are in scope and exclude generated, vendored and test-only code in writing. |
| Number of languages and frameworks | Each language and framework needs reviewers who know its common flaws and its security features, which lengthens onboarding and review time. | List every language and framework up front and confirm whether one reviewer covers several or a specialist is needed for one component. |
| Components and trust boundaries | Every service, API, queue or identity boundary adds data flows the reviewer must trace to see where input is trusted. | Map the architecture before quoting and prioritize boundaries that handle identity, payments or regulated data. |
| Depth of manual review on authentication and authorization | Access control and session logic are rarely caught by tools, so they usually take the most reviewer time per line. | Name the specific authentication flows, roles and object-level permission checks to review rather than the whole identity layer. |
| Depth of manual review on cryptography | Reviewing key management, algorithm choice, randomness and certificate handling requires specialist knowledge and the ability to confirm how primitives are used. | Confirm which cryptographic functions are custom or configured by the team and exclude libraries used as documented. |
| Access and environment setup | Reviewers need repository read access, build instructions, and a way to run the application, and delays here are often billed as idle time. | Ask the client to provide read-only repository access, build notes and a test environment before the start date. |
| Developer walkthrough time | Architecture and design walkthroughs with the engineering team shorten review time but consume developer hours on both sides. | Schedule a bounded walkthrough with written questions and a named contact who can answer within the engagement. |
| Validation effort and reporting depth | Confirming that each suspected issue is real and reproducible takes time, and the report format determines how much write-up each finding needs. | Agree the severity model, the level of detail per finding and whether proof of concept for each issue is required. |
| Retest and recurring work | A retest re-reviews fixed code, and a retained or continuous review adds recurring effort for each release cycle. | Separate the initial review from any retest, define what a retest covers and state whether retention applies to releases or to time. |
Which frameworks expect source code review and what they expect
Does ISO 27001:2022 require secure code review?
ISO/IEC 27001:2022 does not name code review as a mandatory activity, but two Annex A controls cover the ground. Control A.8.28, Secure coding, asks the organization to apply secure coding principles to its software. Control A.8.29, Security testing in development and acceptance, asks for security testing processes to be defined and carried out during development. Auditors typically look for a documented secure coding standard, defined review or testing steps in the development life cycle, records showing that findings were tracked to closure, and evidence that the process runs for real releases. A code review engagement can supply the test records and findings register, while your own team keeps the standard and the process running. The control wording is in ISO/IEC 27002:2022, which gives implementation guidance. Confirm the exact expectations with your certification body.
Does DORA require source code reviews for financial entities?
DORA Article 25(1) lists source code reviews among the appropriate tests in a digital operational resilience testing programme, but only where feasible. The same list includes vulnerability assessments, open source analyses and penetration testing. Supervisors and auditors generally expect a financial entity to justify its test mix, so the testing programme should record which tests were chosen for which systems, why, and what was excluded and why. For code reviews, evidence usually includes the defined scope of the ICT systems covered, the reviewer's method, the findings with severity and status, and proof that critical issues were fixed and retested. Read the article in the Regulation (EU) 2022/2554 text on EUR-Lex and confirm with your competent authority how it applies to your entity and your ICT third-party arrangements.
Does CMMC Level 2 require source code scanning for custom software?
The CMMC Assessment Guide for Level 2 says that custom-developed software may need penetration testing or source code scanning when assessors examine vulnerability scanning requirement 3.11.2. The word "may" matters: the assessment depends on what systems are in scope, how they are built, and what the organization can show. Assessors typically look for a defined scanning or testing process, the tools or methods used, the scope of applications covered, dated results, and records of remediation. Where custom applications process controlled unclassified information, expect questions about who reviewed the code and how findings were tracked. Requirement text and assessment objectives are described in NIST SP 800-171A. Confirm with your C3PAO or sponsoring agency which applications they expect to see tested.
What does OWASP ASVS 5.0.0 expect for code review access?
OWASP ASVS 5.0.0 notes that verifying many Level 2 and Level 3 requirements needs more than black box testing. Assessors may need documentation, source code, configuration and access to the development team. For a Level 2 or Level 3 verification, plan to provide architecture and design documents, the relevant repositories with read access, build and configuration files, and named developers who can explain authentication flows, authorization decisions and cryptographic choices. The reviewer then checks each requirement against the code and the evidence, and records where a requirement is met, not met or not applicable. Without source access, some requirements cannot be verified at all, so the verification report should say so. The standard is available in the ASVS 5.0.0 source on GitHub. Agree the access model in writing before testing starts.
What evidence do auditors want from a code review?
Auditors want to see that a review happened, what it covered, what it found, and what was done about it. Across the frameworks above, the common evidence set includes:
- A written scope listing applications, repositories, branches and the release version reviewed
- The method used, including manual review, tool-assisted analysis and the rules or standard applied
- A findings register with severity, affected file or component, status and owner
- Retest results showing that fixes were verified
- Records that the review was repeated on a defined basis or after significant change
DeployOpen prepares systems, controls and evidence for compliance assessments, and can structure review records to match what your assessor asks for. Auditors and certification bodies issue the conclusions on whether a control is effective. Ask your assessor early which evidence format they accept.
Can a penetration test replace a secure code review for these frameworks?
Usually not on its own. A penetration test exercises the running application from outside, so it cannot confirm that authorization checks, cryptographic choices or input handling are correct across every code path. Frameworks that refer to source code review, including DORA and ASVS Level 2 and Level 3, expect access to the code or the team that wrote it. A penetration test and a code review answer different questions, and many programmes run both. Confirm with each assessor whether they accept a penetration test for a given requirement, and document the reason for the test mix in your testing programme.
Who is responsible for proving compliance after a code review?
The organization being assessed remains responsible for compliance. The code review provider delivers testing, findings and records under a written scope. An independent auditor, assessor or certification body decides whether the framework's requirements are met. DeployOpen prepares systems, controls and evidence for compliance assessments, and runs security testing, but it does not issue audit reports, attestations or certifications. Your team should own the secure coding standard, the remediation workflow and the decision about accepted risk. Clarify these responsibilities in the statement of work so that each party knows which evidence it produces and who signs off.
How should I confirm which framework applies to my code review?
Start with the obligation, not the framework name. Identify which regulator, customer contract, certification or scheme requires the testing, and ask that party which systems and test types they expect. For a regulated financial entity, the question goes to the supervisor or the entity's compliance function. For a US defense contractor, it goes to the C3PAO or sponsoring agency. For a certification, it goes to the certification body. Write down the answers, including which applications are in scope and which evidence is required. Those answers drive the review scope, the access you need to provide and the timing of each report, so settle them before choosing a provider.
What the secure code review report contains and how it serves your auditor or customer
A secure code review report is written to be read by engineers, security leads and the people who decide whether to accept the work. Each part below answers a question an auditor or customer is likely to ask, and together they show what was examined, how, what was found and what remains open.
Executive summary
A short, non-technical summary of the review's purpose, the application and version examined, the overall risk picture and the number of findings by severity. Decision-makers who will never open the technical section use it to decide whether the outcome matches their risk appetite. Check that it states the review period and the commit or release reviewed, so the summary cannot be read as applying to code that changed later.
Scope and method statement
This section records which repositories, services, modules and languages were in scope, what access the reviewers had (source, documentation, configuration, the development team), and which methods were used, including manual review and any tool-assisted analysis. It is the section an auditor compares against the agreed scope. Confirm that exclusions are listed with reasons, because a review that silently omits a service will be read as complete.
Finding list with severity and locations
Each finding carries a title, a severity rating, the weakness category, and the affected files, functions or lines. Authentication, authorization, input handling and cryptography findings are grouped so patterns are visible, for example one missing authorization check repeated across several endpoints. Ask how severity is calculated and whether the rating reflects exploitability in your environment, not only the raw code pattern.
Technical explanation without reproduction steps
For each finding, the report explains the weakness in engineering terms: what the code assumes, why that assumption fails, and what class of impact follows. It deliberately omits exploit payloads and step-by-step abuse paths, so the document can be circulated to a wider audience without becoming an attack guide. Ask for the report to be classified and stored under your own handling rules.
Recommended remediation
Each finding includes a remediation direction specific to the code path, such as where a check should sit, which library function or configuration key to adopt, and how to test the fix. Recommendations favour fixing the root pattern over patching a single instance. Ask whether remediation advice is aligned with your framework's own security guidance, so developers can apply it without re-architecting the module.
Retest results and limitations
Retest results record the status of each finding, such as fixed, partially fixed, not fixed or accepted risk, with the commit that was checked. The limitations statement sets out what the review did not cover, such as code paths not reachable in the agreed build, runtime behaviour, or third-party code that was not reviewed. A letter confirming the work was performed can be issued if this is agreed in scope. That letter confirms the work took place. It is not a certification, and the acceptance decision stays with your auditor or customer.
How to prepare repositories, access and developer time
Before a secure code review starts, the client needs to give the reviewer read-only access to the repositories and branches in scope, and to agree in writing which branches, services and modules are included. Reviewers work from a fixed commit or tag so that findings map to code that will still exist when the report is read. Provide the architecture diagrams and data flow notes that show where authentication decisions, authorization checks, input parsing and cryptographic operations sit, along with dependency manifests such as lock files and build instructions that let the reviewer reproduce the application's build. Name one developer contact who can answer questions about intent, session handling, role models and why a given control is implemented the way it is, and book short walkthrough sessions with that person at the start and midway through the review. Confirm the review windows with the development team so that a code freeze, release train or hotfix period does not interrupt validation work or change the code under review mid-assessment.
If the review needs dynamic validation, for example to confirm that an authorization gap is reachable, agree on access to a non-production environment that mirrors the production configuration, with test accounts for each role and seeded data that contains no real personal or payment information. Ask the reviewer to state exactly what they will run against that environment and when, so the operations team can monitor it. Confirm whether the environment is covered by the client's own change and logging controls, and who approves actions that could change state.
Decide in advance how secrets found in code will be handled. Reviewers who encounter hard-coded credentials, private keys or tokens should report them through a private channel, not in tickets or chat threads that many people can read, and the client should decide whether those values are rotated immediately, which the reviewer should not do. Agree on the severity threshold that triggers an out-of-band notice, and on how the reviewer redacts the secret in the written report. Ask the reviewer to confirm how they store any sensitive material during the engagement and when it is destroyed.
What to check when choosing a secure code review provider
A code review is only as useful as the people doing it and the terms under which they see your source. The cards below cover the checks that separate a credible provider from one that sells a scanner report with a review label. Each one can be verified in writing before you sign.
Reviewers with hands-on framework experience
Ask which languages and frameworks the reviewers have worked in on production code, not only in training. For a secure code review, a reviewer who knows how your framework handles sessions, role checks and request binding will find authorization flaws that a generic tool misses. Ask for the reviewer's experience with each framework in your stack, and whether that experience includes reviewing code for these categories, not only writing it.
Written scope and method statement
Require a document that lists the repositories, branches, commit range, components and languages in scope, plus the method for each. It should state which parts are manual review, which are tool-assisted, and which control areas, such as authentication, authorization, input handling and cryptography, are covered. Vague wording such as full application security review with no file list is a warning sign. The statement should also name what is excluded, so you know what remains untested.
Sample findings and their format
Ask for a redacted sample report before you commit. Check that each finding names the affected file and line, explains the weakness category in plain language, traces the data or control flow involved, and recommends a specific fix your developers can apply. Findings without location detail or severity reasoning are hard to act on. A sample also shows whether the provider separates confirmed issues from items that need your team's input.
False positive validation
Ask how the provider confirms that a suspected issue is real before it reaches your report. A credible process reads the surrounding code, checks whether a control elsewhere already mitigates the issue, and records the reasoning for each dismissed item. Ask whether dismissed items are listed in an appendix, so your team can see what was ruled out. A report full of unverified tool output shifts triage work onto your engineers.
Source code handling and confidentiality
Source code is sensitive, and reviewers often need read access to private repositories. Confirm where code is accessed and stored, whether copies are made, who can see it, how long it is retained and how it is deleted at the end of the engagement. Ask whether reviewers work on your systems, in a controlled environment, or on their own devices, and get the answer in the contract. Confidentiality terms should cover the code, the findings and any secrets found during review.
Retest pricing and timing
Findings are only closed when a retest confirms the fix. Ask whether one retest round is included in the quote, how the provider prices further rounds, and how long after a fix a retest can be scheduled. Clarify whether the retest covers only the reported items or a fresh review of changed code. Get these terms in writing, because retest cost and timing often decide whether a finding is closed before an audit or release date.
Fit with your development tooling
Ask whether the provider can work with your repository host, issue tracker, code scanning results and CI pipeline, instead of asking your team to change its workflow. Findings that arrive as tickets in your existing tracker, with the same severity and labels your team uses, are easier to fix and to track. Confirm which tools the provider will run on your code and whether it will supply the configuration for them, so you can rerun the same checks later.
Shareable references and a named lead
Ask for references you can contact, and for the name of the lead reviewer who will own the engagement and the findings. Shareable references should describe the type of work, not only the client name, and you should be able to check them directly. Confirm that the named lead will sign the report and take part in the readout, so the person who reviewed your code is the person answering questions about it.
Questions buyers ask before commissioning a secure code review
What drives the cost of a secure code review, and can you quote it before scoping?
Cost depends mainly on how much code is in scope, how many languages and frameworks it uses, how much of the authentication, authorization, input handling and cryptography logic must be read by hand, and how many review rounds the findings require. DeployOpen does not publish a price list, so a quote follows from a written scope. Before scoping, you can gather the approximate repository count, lines of code per repository, languages, framework versions, and whether a threat model or architecture document exists. Ask any provider for a quote that lists the review units, the people and hours by role, the tools used, the retest allowance and what is excluded. Most of the cost is one-time for the review itself. Retesting and any follow-on retainer for continuous code review recur, and you should confirm how each is priced.
How long does a secure code review take, and what sets the timeline?
The timeline is set by the size of the agreed scope, the complexity of the security-relevant code, how quickly your developers answer questions, and how many fix and retest cycles are planned. Engagements are fixed-scope, so scope, deliverables and dates are agreed in writing before work starts. Ask for a schedule that separates access setup, the review itself, the draft findings walkthrough, the final report and the retest window. Delays most often come from missing build instructions, unavailable architecture documents, or a late decision on which modules are in scope. If a compliance deadline applies, state it at scoping so the start date and the report date can be checked against it.
What does the review need from our developers?
A secure code review needs read access to the relevant repositories, a branch or tag that matches the version in production, and a named technical contact who can answer design questions quickly. The reviewer also needs working build and test instructions, configuration files with secrets removed, architecture diagrams, data flow notes, and a list of trust boundaries such as identity providers, payment services and third-party APIs. Plan roughly a short kickoff session and then regular question windows during the review. Developers should expect to explain intended behavior for authorization rules and cryptographic choices, because these are often the hardest to judge from code alone. Confirm what access method, logging and data handling rules apply to source code in your environment before the review begins.
Can our own team run this review with scanners instead?
Your team can run static analysis and software composition tools, and these catch a useful class of known patterns, such as unsafe function calls, hardcoded secrets and vulnerable dependency versions. They do not reliably judge whether an authorization check is applied to every route, whether a business rule can be abused across steps, or whether a cryptographic design fits the threat model. Those judgments need a reviewer who reads the code in context. A practical split is to run scanners continuously in your pipeline, then commission a manual review for the highest-risk modules and compare its findings with scanner output. Ask any provider how it treats scanner results, including false positives and whether it reproduces each issue before reporting it.
How does a secure code review differ from a penetration test, and do we need both?
A secure code review examines the source to find the cause of weaknesses, including logic errors that never appear in normal traffic. A penetration test examines the running system from outside or from a defined position to show what an attacker could reach and chain together. The two answer different questions, so they complement each other. Code review is strongest for authorization logic, input handling and cryptographic use, while penetration testing confirms how those weaknesses behave in deployed configuration and infrastructure. Many organizations commission both for a major release or a high-risk application, and sequence the code review first so the penetration test focuses on the live system. Your choice depends on the application, the threat model and what your customers or regulators expect.
Does a secure code review satisfy DORA, CMMC or ISO/IEC 27001 on its own?
No single review satisfies a framework by itself. DORA Article 25(1) lists source code reviews where feasible among the appropriate tests in a digital operational resilience testing programme, alongside vulnerability assessments, open source analyses and penetration testing (Regulation (EU) 2022/2554). The CMMC Assessment Guide Level 2 says custom-developed software may need penetration testing or source code scanning when assessing requirement 3.11.2. ISO/IEC 27001:2022 control A.8.29 expects security testing defined within the development life cycle, and A.8.28 covers secure coding. DeployOpen prepares systems, controls and evidence for these assessments but does not issue audit reports or certifications. Confirm with your assessor which tests and evidence they expect, and whether they accept a code review as one of several tests.
What happens after the findings are fixed?
After the report, your developers fix findings in the codebase, and the provider verifies each fix through a retest against the original finding. Confirm in writing how many retest rounds the scope includes, how the retest is documented, and how findings that are accepted as risk or disputed are recorded. A useful report gives each finding a location in the code, the affected trust boundary, the reason it matters, a reproduction or reasoning trail, and a recommended fix. Ask whether the output maps to recognized references such as OWASP ASVS requirements, so your auditor can trace fixes to controls. For ongoing assurance, a retainer can cover periodic review of changed modules, but it is a separate agreement from the original review.
How DeployOpen scopes, reviews, reports and retests
DeployOpen approaches secure code review as a fixed-scope engagement, with scope, deliverables and timelines agreed in writing before any source code is accessed. The review is run inside the client's own environment and results are handed over as documented findings the client's team can act on and retest.
How we scope
- Agree in writing which repositories, branches, services and languages the review covers
- Confirm read-only access paths, the developer contact and the environments reviewers may use
- Set focus areas such as authentication, authorization, input handling and cryptography
- Record which findings are in scope for retest and which requirements the review should map to
How we build
- Combine tool-assisted static analysis with manual reading of security-critical code paths
- Trace trust boundaries, identity checks and permission decisions through the application logic
- Review cryptographic use, key handling and configuration files for weak or outdated patterns
- Validate each automated result manually to remove false positives before it reaches the report
How we hand over
- Deliver a written report with severity, affected file and line references, and reproduction context
- Provide a remediation recommendation for each finding, written for the developers who fix it
- Map findings to the control areas the client's auditor or customer questionnaire asks about
- Walk through the results with engineering and leadership so priorities are clear
How we support
- Retest agreed findings after fixes are merged and document the status of each one
- Offer ongoing support and continuous testing as a retainer if the codebase changes frequently
- Confirm with your team how retest windows, access renewals and report formats will be handled
- Coordinate with penetration testing and pipeline reviews so overlapping findings are not duplicated

