Skip to content
s1ns3nz0 | Known Unknowns
Go back

NIST SP 800-218(SSDF)

22 min read

Due to numerous successful attacks through the supply chain, the U.S.government issued an order establishing new requirements for secure software development. NIST had already been developing a secure software development framework by that time, and this order accelerated and enhanced that publication, with a specific focus on supply chain security

Table of contents

Open Table of contents

How to Integrate Security with your develope pipeline?

When an organization is asked to improve software security, one of the first actions it often takes is to introduce security tools such as SAST, DAST, and SCA. The organization then adds scanning stages to its CI/CD pipeline and configures the build to fail when high-severity vulnerabilities are detected.

These measures are certainly necessary, but they are not enough to establish a secure software development practice.

Vulnerable code is not produced repeatedly simply because an organization lacks security scanners. The underlying causes may include undefined security requirements, missing threat analysis during design, excessive permissions in development and build environments, unverified third-party package provenance, or a failure to incorporate lessons from recurring vulnerabilities into development standards.

NIST Special Publication 800-218, the Secure Software Development Framework, or SSDF, provides a framework for addressing these problems throughout the software development lifecycle.

SSDF does not require organizations to adopt a new development methodology. Instead, it provides a common set of practices that can be integrated into existing Agile, Scrum, DevOps, and CI/CD processes. It also helps organizations identify gaps in their current software development practices.

This article examines the four SSDF practice groups from the perspective of developers, DevSecOps engineers, application security engineers, and security architects. It also explains how these practices can be applied to real-world development and deployment pipelines.

SSDF Is Not a List of Security Tools

The first thing to understand about SSDF is that it is not a standard that mandates specific security products or implementation technologies.

For example, SSDF does not require organizations to use a particular static analysis tool, adopt a specific CI/CD platform, or deploy applications on Kubernetes.

Instead, it focuses on security outcomes such as the following:

Organizations may choose the technologies and procedures that best fit their environment to achieve these outcomes.

An organization using GitHub Actions may implement the practices differently from one using Jenkins. Similarly, the required controls may differ between a monolithic application and a microservices-based platform.

SSDF should therefore be used as a framework for identifying missing security activities rather than as a way to standardize every implementation detail.

The Four SSDF Practice Groups

SSDF v1.1 organizes secure software development practices into four groups:

These groups should not be treated as isolated, sequential phases. They form an interconnected operating model.

The PO group establishes organizational policies, responsibilities, and development environments. The PS group protects source code and build artifacts. The PW group covers secure design, implementation, and verification. Finally, the RV group feeds lessons from operational vulnerabilities back into the development process.

PO: Prepare the Organization

The PO group focuses on preparing the people, processes, and technologies required to develop secure software.

For a secure development program to operate effectively, every team must understand which security activities it is responsible for. If the organization depends entirely on individual developer experience or manual reviews by the security team, security quality will vary significantly across projects.

Define Security Requirements Before Writing Code

Security requirements should not be treated as items to inspect after development is complete. They should be defined alongside functional requirements.

For example, a functional requirement for an authentication feature might state:

Users must be able to sign in using their email address and password.

That requirement alone is insufficient. It should be accompanied by security requirements such as:

These requirements can be managed as security acceptance criteria within user stories or through a separate security requirements template.

Clearly Define Roles and Responsibilities

Secure software development is not solely the responsibility of the application security team.

Developers are responsible for secure implementation and vulnerability remediation. Platform teams are responsible for protecting CI/CD and build environments. Security teams establish standards, verification processes, and supporting policies. Product owners participate in risk acceptance and prioritization decisions.

A practical division of responsibilities may look like this:

RolePrimary Responsibilities
DeveloperImplement security requirements, perform code reviews, remediate vulnerabilities
Technical LeadReview security design, request exceptions, prioritize remediation
Application SecurityDefine standards, support threat modeling, manage tool policies, validate vulnerabilities
Platform or DevOps TeamProtect repositories, CI/CD systems, build environments, and deployment infrastructure
Product OwnerEvaluate business risk and prioritize security requirements
Operations TeamPerform monitoring, patching, deployment, and incident response

When responsibilities are unclear, teams may lose valuable time determining who owns remediation and who has the authority to approve risk exceptions.

Standardize Secure Development Environments

The development environment includes source code repositories, developer workstations, package repositories, CI/CD systems, build servers, and secret management systems.

At minimum, organizations should consider the following controls:

CI/CD systems often hold production credentials and deployment permissions. They should therefore be protected at a higher level than ordinary development servers.

PS: Protect the Software

The PS group focuses on protecting software from unauthorized access, modification, and disclosure.

In software supply chain attacks, threat actors may avoid attacking the application directly. Instead, they may compromise developer accounts or build pipelines and insert malicious code into otherwise legitimate release artifacts.

Organizations must therefore protect not only source code but also the build process and the integrity of released artifacts.

Minimize Repository Access

Not every developer needs write access to every repository. Read, write, and administrative privileges should be assigned according to project responsibilities and job roles.

For sensitive repositories, organizations may apply policies such as:

Files that directly affect security, such as pipeline definitions, infrastructure-as-code templates, and access control policies, should require approval from designated security or platform code owners.

Separate Secrets from Source Code

API keys, database passwords, cloud credentials, and certificate private keys may remain in repository history even after they are deleted from the latest version of the code.

Practical controls include:

When a secret is committed to a repository, deleting the string is not sufficient. The credential must be revoked, replaced, and investigated for signs of unauthorized use.

Establish Reproducible Builds and Artifact Integrity

Consistent artifacts should be generated from the same source code and build environment. This makes it easier to verify that release artifacts have not been altered.

Organizations may use the following techniques:

Container images should be identified by immutable digests rather than tags alone. Mutable tags such as latest may point to different images over time.

Manage SBOMs and Software Provenance

Modern applications consist not only of internally developed code but also of open-source libraries, container images, runtimes, operating system packages, and external tools.

If an organization does not know which components are in its software, it cannot quickly determine whether a newly disclosed vulnerability affects its products.

The build process can collect information such as:

Generating a Software Bill of Materials, or SBOM, is only the first step. The SBOM must be connected to the actual deployed release so that affected products can be identified when new vulnerability information becomes available.

PW: Produce Well-Secured Software

The PW group focuses on designing and implementing software with as few vulnerabilities as reasonably possible.

Security testing is essential, but problems become more expensive to fix after architectural decisions and trust boundaries have already been established. Secure design, implementation, and verification practices must therefore operate together.

Include Threat Modeling in the Design Process

Not every feature requires an extensive threat modeling document. However, high-risk capabilities should be reviewed before implementation.

These commonly include:

A practical threat modeling discussion can begin with questions such as:

Teams may use methodologies such as STRIDE with data flow diagrams, but the primary objective is not to follow a particular methodology. The objective is to document threats, security decisions, and the controls selected to address them.

Use Approved Software Components

When selecting third-party libraries, checking only whether the package is up to date is not enough.

Organizations should also evaluate:

To reduce the risk of typosquatting and dependency confusion attacks, organizations can prevent developers from downloading packages directly from arbitrary public registries. Instead, they can use approved internal registries or controlled package proxies.

Convert Secure Coding Standards into Automated Rules

A policy that simply tells developers to “write secure code” will not produce consistent results.

Organizations should define language-specific and framework-specific practices that clearly identify prohibited and recommended patterns.

Examples include:

Where possible, these rules should be enforced through linters, compiler options, SAST policies, secure code templates, and reusable libraries.

Add Security Questions to Code Reviews

Code reviews should not focus only on functionality, readability, and maintainability.

Security-oriented code review questions may include:

Requiring the application security team to review every pull request does not scale. A more practical approach is to require security approval only for high-risk changes while allowing ordinary changes to be reviewed by development teams, security champions, and automated policies.

Combine Multiple Types of Security Testing

No single security tool can identify every class of vulnerability.

Each tool has its own strengths and limitations.

Test TypePrimary Detection AreaTypical Stage
SASTVulnerable code patterns and data flow issuesDevelopment and build
SCAVulnerabilities in open-source and third-party packagesDependency addition and build
Secret ScanningCredentials stored in code and configurationPre-commit and repository scanning
DASTVulnerabilities in running applicationsAfter deployment to a test environment
IASTRuntime behavior combined with code-level analysisIntegration testing
FuzzingCrashes and unexpected behavior caused by malformed inputComponent and system testing
Container ScanningVulnerabilities in operating system and application packagesAfter container image creation
IaC ScanningCloud and infrastructure configuration issuesBefore deployment
Penetration TestingBusiness logic flaws and complex attack pathsMajor releases or scheduled assessments

When introducing tools, organizations should consider not only the number of findings but also false positives, remediation capacity, and workflow integration.

If every result is configured to block the build while the tools still produce large numbers of false positives, developers may begin ignoring or bypassing the security controls.

Design Risk-Based Build Gates

Treating every vulnerability in the same way makes pipeline operation difficult.

Build-blocking decisions should consider more than severity scores. Relevant factors may include:

For example, a high-severity vulnerability in an unused development dependency should not necessarily receive the same priority as a high-severity vulnerability in a public authentication API.

A phased policy could include the following:

RV: Respond to Vulnerabilities

The RV group focuses on handling vulnerabilities discovered after release and using those incidents to improve the development process.

Even mature secure development practices cannot guarantee that every vulnerability will be identified before release. Organizations therefore need procedures for receiving, analyzing, fixing, and deploying vulnerability reports.

Establish a Clear Vulnerability Reporting Channel

External researchers and customers should know how to report a potential security vulnerability.

Organizations can publish or document the following information:

For public-facing services, organizations may also use a security.txt file to publish security contact and disclosure information.

Operate a Vulnerability Triage and Prioritization Process

CVSS scores alone may not provide enough context to determine remediation priority.

A complete prioritization process should consider:

The findings should be delivered to development teams in a form that supports remediation.

Instead of providing only the vulnerability name and severity, the report should ideally include:

Verify That Patches Are Securely Deployed

Vulnerability remediation does not end when the source code is changed.

Teams should also confirm the following:

Even after a patch is released, the risk remains if customers do not install it. Depending on the product, organizations may need automated update mechanisms, emergency patch processes, and clearly defined end-of-support policies.

Perform Root Cause Analysis

One of the most important SSDF concepts is using vulnerability findings to improve the development process.

Suppose an insecure direct object reference, or IDOR, vulnerability is discovered. The organization should not stop after fixing the authorization check in the affected API.

It should also ask:

Based on the answers, the organization may update shared libraries, coding standards, test cases, project templates, and developer training materials.

Mapping SSDF Practices to a CI/CD Pipeline

When implementing SSDF, organizations should connect security activities to existing development workflows rather than creating a separate security process.

The following is an example of how SSDF practices can be mapped to a typical CI/CD pipeline.

Requirements and Design

Developer Workstation

Pull Request

Build

Test Environment

Deployment

Operations

This workflow is not a universal implementation blueprint. Each organization should adjust it based on its development model, product risk, regulatory obligations, and operating environment.

Assessing the Current State of SSDF Adoption

Before introducing a large number of new tools and procedures, organizations should map their existing activities to SSDF tasks.

For each SSDF task, the organization can evaluate the following:

Assessment AreaQuestion
ExecutionIs the activity currently performed?
ScopeIs it applied to selected projects or all projects?
OwnershipIs an owner responsible for execution and approval?
AutomationIs the process manual, partially automated, or fully automated?
EvidenceAre execution results and approval records retained?
ExceptionsDo exceptions have an approver and expiration date?
MeasurementIs the effectiveness of the activity measured?

A simplified maturity model may look like this:

The objective is not to achieve the highest possible score in every area. The objective is to identify controls that are insufficient relative to the risk of the product and prioritize improvements accordingly.

Common Implementation Failures

Treating Tool Installation as Completion

Connecting a security tool does not provide meaningful protection if its findings are not reviewed or if most results are permanently excluded.

For each tool, organizations should define:

Blocking Every Finding Immediately

If every security warning becomes a build blocker from the beginning, development pipelines may become unusable.

A more practical approach is to separate existing vulnerabilities from newly introduced vulnerabilities and begin by blocking new high-risk issues.

Requiring AppSec to Review Everything

When a small application security team is responsible for every design review and code change, it quickly becomes a bottleneck.

The application security team should focus on high-risk systems and complex architectural reviews. Repetitive checks should be automated, while security champions within development teams can support routine reviews and secure development education.

Measuring Only the Number of Fixed Vulnerabilities

If performance is measured only by the number of closed findings, teams may prioritize easy issues or suppress alerts rather than reduce actual risk.

More meaningful metrics include:

A Practical SSDF Adoption Sequence

Organizations that cannot implement the entire SSDF at once can begin with the following sequence.

First, identify critical services and software assets. Classify them based on internet exposure, data sensitivity, and potential business impact.

Second, secure repository and CI/CD accounts, permissions, and secrets. If the development pipeline is compromised, many other security controls can be bypassed.

Third, automate basic checks for newly introduced code. Integrate SAST, SCA, secret scanning, and infrastructure-as-code scanning into pull requests.

Fourth, apply security requirements and threat modeling to high-risk capabilities. Begin with authentication, authorization, payment processing, personal data handling, and file-processing features.

Fifth, manage the provenance of build artifacts and software components. Connect SBOM generation, artifact signing, approved repositories, and build history.

Sixth, establish vulnerability response and root cause analysis processes. Do not stop at fixing individual findings. Improve code rules, test cases, reusable components, and development templates.

Finally, introduce measurable security indicators and gradually expand the scope of SSDF adoption.

Conclusion

NIST SP 800-218 SSDF is not a framework for adding one more security scan to the development pipeline.

Its central idea is that software security should be managed as a property of the entire development system rather than as the output of a vulnerability scanner.

From a technical practitioner’s perspective, implementing SSDF means making the following changes:

During the initial adoption phase, organizations should not attempt to implement every practice perfectly. A more effective approach is to map the current development process to SSDF, identify the most significant security gaps, and address those gaps in order of risk.

The ultimate goal of secure software development is not to produce a scan report with zero findings. It is to reduce the likelihood that vulnerabilities enter the software, quickly determine the impact when new issues are discovered, and build a development system that prevents the same failures from recurring.

References


Share this post:

Previous Post
Relationship Between NIST SP 800-218 and SP 800-204D
Next Post
Palantir ADS