PR.PS-06 Secure software development

PR.PS-06 asks organizations to build secure development practices into the software development life cycle and to monitor how well they work. This page explains what assessors test, which evidence passes and what meeting it costs.

On this page

What PR.PS-06 secure software development requires

If your organization builds software, NIST CSF 2.0 Subcategory PR.PS-06 asks you to show that secure software development practices are built into the software development life cycle and that their performance is monitored. In plain terms, the requirement is not satisfied by a policy that says developers should write secure code. It is satisfied when practices exist at each stage of building, testing, releasing and retiring your software, and when someone checks whether they work. The paraphrased outcome sits in the PROTECT Function under the Platform Security (PR.PS) Category. Under the CSF 1.1 to 2.0 transition, PR.PS-06 absorbs part or all of CSF 1.1 PR.IP-2, so organizations that already mapped to the older Subcategory should review that legacy mapping rather than assume it carried over unchanged.

NIST publishes three Implementation Examples for PR.PS-06. The first covers protecting all components of organization-developed software from tampering and unauthorized access, which points to controls such as restricted push and merge rights on protected branches, signed or verified build artifacts and limited access to build systems. The second covers releasing software with minimal vulnerabilities, which implies scanning code and dependencies before release and recording what was found and fixed. The third covers maintaining production software and disposing of it securely when it is no longer needed. Ask your engineering leads to name the owner and the evidence for each of these three examples. Any gap in that answer is a finding an assessor will likely raise.

This requirement is hard because development teams often have written standards that nobody enforces or measures. A secure coding guideline on a wiki does not show that a merge was reviewed, that a scan ran on a release or that a retired service was decommissioned. Start by checking which practices produce records automatically, such as pipeline logs, review approvals and scan reports, and which depend on individual memory. NIST does not certify products, services or implementations, and it has no conformity assessment program for CSF. If you need a formal attestation for a customer, contract or regulator, an independent assessor or certification body must perform it. DeployOpen can help prepare systems and evidence, but it does not issue reports or certificates.

Which repositories, pipelines and teams fall under PR.PS-06

Scope decides how much of PR.PS-06 your organization must run itself and how much it can hold suppliers to. The cards below cover the software, pipelines and people that usually need a decision before anyone writes a secure development procedure. Settle these boundaries in writing first, because assessors will test whatever scope you declare.

Organization-developed application code

This is the core of PR.PS-06: source code your teams write and ship, including services, libraries and internal APIs. Record every repository that produces a deployable artifact, not only the flagship products. Check for forks, archived projects that still run in production, and personal repositories used for production scripts. Each one needs the same protections on branches, reviews and scanning as the main codebase, or the scope has a gap an assessor can find.

Infrastructure as code

Terraform, Helm charts, Ansible playbooks and pipeline definitions change how production behaves, so they belong in scope even though many teams treat them as operations files. Confirm that changes to these files pass through the same review and tamper controls as application code. Semgrep supports Terraform, so infrastructure definitions can be scanned in the same pipeline as application code. Name the owners of each repository in the scope record.

Build and release pipelines

Every pipeline that compiles, packages, signs or deploys organization-developed software is in scope, including CI runners, artifact registries and deployment jobs. Document which pipelines promote code to production and which only build test artifacts. Pipeline configuration is itself code that can be altered, so limit who can edit it and log those changes. An unlisted pipeline that can push to production is a common reason a scope statement fails review.

Customized vendor and open-source code

When you modify a vendor product or an open-source project, the modified portion becomes organization-developed software and falls under PR.PS-06. Keep a record of each patch, fork and plugin you maintain, separate from the upstream project. Upstream code you merely deploy without change is generally handled through supplier and component assessment instead. Confirm that boundary with your assessor before you rely on it, because the line between configuration and customization is a judgment call.

Contractors and third-party developers

Outside developers who commit code to your repositories or run your pipelines act inside your secure development process, even if a supplier employs them. Decide which contracted teams have write access, which only submit merge requests, and which have no repository access at all. Their obligations belong in contracts and access reviews. Assessors will ask who approved each external account and when its access was last reviewed.

Purchased software and supplier obligations

Commercial software you buy without modification is usually out of PR.PS-06 scope for development practices and handled through supplier requirements. Your obligations shift to asking how the supplier develops and tests its product, reviewing its security documentation and tracking its vulnerability disclosures. The NIST CSF 2.0 Reference Tool links PR.PS-06 to SP 800-53 SA controls and ISO/IEC 27001 Annex A controls 8.25 to 8.31. Use these as cross-checks on scope, and confirm each mapping with the standard's owner rather than treating it as equivalence.

How an assessor tests secure software development

The assessor starts by reading the secure software development policy, the coding and review standards, the release procedure and the list of tools that gate builds. The question at this stage is whether the organization has defined what secure development means for its own products, who owns each practice, and how performance is measured. Assessors look for named owners, defined review and testing expectations, and a stated process for handling vulnerabilities found before release. They also check the document dates and version history, because a policy that predates the current pipeline often describes controls that no longer exist.

  • Defined scope: the policy names which repositories, languages and products it covers, including infrastructure as code.
  • Named owners: each practice, such as code review, scanning and release approval, has an accountable role.
  • Measurable expectations: the standard states what must pass before a release, such as scan results or approvals.
  • Monitoring commitments: the document says how secure development performance is reviewed and reported.
  • Common finding: the policy requires a control, such as mandatory peer review or dependency scanning, that the pipeline does not enforce.

Before the interviews, check that every control the document promises has a named owner and a place where its output is recorded.

How to implement PR.PS-06 step by step

This sequence turns PR.PS-06 from a statement of intent into a working development process, where each step produces a document, a configuration or a record that shows secure development practices are built in and watched over time.

  1. Define the secure development standard

    Engineering leadership and security jointly write a short secure development standard that covers the languages, frameworks and pipelines the organization actually uses. It should name required practices for code review, dependency handling, secrets, static analysis, release approval and production maintenance, and state who owns each one. Confirm the scope with the teams that build and run the software, since a standard that ignores a language in use will not be followed. The output is an approved, versioned standard with named owners, and the step is done when every product team has acknowledged it.

  2. Enforce protected branches and mandatory review

    Platform engineers configure protected branches in the source control system so that only defined roles can push or merge to production branches. Direct pushes are blocked for most roles, and force pushes stay disabled unless explicitly approved. GitLab Community Edition supports these controls through its protected branch settings, so the team can apply them to each repository and branch pattern. The output is a configuration export or screenshot for each protected repository, and the step is done when a test push to a protected branch is rejected for a non-privileged account.

  3. Add static analysis to the CI/CD pipeline

    Engineers add a static analysis job to the build pipeline that runs on every merge request and on the default branch. Semgrep Community Edition supports a wide language set, including Java, JavaScript, TypeScript, Python, Go and Terraform, and can run community rules plus rules the organization writes for its own patterns. The team should decide which findings block a merge and which are reported for triage. The output is a pipeline definition and a baseline scan report for each repository, and the step is done when the baseline is recorded and a seeded test finding fails the job.

  4. Generate and track SBOMs and dependency vulnerabilities

    The pipeline generates a software bill of materials for each build, using a tool such as Trivy to list OS packages and software dependencies. The SBOM is uploaded to OWASP Dependency-Track, which consumes CycloneDX SBOMs and VEX, flags known vulnerabilities, outdated or modified components and license risk, and tracks licenses by SPDX identifier. Security staff review new high-severity findings and record a decision on each. The output is a stored SBOM per release and a triage log, and the step is done when a release's components are visible in the portfolio view with an assigned owner for each open finding.

  5. Define release criteria for known vulnerabilities

    The security lead and product owners agree release gate criteria that state which known vulnerabilities block a release, which may ship with a documented exception, and who approves an exception. The criteria should reference the scan and SBOM outputs from earlier steps so that the decision can be checked later. This is where the organization decides what "minimal known vulnerabilities" means for its products. The output is a written release gate policy and a template for exception records, and the step is done when a release candidate is evaluated against the gate and the decision is stored with its evidence.

  6. Set up secure maintenance and disposal of production software

    Operations and development teams define how production software is kept current and how it is retired. This covers the process for applying patches, the criteria for replacing container instances, the review of end-of-life components, and the steps for decommissioning an application, including removal of data, credentials and pipeline access. Links to the related sibling topics on software maintenance and configuration management help keep these processes consistent. The output is a maintenance and decommissioning runbook, and the step is done when at least one retirement has been carried out and documented against that runbook.

  7. Measure performance with recurring reports

    The security lead reviews a short recurring report that covers the metrics the program has chosen, such as how many merges passed the gate, how many scan findings were triaged, how many open vulnerabilities exceed the release criteria, and how many exceptions were approved. Leadership uses the report to adjust the standard, the rules or the release criteria. Confirm the metric definitions with the teams first so that the numbers mean the same thing across products. The output is a dated metrics review record with recorded actions, and the step is done when a review has produced at least one documented change to the program.

Evidence that satisfies PR.PS-06 and how to keep it current

PR.PS-06 asks whether secure development practices are built into the software life cycle and whether their performance is monitored. The cards below list the artifacts that show this, from the written standard to leadership metrics, and how to refresh each one between assessments so the evidence reflects current practice rather than a single snapshot.

Written secure development standard

A dated, approved document that states which secure development practices apply to organization-developed software, who owns them and how exceptions are granted. Assessors compare it with what teams actually do, so check that the standard names the tools in use, such as branch protection, static analysis and SBOM generation. Review it at least once a year and record each approval with its version and date.

Protected branch and review settings

Exports of branch protection settings show who can push or merge to production branches, whether direct pushes are blocked and whether force pushes are disabled. In GitLab, protected branches let maintainers restrict push and merge roles and block direct pushes by setting push access to no one. Export these settings on a schedule and keep the dated files, because a setting changed after an audit window can be hard to prove.

Static analysis reports and triage records

Scan reports from each pipeline run show what was checked and what was found. Assessors also want the triage record: who reviewed each finding, whether it was fixed, accepted with a reason or marked as a false positive. Semgrep Community Edition can run in CI/CD and scan repositories continuously, so confirm which languages in your estate it covers before relying on it as the sole scanner.

SBOMs generated for each release

A software bill of materials for every released version lists the components it contains, in a machine-readable format such as CycloneDX. Keep one per release, linked to the build identifier, so you can show what shipped at any point in the assessment period. Trivy can produce SBOMs from a target and scan existing ones, which helps confirm that the file matches the deployed artifact.

Vulnerability and license tracking records

Records from a component tracker show which known vulnerabilities, outdated or modified components and license risks were found, and what happened to each one. OWASP Dependency-Track consumes and produces CycloneDX SBOMs and VEX and tracks license use by SPDX identifier. Export its findings and decisions monthly so the history shows time to remediate, not only the current backlog.

Release gate approvals and decommissioning records

Each production release should have a recorded gate decision that names the approver, the checks passed and any accepted risk. When software is retired, keep a decommissioning record that shows removal from production, data disposal and revoked credentials, as PR.PS-06 expects production software to be maintained and disposed of securely. Retain pipeline logs for the full assessment period so approvals can be traced to the commits they cover.

What meeting PR.PS-06 costs in money and effort

This table lists each cost component of meeting PR.PS-06, who is paid for it, whether it is one-time or recurring, and what moves it up or down. Use it to build a quote request. The main takeaway is that open-source scanners remove license spend, but engineering, triage and evidence work remain the larger and recurring costs.

Cost componentOne-time or recurring, and who paysWhat drives it up or downWhat to ask for in a quote
Defining the secure development standard and configuring pipelinesOne-time. Internal engineering time, plus any partner time for scoped setupNumber of repositories and languages, branch model, existing CI/CD maturity, and how many teams must adopt the standardItemized list of pipelines to configure, branch protection settings to apply, and the documented standard the partner will deliver
Scanner and SBOM toolingOpen-source licenses carry no license fee. Hosting, compute and staff time to operate remainScan frequency, repository count, size of build artifacts, and whether scanners run on shared or dedicated runnersConfirmation of the self-hosted architecture, hosting assumptions, and who maintains rule sets and tool versions
Ongoing triage of scanner and dependency findingsRecurring. Internal developers and security staff, or a retainer if outsourcedVolume of findings, false positive rate in your code, vulnerability disclosure volume for your dependencies, and clear severity thresholdsExpected triage workflow, who approves exceptions, and the service levels the partner commits to in writing, if any
Evidence upkeep for PR.PS-06Recurring. Internal compliance or engineering staff, with partner support if contractedNumber of applications in scope, frequency of releases, and how automatically logs and reports are keptWhich records are produced for each release, retention period, and where evidence is stored and reviewed
External penetration testing or code reviewVariable and quoted separately. Paid to the testing providerApplication count, codebase size, architecture complexity, and whether the test covers pre-release or production buildsWritten scope, methodology, deliverables, retest terms, and whether findings feed back into the pipeline controls
Auditor sampling effortPer assessment. Internal staff time to produce samples, plus auditor feesNumber of releases sampled, how easily pipeline records can be retrieved, and whether the auditor reviews evidence once or repeatedlyAuditor's sampling approach and the evidence list they will request before fieldwork begins

Who owns PR.PS-06 and what can be outsourced

Your organization owns PR.PS-06. NIST CSF 2.0 describes an outcome, not a tool, so the decisions about how secure development is practiced, what counts as acceptable risk and when a release may ship stay with your leadership and engineering managers. No partner or auditor can make those decisions for you, and an assessor will ask who made them and whether the decision was recorded.

  • Standard and policy: Define the secure development practices your teams must follow across the software development life cycle, and assign an owner who reviews them.
  • Pipeline decisions: Decide which checks gate a merge or release, such as code scanning, dependency review and SBOM generation, and who may override a failed gate.
  • Risk acceptance: Record who accepts residual vulnerabilities, for how long and under what compensating controls.
  • Release approvals: Name the roles that approve production releases and keep the approval trail where an assessor can sample it.
  • Performance monitoring: Decide which metrics you track, such as open findings by severity, and how often leadership reviews them.

Before engaging any outside party, confirm that these owners exist by name and that the decisions above are written down.

Questions teams ask about PR.PS-06

How long does it take to implement PR.PS-06?

The duration depends mostly on how many repositories, pipelines and release paths the organization runs and how much of its secure development practice already exists. A team with a single product, a protected main branch and a CI pipeline that already runs tests has far less to do than one with dozens of services, undocumented release steps and no record of who approved production changes. The main drivers are the number of in-scope code bases, the maturity of the existing review and release process, whether vendor or contractor code is involved, and how much evidence must be produced for an assessor. Ask any implementation partner for a written scope that lists the repositories, pipelines and deliverables before agreeing to a timeline, because a fixed scope is the only reliable basis for a schedule.

Can a small team implement PR.PS-06 in-house?

Often yes, if the team has at least one person who can own the secure development process and the tooling runs inside the existing development workflow. The core work is practical: protect the main branches so changes go through review, run static analysis and dependency checks in CI, generate a software bill of materials for each release, and write down how the team decides what ships. Small teams usually struggle less with tools than with consistency, such as keeping review rules enforced when a deadline is near and deciding who triages scanner findings. An outside partner can help with setup and documentation, but the organization still owns its controls and must run them day to day.

What does PR.PS-06 require from developers and security staff?

Developers carry most of the day-to-day work, and security staff set the rules and check that they are followed. Developers need to follow the branch and review process, fix findings from code and dependency scans, and keep their dependencies current. Security staff need to define which checks block a merge and which only report, decide how exceptions are approved and recorded, and review trends so the program improves over time. The subcategory also asks that secure development performance be monitored, so someone must own the metrics, such as how many findings are open past their agreed window. Name these owners in writing before the work starts, since unowned findings are the most common reason the evidence looks weak.

Does NIST CSF 2.0 require a certification for PR.PS-06?

No. NIST does not certify organizations, products or services against the Cybersecurity Framework and has no plans to create a conformity assessment program. Alignment with PR.PS-06 is shown by the organization's own documented practices and evidence, which an independent assessor may review if the organization or a customer asks for it. Some customers and contracts may still require a specific third-party report or certificate, so confirm with the requesting party which format they accept. Any firm that offers a CSF certification should be questioned closely on what it actually issues and who recognizes it.

What does an assessor ask for first on PR.PS-06?

An assessor usually starts by asking how secure development is defined and where it is written down, then asks to see it working on real repositories. Expect requests for the written development and release procedure, a list of in-scope repositories, branch protection settings, a sample of recent merge requests showing review approvals, CI pipeline logs from the static analysis and dependency checks, and recent SBOMs tied to released versions. They will also look for records of how findings were triaged, how exceptions were approved, and how the team reviews these results over time. Assemble these artifacts before the assessment rather than during it, and confirm the exact evidence list with the independent assessor.

Is an SBOM or static analysis mandatory for PR.PS-06?

NIST CSF 2.0 is outcome-based and does not name specific tools, so neither an SBOM nor static analysis is literally mandatory under the framework. The outcome asks that secure development practices are built into the life cycle and monitored, and both tools are common ways to meet it. The informative references point to ISO/IEC 27001:2022 Annex A controls and NIST SP 800-53 system and services acquisition controls, which address secure development and component tracking in general terms. Whether a specific tool is required in practice depends on the framework or customer contract that applies, so confirm that requirement in writing with the party asking for alignment. Open-source options such as Semgrep for code scanning, Trivy for SBOM generation and OWASP Dependency-Track for tracking components are widely used, but the organization should choose tools based on its own stack and evidence needs.

Where secure software development programs usually fall short

The most common shortfall under PR.PS-06 is a secure development practice that exists in a policy document but is not enforced by the pipeline. A team may say that code is peer reviewed and that releases are scanned, yet nothing stops a maintainer from pushing straight to the main branch or a force push from rewriting history. To close this gap, configure the repository's protected branches so that the push access level for the main branch is set to no one, force pushes stay disabled, and merges require the review roles your policy names. In GitLab Community Edition, these are set in the protected branch settings, and the configuration itself should be exported or screenshotted as evidence. Assign a named owner for the settings, and review them whenever repository permissions change, because a setting that drifts silently produces no audit trail that anyone notices. A second gap appears when scanners run on every merge request but nobody owns the results. Semgrep Community Edition and Trivy can both run in CI/CD, and their output can fill a dashboard that no one reads. Findings then age without decisions, and an assessor asking how a flagged issue was handled finds no record. Close this by assigning a triage owner for each scanner, defining which severities block a merge and which are logged for review, and recording each suppression with a reason and an approver. Ask your team to confirm how long a triage decision is allowed to stay open before it is escalated. Those answers, not the scanner output itself, are what show the practice is performed. The third and fourth gaps concern what leaves the build. Many programs produce no software bill of materials for released artifacts, so when a dependency is later reported as vulnerable, the team cannot say which releases contain it. Generate a CycloneDX SBOM for each released artifact, using a tool such as Trivy, and load it into OWASP Dependency-Track, which can track known vulnerabilities, outdated components and license risk per release. Separately, many release decisions proceed without written vulnerability criteria. Define the thresholds in advance, such as which unresolved severities or known-exploited findings prevent a release, and record the exception process. Confirm with your security lead who may approve an exception and how it expires. The final gap is end of life: production software is often left running long after support ends, with no step for retiring it or disposing of its data. Add a decommissioning checklist to the release process that records when a version leaves support, who removes it, and how its data and credentials are destroyed.

Open-source tools that produce PR.PS-06 evidence

Four open-source tools can each leave evidence for PR.PS-06, but none of them proves the outcome by itself. GitLab Community Edition covers the protection of code and build inputs. Its protected branches let maintainers restrict which roles can push or merge to a branch, block direct pushes by setting push access to no one, and keep force pushes disabled unless someone explicitly allows them. Exporting branch protection settings and merge request approval history gives an assessor a dated record that changes to production-bound code went through review. The tool is licensed under MIT, which permits internal use and modification without a copyleft obligation on your own code. Confirm that Community Edition offers the protection settings your process depends on, since feature sets differ between editions.

Semgrep Community Edition, licensed under LGPL-2.1-only, scans source code for insecure patterns and can run inside CI/CD pipelines so every repository is checked on each change rather than sporadically. Its documented language list includes C/C++, C#, Go, Java, JavaScript, TypeScript, Python, Ruby, Rust, PHP, Kotlin, Swift and Terraform, and it supports custom rules. Before you rely on it, confirm that your languages and frameworks are covered by the community rules or that your team can write the custom rules needed. Keep the pipeline logs and the rule set under version control, because an assessor will ask which checks ran and which findings were triaged. The LGPL-2.1-only license has terms on distributing modified library code that your legal team should review if you change the tool itself.

OWASP Dependency-Track (Apache-2.0) and Trivy (Apache-2.0) cover the software supply chain side. Dependency-Track consumes and produces CycloneDX software bills of materials and VEX documents, flags components with known vulnerabilities, outdated or modified components and license risk, and tracks license use by SPDX identifier. Trivy identifies OS packages and software dependencies in a target, can generate them as an SBOM, and can scan existing SBOMs. Together they give a repeatable record of what shipped in each release and when its vulnerability status was reviewed. Ask your engineering lead to confirm which artifact types (container images, binaries, infrastructure code) must be inventoried, and to decide who triages Dependency-Track findings and within what internal timeframe. The Dependency-Track documentation is the natural next read for setting up that workflow.

Official sources to read before scoping PR.PS-06

Before you scope PR.PS-06, read the NIST text that defines the outcome, the machine-readable mapping that links it to other standards, and the transition record that shows what it inherited from CSF 1.1. The GitLab branch protection documentation shows one concrete way a platform can enforce part of the outcome.

CSF 2.0 Core in Appendix A

Appendix A of NIST CSWP 29 is the authoritative text for PR.PS-06 and its neighbors in the Platform Security Category. Read the Subcategory outcome as the test an assessor will apply, then compare it with your own Current Profile. Note that the outcome covers secure development practices across the whole software development life cycle and asks whether their performance is monitored. Your scope should state which internal and third-party software teams the outcome covers, since an assessor will ask how each one is included.

Reference Tool export for PR.PS-06

The Reference Tool export lists the Implementation Examples and informative references attached to PR.PS-06, including SP 800-53 Rev. 5.2.0 controls, ISO/IEC 27001:2022 Annex A controls, SP 800-171 Rev. 3 and CIS Safeguard 16.1. Use it to build an evidence map so one artifact can answer several frameworks. Confirm each mapping against the source framework before you rely on it in a customer or regulator response, because informative references are pointers, not equivalence claims.

CSF 1.1 to 2.0 transition spreadsheet

NIST's transition spreadsheet shows that PR.PS-06 absorbs part or all of CSF 1.1 PR.IP-2. If your existing assessment used PR.IP-2 for development lifecycle work, this record shows where that evidence now belongs. Check each prior answer against the new Subcategory text rather than carrying it forward, since the wording and scope differ. Record the transition decision in your assessment file so a reviewer can trace how a 1.1 answer became a 2.0 answer.

GitLab protected branches documentation

Protected branches are one way to enforce the controls that PR.PS-06 implies for code integrity. Maintainers can restrict which roles push or merge, block direct pushes by setting push access to no one, and keep force pushes disabled unless explicitly allowed. Confirm the settings your version of GitLab Community Edition supports, then test them on a non-production project. Record the branch protection configuration as evidence, and export it on a schedule so an assessor can see the state over time.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.