SC-2(2): Disassociability

To meet the sc-2(2): disassociability requirement, you must store application “state” (for example sessions, workflow state, tokens, and cached user context) in a separate storage layer from the application code/runtime so the state can’t be trivially tied to, exposed by, or compromised with the app itself. Operationalize this by standardizing an approved state store pattern, enforcing it in architecture and CI/CD, and keeping evidence that systems follow the pattern. 1

Key takeaways:

  • Define “state information” for your environment, then publish an approved design pattern (what is allowed, what is not).
  • Separate state from application/runtime using distinct services, accounts, networks, and secrets, not just separate folders.
  • Evidence is the control: architecture diagrams, configuration snapshots, IaC, and review records must show separation in practice. 2

SC-2(2) is a compact requirement that creates real engineering consequences: don’t let the application and its “memory” of users and transactions live in the same place. NIST phrases this as storing state information from applications and software separately. 1 For a Compliance Officer, CCO, or GRC lead, the fastest path to compliance is to translate “separately” into concrete architectural guardrails that engineers can follow without guesswork.

In practice, “state” shows up in many places: web session stores, background job queues, workflow engines, caches, temporary files, client-side storage, or even in-memory objects that get serialized to disk. If that state is co-located with the application runtime (same host, same container image, same database credentials, same storage bucket, same namespace), an attacker who compromises the app often gains direct access to the state. That expands the blast radius and can make incident containment harder.

This page gives requirement-level implementation guidance you can hand to engineering: what counts as state, where it may live, how to enforce the pattern across systems, and what artifacts auditors typically ask for under NIST SP 800-53 Rev. 5. 2

Regulatory text

Requirement (SC-2(2): Disassociability): “Store state information from applications and software separately.” 1

Operator interpretation: You need a deliberate separation between:

  • Application code/runtime (services, containers, functions, VMs, binaries, packages), and
  • State stores (anything that persists or represents the application’s current or prior execution context)

“Separately” should be implemented as a separation of storage location and access path, backed by independent access controls. Separate directories on the same host is rarely enough because compromise of the runtime typically yields the same filesystem access.

Plain-English interpretation (what “state information” means)

Treat the following as state unless you document an explicit exception:

  • Session state: server-side sessions, session IDs, refresh tokens, CSRF tokens, device binding artifacts
  • Workflow/transaction state: order status, approval steps, idempotency keys, saga state
  • Async processing state: message queues, job payloads, retry queues, dead-letter queues
  • Cache state: cached user profiles, authorization decisions, feature flags cached at runtime
  • Temporary persisted state: tmp files, serialized objects, local SQLite files used for “convenience”
  • Application-generated cryptographic state: nonces, key derivation parameters, token signing metadata (where applicable)

Not all data is “state.” Reference data (static config shipped with the app) is generally not state, but config that changes during execution (feature toggles, dynamic routing tables) usually is.

Who it applies to (entity and operational context)

SC-2(2) is most relevant for:

  • Federal information systems and their components aligned to NIST SP 800-53 Rev. 5. 2
  • Contractor systems handling federal data (including cloud-hosted systems and SaaS components in scope for a federal authorization boundary). 2

Operationally, it applies anywhere you run applications that maintain sessions or workflows:

  • Web apps, APIs, mobile backends
  • Microservices platforms (Kubernetes, service mesh environments)
  • Serverless apps with managed state stores
  • Packaged enterprise applications with externalized session/state modules
  • Third-party platforms you operate/configure where you control state storage choices

What you actually need to do (step-by-step)

1) Set the control owner and the “definition of done”

Assign an accountable owner (often an AppSec architect or platform engineering lead) and publish a short standard that answers:

  • What counts as state in your environment
  • Approved state stores (examples: managed database, managed cache, queue service)
  • Disallowed patterns (examples: local filesystem session persistence, embedding state in container images)
  • Minimum separation expectations (identity, network, secrets)

This is the governance anchor you will point auditors to. 2

2) Inventory where state exists today

Create a scoped inventory for in-scope systems:

  • Identify each application and list its state components (sessions, caches, queues, workflow DB tables)
  • Record where each state component is stored (service name, account/subscription/project, cluster/namespace, bucket/index/table)
  • Tag each item as: “separate state store” vs “co-located with runtime”

This inventory becomes your remediation backlog and your recurring evidence base.

3) Standardize an approved architecture pattern

Pick one or two blessed patterns, and require teams to use them:

Pattern A (common for web apps):

  • Runtime: stateless containers/functions
  • State: managed cache (sessions) + managed database (workflow/transactions)
  • Access: runtime role can read/write only required keys/tables; admins are separate

Pattern B (common for async systems):

  • Runtime: workers
  • State: queue + DB + cache, each in separate managed services
  • Access: least-privilege roles per component

The key is not the specific technology; it is the separation of state from the app execution environment with independent controls.

4) Enforce separation with technical guardrails

Add controls that prevent regressions:

  • CI/CD checks: block builds that include stateful files or session persistence configs in images
  • Infrastructure-as-code standards: modules that provision state stores separately and consistently
  • Platform policies: Kubernetes admission controls or cloud policies that restrict mounting host paths used for persistence
  • Secrets segmentation: separate secrets for app runtime vs state store administration, stored in a centralized secret manager

Auditors respond well to guardrails because they show you can keep compliance over time, not just in a one-off design review.

5) Build the exception process (because legacy happens)

Some systems will be hard to refactor. Define an exception workflow:

  • Risk acceptance owner (who can sign)
  • Required compensating controls (for example: stronger isolation, stricter monitoring, faster rotation)
  • Time-bound remediation plan and review cadence

Document the exception and keep it linked to the system record.

6) Operationalize recurring verification

Turn SC-2(2) into something you can continuously attest:

  • Add an architecture checkpoint in SDLC (design review or threat model) that explicitly asks “Where does state live?”
  • Add a periodic configuration review for state stores (access paths, roles, network controls)
  • Sample-test systems for co-located state (container images, writable volumes, local disk use)

If you use Daydream to manage your control library, map SC-2(2) to a control owner, a written procedure, and a recurring evidence request so you can answer assessors quickly with consistent artifacts. 1

Required evidence and artifacts to retain

Keep evidence that proves design + operating effectiveness:

Governance artifacts

  • SC-2(2) control statement (your standard) and ownership assignment
  • Approved reference architectures (one-pagers are fine)
  • Exception register entries and approvals

System-level artifacts 1

  • Architecture diagram showing state stores outside runtime boundary
  • Data flow diagram or narrative that identifies state elements and their storage locations
  • IaC snippets or configuration exports for state services (cache/DB/queue)
  • Access control evidence:
    • runtime identity and permissions to state store
    • admin identities separated from runtime identities
  • SDLC review records (design review ticket, threat model notes) showing the state decision

Verification artifacts

  • Policy-as-code or CI/CD checks and sample outputs
  • Periodic review logs or tickets showing continued separation

Common exam/audit questions and hangups

Expect these prompts under NIST-aligned assessments: 2

  • “Define ‘state information’ for your system. What components are in scope?”
  • “Show me where session state is stored for Application X.”
  • “Is any state persisted on local disk in containers/VMs?”
  • “Are the credentials used by the runtime the same credentials used to administer the state store?”
  • “How do you prevent engineers from reintroducing co-located state during a hotfix?”
  • “Do third parties host any part of your state store, and how do you govern that arrangement?”

Hangup to anticipate: teams often argue that “separate database schema” equals “separate.” Assessors may still view that as insufficient if the same database instance, same admin plane, and same credentials are shared broadly. Document your rationale, then strengthen separation where it matters.

Frequent implementation mistakes (and how to avoid them)

  1. Persisting sessions to the container filesystem

    • Fix: require external session store; block writable persistent volumes for web tiers unless justified.
  2. Same credentials for runtime and administration

    • Fix: separate roles; runtime gets least-privilege data-plane access; admin actions require separate identities and MFA where supported.
  3. “Separate” only in naming

    • Fix: enforce separation across account/project, network segment, or managed service boundary for high-impact systems; document the chosen separation boundary for each app.
  4. Caches treated as “not real data”

    • Fix: assume caches contain sensitive state; apply the same separation and access discipline.
  5. No evidence trail

    • Fix: make the architecture review artifact mandatory, store it centrally, and tie it to the system inventory entry.

Enforcement context and risk implications

No public enforcement cases were provided for this requirement in the source material, so treat SC-2(2) primarily as an assessment and authorization readiness expectation under NIST SP 800-53 Rev. 5. 2

Operationally, the risk is straightforward: co-locating state with the runtime can turn an application compromise into session theft, workflow manipulation, or broader data access. Separation reduces blast radius and simplifies containment because you can rotate, isolate, or revoke access to the state store without rebuilding the entire application layer.

A practical 30/60/90-day execution plan

First 30 days (stabilize and define)

  • Assign SC-2(2) owner and publish your “state separation” standard.
  • Identify in-scope applications and create a state inventory template.
  • Pick approved reference patterns for web apps and async apps.
  • Add SC-2(2) checks to design reviews for new builds and major changes.

Days 31–60 (remediate highest-risk and add guardrails)

  • Triage inventory: prioritize internet-facing apps and apps with user sessions.
  • Migrate the most exposed apps to external session/state stores.
  • Implement CI/CD and IaC guardrails that prevent local persistence patterns.
  • Create the exception workflow and record any unavoidable gaps with compensating controls.

Days 61–90 (prove operating effectiveness)

  • Run a sample-based verification across apps (spot-check images, volumes, configs).
  • Capture evidence bundles per app (diagram + configs + access controls + review ticket).
  • Set a recurring review rhythm tied to change management so new services inherit the pattern.
  • In Daydream, map SC-2(2) to the control owner, the procedure, and the evidence artifacts so audits do not become a scramble. 1

Frequently Asked Questions

What counts as “state information” for SC-2(2)?

Treat anything that represents session context, workflow progress, queued work, cached authorization decisions, or temporary persisted execution context as state. Document your definition in your SC-2(2) control statement and apply it consistently. 1

Is using a separate schema in the same database “separate” storage?

It can be a partial step, but it is often weak separation if the same admin plane, instance-level access, and credentials are shared. If you keep the same instance, document why and strengthen role separation, network restrictions, and monitoring.

Do stateless microservices automatically satisfy SC-2(2)?

Only if the state is truly externalized (sessions, queues, caches, workflow data) and not reintroduced through writable volumes, local files, or embedded token stores. Your evidence should show where state lives and how access is controlled.

How does SC-2(2) apply in Kubernetes?

Common failures are writing state to persistent volumes attached to app pods or using shared cluster-level secrets broadly. A clean implementation uses external state services (DB/cache/queue), namespace-scoped identities, and admission policies that block unsafe persistence patterns.

What evidence should I hand an assessor for one application?

Provide an architecture diagram, a short narrative identifying state elements and their storage locations, IaC or configuration exports for the state store, and proof that runtime identities differ from admin identities. Keep the design review ticket that approved the pattern.

What about third-party managed platforms (SaaS) where we can’t control internals?

If the third party controls state storage, treat this as a third-party risk issue: contract for security expectations, obtain assurance evidence, and document how their architecture meets the intent of separating application runtime and state within their boundary.

Footnotes

  1. NIST SP 800-53 Rev. 5 OSCAL JSON

  2. NIST SP 800-53 Rev. 5

Frequently Asked Questions

What counts as “state information” for SC-2(2)?

Treat anything that represents session context, workflow progress, queued work, cached authorization decisions, or temporary persisted execution context as state. Document your definition in your SC-2(2) control statement and apply it consistently. (Source: NIST SP 800-53 Rev. 5 OSCAL JSON)

Is using a separate schema in the same database “separate” storage?

It can be a partial step, but it is often weak separation if the same admin plane, instance-level access, and credentials are shared. If you keep the same instance, document why and strengthen role separation, network restrictions, and monitoring.

Do stateless microservices automatically satisfy SC-2(2)?

Only if the state is truly externalized (sessions, queues, caches, workflow data) and not reintroduced through writable volumes, local files, or embedded token stores. Your evidence should show where state lives and how access is controlled.

How does SC-2(2) apply in Kubernetes?

Common failures are writing state to persistent volumes attached to app pods or using shared cluster-level secrets broadly. A clean implementation uses external state services (DB/cache/queue), namespace-scoped identities, and admission policies that block unsafe persistence patterns.

What evidence should I hand an assessor for one application?

Provide an architecture diagram, a short narrative identifying state elements and their storage locations, IaC or configuration exports for the state store, and proof that runtime identities differ from admin identities. Keep the design review ticket that approved the pattern.

What about third-party managed platforms (SaaS) where we can’t control internals?

If the third party controls state storage, treat this as a third-party risk issue: contract for security expectations, obtain assurance evidence, and document how their architecture meets the intent of separating application runtime and state within their boundary.

Operationalize this requirement

Map requirement text to controls, owners, evidence, and review workflows inside Daydream.

See Daydream