Security in the SDLC
Embed requirements, design, threat modeling, coding, testing, release, operation, change, and disposal controls into development lifecycles.
- Lesson
- d8-lesson
- Practice pool
- d8-questions
- Application
- cissp-s10
Integrate security into development methods, environments, testing, acquired software, coding, deployment, operation, and software supply-chain governance.
Embed requirements, design, threat modeling, coding, testing, release, operation, change, and disposal controls into development lifecycles.
Protect repositories, pipelines, dependencies, artifacts, environments, credentials, tools, test data, and separation of duties.
Assess architecture, code, dependencies, runtime, tests, defects, remediation, coverage, and risk trends.
Apply supplier requirements, contracts, provenance, assessment, acceptance, maintenance, vulnerability, escrow, and end-of-life controls.
Address common software weaknesses through language/framework controls, review, testing, dependency hygiene, secrets protection, and safe error handling.
Software security begins with business and security requirements and continues through architecture, acquisition, design, coding, testing, release, operation, change, and disposal. Finding vulnerabilities late is expensive; designing unsafe authority, data flow, or trust boundaries cannot be repaired by a scanner alone.
Treat source, dependencies, build systems, artifact registries, deployment pipelines, secrets, test data, environments, and suppliers as one software supply chain. Protect both the product and the machinery that produces it.
| Objective | Required judgment | Proof |
|---|---|---|
| 8.1 Security in the SDLC | Integrate requirements, architecture, threat modeling, coding, testing, release, operation, change, and disposal | Each release traces security criteria to implementation and validation |
| 8.2 Development-ecosystem controls | Protect repositories, pipelines, dependencies, artifacts, credentials, environments, tools, data, and duties | An unauthorized contributor cannot alter and deploy a trusted artifact |
| 8.3 Software security effectiveness | Assess architecture, code, dependencies, runtime, tests, defects, remediation, coverage, and trends | Measures show risk and verified correction, not only scan volume |
| 8.4 Acquired software | Govern supplier requirements, contract, provenance, assessment, acceptance, maintenance, vulnerabilities, escrow, and end of life | Supplier obligations and product evidence support the organization's use case |
| 8.5 Secure coding | Prevent common weaknesses through framework controls, review, testing, dependency hygiene, secrets, and safe errors | Abuse and regression tests demonstrate the required behavior |
During concept and requirements, identify assets, users, data, obligations, misuse, availability, recovery, and assurance. Write testable security requirements and acceptance criteria. During architecture, model trust boundaries, entry points, identity, authorization, data flows, failure, dependencies, administrative planes, and abuse cases. Select secure patterns and reduce unnecessary attack surface.
During implementation, use supported languages and frameworks, secure coding standards, peer review, automated checks, dependency governance, secret scanning, and isolated development access. During verification, combine unit, integration, abuse, authorization, static, dynamic, composition, fuzz, configuration, and manual tests according to risk. During release, protect artifacts, approvals, deployment identity, configuration, rollback, and post-deploy validation. During operation, monitor, patch, respond, measure, and reassess. At disposal, remove data, credentials, endpoints, artifacts, dependencies, and support obligations safely.
Agile and DevOps do not remove governance; they move it into iterative criteria and automation. Threat models and requirements should evolve with features. DevSecOps integrates security into the delivery flow while preserving independent review and separation for high-risk changes.
Require individual identities, strong authentication, least privilege, branch and review protections, signed or attributable commits where appropriate, and controlled administrative access. Separate code approval, artifact publication, and production deployment according to risk. Protect CI runners from untrusted code and prevent pull requests from obtaining production secrets.
Store secrets in approved systems and issue short-lived workload credentials when possible. Do not place credentials in source, build logs, images, artifacts, environment dumps, or test fixtures. Scope pipeline roles to target environment and approved actions. Protect pass role or equivalent delegation paths.
Pin and verify dependencies according to ecosystem; maintain lockfiles, approved registries, provenance, software bills of materials where useful, vulnerability monitoring, license review, and update policy. A clean vulnerability scan does not prove a dependency is trustworthy. Protect build configuration, compiler, package manager, plugins, and base images.
Establish artifact identity and immutability. Promote the same tested artifact rather than rebuilding separately for production. Record source commit, dependencies, build environment, tests, approvals, artifact digest, deployment, and rollback. Separate development, test, staging, and production data and credentials. Use synthetic or minimized test data.
Measure coverage of requirements and abuse cases, critical findings, age, recurrence, escaped defects, time to remediate, dependency freshness, exception duration, review effectiveness, and verified closure. Raw finding counts reward noisy tools. Test coverage is useful but does not prove assertions are meaningful or critical paths are covered.
Static analysis can find patterns without execution; dynamic testing observes running behavior; composition analysis inspects components; interactive and runtime techniques add context; manual review finds logic and authorization flaws. Calibrate tools, validate findings, and combine methods. Threat-informed tests should verify expected deny behavior, not only successful paths.
Root-cause analysis should improve standards, frameworks, reusable components, pipeline controls, training, and architecture—not only patch one line. Preserve regression tests for vulnerabilities and incidents.
Define security requirements before procurement. Evaluate supplier development practices, provenance, architecture, data use, access, hosting, subcontractors, incident history, vulnerability disclosure, patch timelines, support, resilience, escrow where relevant, export, deletion, and exit. Put material obligations, evidence, notification, remediation, audit, data, and end-of-life terms into contracts.
Validate the product in the organization's configuration and use case. A third-party assessment is point-in-time and scope-limited. Monitor new vulnerabilities, ownership changes, dependencies, support status, and service behavior. Plan replacement and data extraction before lock-in becomes a crisis.
Validate input at a defined trust boundary with allowlists and schema. Encode output for its destination. Use parameterized queries and safe APIs to prevent injection. Enforce authorization on every protected server-side action and object. Protect sessions, tokens, cookies, and state-changing requests. Limit upload type, size, content, storage, and execution. Handle errors without exposing secrets or internals while retaining secure diagnostic evidence.
Use cryptographic libraries and approved protocols rather than custom algorithms. Store passwords with an approved salted adaptive password hashing scheme. Prevent unsafe deserialization and dynamic evaluation. Constrain server-side requests and outbound network access. Protect concurrency and transaction integrity. Use memory-safe languages or strong memory-safety controls where feasible, while recognizing logic flaws remain.
Design abuse resistance: rate limits, quotas, fraud controls, replay protection, idempotency, resource limits, and monitoring. Privacy-by-design minimizes data and gives lifecycle control. Accessibility and usability are security considerations because unusable controls invite bypass.
| Need | Strong approach | Frequent error |
|---|---|---|
| Prevent unauthorized production change | Protected repo, independent review, immutable artifact, scoped deploy role | One administrator can edit and deploy directly |
| Protect CI from untrusted contributions | Isolated runner, no production secrets, bounded token, reviewed promotion | Run forked code with privileged credentials |
| Manage component risk | Provenance, lock, SBOM where useful, monitoring, updates, tests | Accept “no known CVE” as complete trust |
| Test object authorization | Negative tests across users and object IDs | Hide links in the UI only |
| Buy critical software | Requirements, evidence, contract, acceptance, monitoring, exit | Review the supplier after signing |
| Fix recurring injection | Safe framework/API, standards, pipeline test, training, regression | Patch individual strings repeatedly |
A team must ship a critical service using third-party code, cloud CI/CD, open-source dependencies, and a supplier library with limited assurance evidence.