Definition: "The degree to which a system, product or component performs specified functions under specified conditions for a specified period of time" [ISO-25010]. In SSEM, Reliability means software operates consistently and predictably, even under adverse conditions or when facing unexpected inputs or attacks.
Definition: "Property of being accessible and usable on demand by an authorized entity" [ISO-27000, §3.7]. Availability also includes maintaining this performance during periods of adverse circumstances.
For security, Availability means the system is designed to resist attacks like Distributed Denial of Service (DDoS) and to recover quickly from failures or disruptions, ensuring it remains accessible to authorized users.
Definition: "Property of accuracy and completeness" [ISO-27000, §3.36]. In SSEM, Integrity applies at two levels. System integrity is the property that the system performs its intended function in an unimpaired manner, free from unauthorized manipulation of its code, configuration, or runtime behavior. Data integrity is the property that data has not been changed, destroyed, or lost through unauthorized action, accidental modification, or transmission error.
Integrity measures such as cryptographic hashes, checksums, and access controls help prevent unauthorized modification and corruption. Integrity also concerns whether the system continues to perform its intended function under threats or failure.
Definition: The ability of a system to continue operating during and after the failure of one or more of its parts, and to recover from that failure and restore full operations. Resilience also encompasses an application's ability to continue running predictably under unfavorable circumstances or load (as discussed in Section 4.4).
Resilience includes fault tolerance: the ability of a system to continue operating correctly even when a component has failed. Achieving Resilience means fault tolerance is designed into the system as a whole, not bolted onto specific features. The system handles errors gracefully, recovers from failures, and maintains functionality even when components are compromised or unavailable.
Strategies for building resilient systems include:
- Defensive coding: Writing code that anticipates input outside expected bounds and handles it without failing.
- Predictable execution: Ensuring code behaves consistently under varied conditions.
- Strong trust boundaries: Clearly defining areas of the codebase that enforce strictly controlled execution.
- Robust error handling: Implementing recovery mechanisms that manage partial failures effectively.