Skip to content

Add NCISS decision points #707

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 55 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
bbc77ff
refactor a _Valued mixin class
ahouseholder Feb 20, 2025
1cd67e9
add incident severity decision point (+1 squashed commit)
ahouseholder Feb 20, 2025
b349146
add recoverability decision point (+1 squashed commit)
ahouseholder Feb 20, 2025
0e40c2f
add observed activity location
ahouseholder Feb 20, 2025
0fe62b8
add index
ahouseholder Feb 20, 2025
0aa9f93
add recoverability
ahouseholder Feb 20, 2025
b1c44b2
s/cybersecurity/cyber/
ahouseholder Feb 20, 2025
466bf0d
markdownlint
ahouseholder Feb 20, 2025
989c78e
Merge branch 'main' of https://github.com/CERTCC/SSVC into 705-model-…
ahouseholder Feb 20, 2025
703afc1
fix docstrings and comments
ahouseholder Feb 20, 2025
2654bc5
Merge branch 'main' into 705-model-national-cybersecurity-incident-sc…
ahouseholder Feb 21, 2025
ee96d8d
add observed_activity.py
ahouseholder Mar 10, 2025
10b4c4c
add functional_impact.py and information_impact.py
ahouseholder Mar 10, 2025
990a8ca
remove example from value
ahouseholder Mar 10, 2025
3fe850e
add comments with reference links
ahouseholder Mar 10, 2025
7ae9f4e
add functional impact, info impact, observed activity reference docs
ahouseholder Mar 12, 2025
4979c6d
Merge branch 'main' of https://github.com/CERTCC/SSVC into 705-model-…
ahouseholder Mar 12, 2025
ff1661e
fix links
ahouseholder Mar 13, 2025
aa5040f
create a `_Valued` mixin
ahouseholder Mar 13, 2025
f46b420
add `_Valued` mixin to base decision point class. Also reorder mixins…
ahouseholder Mar 13, 2025
03d103a
update json examples to reflect new base class mixin ordering
ahouseholder Mar 13, 2025
bb09944
markdownlint --fix
ahouseholder Mar 13, 2025
5c900cf
Merge branch 'feature/reorder-base-class-mixins' into 705-model-natio…
ahouseholder Mar 13, 2025
433d259
move header
ahouseholder Mar 13, 2025
5b03c6a
add len() to _Valued mixin
ahouseholder Mar 13, 2025
c496db4
add tests
ahouseholder Mar 13, 2025
3c983c9
add a namespace Enum along with a pydantic dataclass validator to enf…
ahouseholder Mar 18, 2025
3a44a44
add validator to _Namespaced mixin class
ahouseholder Mar 18, 2025
34ead88
refactor base classes to use NameSpace enum values
ahouseholder Mar 18, 2025
8acba47
add optional "x_" prefix as valid namespace pattern
ahouseholder Mar 18, 2025
5208b69
update unit tests
ahouseholder Mar 18, 2025
9c36947
add docstrings
ahouseholder Mar 18, 2025
d49afbf
bump python test version to 3.12
ahouseholder Mar 18, 2025
e36ed00
Merge branch 'main' into add_namespace_enum
ahouseholder Mar 18, 2025
5d4490b
Merge branch 'main' of https://github.com/CERTCC/SSVC into 705-model-…
ahouseholder Mar 18, 2025
6c5389d
Merge branch 'add_namespace_enum' into 705-model-national-cybersecuri…
ahouseholder Mar 18, 2025
fbb93e2
add `nciss` namespace
ahouseholder Mar 18, 2025
d8a436c
Merge branch 'feature/reorder-base-class-mixins' into 705-model-natio…
ahouseholder Mar 18, 2025
e4caa13
add _Valued mixin
ahouseholder Mar 18, 2025
eccbe60
Merge branch 'main' into feature/reorder-base-class-mixins
ahouseholder Mar 19, 2025
da21986
update the regex pattern for namespaces, add validation to pydantic f…
ahouseholder Mar 19, 2025
b57c735
refactor namespace validation methods
ahouseholder Mar 19, 2025
4c5e9cd
add unit tests
ahouseholder Mar 19, 2025
0f983dc
Merge branch 'add_namespace_enum' into 705-model-national-cybersecuri…
ahouseholder Mar 19, 2025
d8f5a88
simplify regex to avoid inefficiencies
ahouseholder Mar 19, 2025
9bc375f
Merge branch 'add_namespace_enum' into 705-model-national-cybersecuri…
ahouseholder Mar 19, 2025
e5fe103
add length requirements to namespace patterns and fields
ahouseholder Mar 19, 2025
dd7efec
refactor regex again
ahouseholder Mar 19, 2025
bfa1d05
Merge branch 'add_namespace_enum' into 705-model-national-cybersecuri…
ahouseholder Mar 19, 2025
9abaa13
Merge branch 'main' into feature/reorder-base-class-mixins
ahouseholder Mar 20, 2025
2d3eefa
Merge branch 'main' into 705-model-national-cybersecurity-incident-sc…
ahouseholder Mar 20, 2025
ea61ee5
Merge branch 'feature/reorder-base-class-mixins' into 705-model-natio…
ahouseholder Mar 20, 2025
5985520
Merge branch 'main' of https://github.com/CERTCC/SSVC into 705-model-…
ahouseholder Mar 27, 2025
d42d61b
update copyright
ahouseholder Mar 27, 2025
0e43c0c
Merge branch 'main' into feature/705-model-national-cybersecurity-inc…
ahouseholder Mar 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions docs/reference/decision_points/nciss/functional_impact.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Functional Impact

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.functional_impact import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```
28 changes: 28 additions & 0 deletions docs/reference/decision_points/nciss/incident_severity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Incident Severity

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.incident_severity import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```

Version 2.0.0 is based on the
[National Cyber Incident Scoring System](https://www.cisa.gov/sites/default/files/2023-01/cisa_national_cyber_incident_scoring_system_s508c.pdf)
developed by the Cybersecurity and Infrastructure Security Agency (CISA).

## Previous Versions

Version 1.0.0 is based on the
[Cyber Incident Severity Schema](https://obamawhitehouse.archives.gov/sites/whitehouse.gov/files/documents/Cyber%2BIncident%2BSeverity%2BSchema.pdf)
adopted by the United States Federal Cybersecurity Centers, in coordination with departments and agencies with a
cybersecurity or cyber operations mission.

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.incident_severity import VERSIONS
from ssvc.doc_helpers import example_block

versions = VERSIONS[:-1]
for version in versions:
print(example_block(version))
```
21 changes: 21 additions & 0 deletions docs/reference/decision_points/nciss/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# National Cybersecurity Incident Scoring System (NCISS) Decision Points

The [National Cyber Incident Scoring System (NCISS)](https://www.cisa.gov/sites/default/files/2023-01/cisa_national_cyber_incident_scoring_system_s508c.pdf)
was developed by the Cybersecurity and Infrastructure Security Agency (CISA).

Although the NCISS is implemented as a numerical scoring system, a number of
its criteria are amenable to modeling using SSVC decision points. We have
included a few examples here.

## Decision Points

<div class="grid cards" markdown>

- [Functional Impact](functional_impact.md)
- [Incident Severity](incident_severity.md)
- [Information Impact](information_impact.md)
- [Observed Activity](observed_activity.md)
- [Observed Location of Activity](observed_activity_location.md)
- [Recoverability](recoverability.md)

</div>
8 changes: 8 additions & 0 deletions docs/reference/decision_points/nciss/information_impact.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Information Impact

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.information_impact import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```
8 changes: 8 additions & 0 deletions docs/reference/decision_points/nciss/observed_activity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Observed Activity

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.observed_activity import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Observed Location of Activity

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.observed_activity_location import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```
8 changes: 8 additions & 0 deletions docs/reference/decision_points/nciss/recoverability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Recoverability

```python exec="true" idprefix=""
from ssvc.decision_points.nciss.recoverability import LATEST
from ssvc.doc_helpers import example_block

print(example_block(LATEST))
```
8 changes: 8 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ nav:
- Report Confidence: 'reference/decision_points/cvss/report_confidence.md'
- Scope: 'reference/decision_points/cvss/scope.md'
- Target Distribution: 'reference/decision_points/cvss/target_distribution.md'
- NCISS Decision Points:
- 'reference/decision_points/nciss/index.md'
- Functional Impact: 'reference/decision_points/nciss/functional_impact.md'
- Incident Severity: 'reference/decision_points/nciss/incident_severity.md'
- Information Impact: 'reference/decision_points/nciss/information_impact.md'
- Observed Activity: 'reference/decision_points/nciss/observed_activity.md'
- Observed Activity Location: 'reference/decision_points/nciss/observed_activity_location.md'
- Recoverability: 'reference/decision_points/nciss/recoverability.md'
- Code:
- Intro: 'reference/code/index.md'
- CSV Analyzer: 'reference/code/analyze_csv.md'
Expand Down
6 changes: 0 additions & 6 deletions src/ssvc/decision_points/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,6 @@ class SsvcDecisionPoint(_Valued, _Keyed, _Versioned, _Namespaced, _Base, BaseMod
namespace: str = NameSpace.SSVC
values: tuple[SsvcDecisionPointValue, ...]

def __iter__(self):
"""
Allow iteration over the decision points in the group.
"""
return iter(self.values)

def __init__(self, **data):
super().__init__(**data)
register(self)
Expand Down
21 changes: 21 additions & 0 deletions src/ssvc/decision_points/nciss/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright (c) 2025 Carnegie Mellon University.
# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE
# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS.
# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND,
# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT
# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR
# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE
# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE
# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM
# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.
# Licensed under a MIT (SEI)-style license, please see LICENSE or contact
# [email protected] for full terms.
# [DISTRIBUTION STATEMENT A] This material has been approved for
# public release and unlimited distribution. Please see Copyright notice
# for non-US Government use and distribution.
# This Software includes and/or makes use of Third-Party Software each
# subject to its own license.
# DM24-0278
"""
This module contains decision points based on the National Cyber Incident Scoring System (NCISS).
"""
43 changes: 43 additions & 0 deletions src/ssvc/decision_points/nciss/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env python
"""
Provides a base class for decision points modeled after the US National Cyber Incident Scoring System
"""
# Copyright (c) 2025 Carnegie Mellon University.
# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE
# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS.
# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND,
# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT
# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR
# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE
# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE
# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM
# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.
# Licensed under a MIT (SEI)-style license, please see LICENSE or contact
# [email protected] for full terms.
# [DISTRIBUTION STATEMENT A] This material has been approved for
# public release and unlimited distribution. Please see Copyright notice
# for non-US Government use and distribution.
# This Software includes and/or makes use of Third-Party Software each
# subject to its own license.
# DM24-0278

from pydantic import BaseModel

from ssvc.decision_points import SsvcDecisionPoint
from ssvc.namespaces import NameSpace


class NcissDecisionPoint(SsvcDecisionPoint, BaseModel):
"""
Models a single NCISS decision point as a list of values.
"""

namespace: str = NameSpace.NCISS


def main():
pass


if __name__ == "__main__":
main()
144 changes: 144 additions & 0 deletions src/ssvc/decision_points/nciss/functional_impact.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/usr/bin/env python
"""
Provides the NCISS Functional Impact decision point and values.
"""
# Copyright (c) 2025 Carnegie Mellon University.
# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE
# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS.
# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND,
# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT
# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR
# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE
# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE
# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM
# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.
# Licensed under a MIT (SEI)-style license, please see LICENSE or contact
# [email protected] for full terms.
# [DISTRIBUTION STATEMENT A] This material has been approved for
# public release and unlimited distribution. Please see Copyright notice
# for non-US Government use and distribution.
# This Software includes and/or makes use of Third-Party Software each
# subject to its own license.
# DM24-0278

from ssvc.decision_points.base import SsvcDecisionPointValue
from ssvc.decision_points.helpers import print_versions_and_diffs
from ssvc.decision_points.nciss.base import NcissDecisionPoint

IMPACT_NONE = SsvcDecisionPointValue(
key="N",
name="No Impact",
description="Organization has experienced no loss in ability to provide all services to all users.",
)

LOW = SsvcDecisionPointValue(
key="L",
name="Low",
description="Organization has experienced a loss of efficiency, but can still provide all critical services to all users with minimal effect on performance.",
)

MEDIUM = SsvcDecisionPointValue(
key="M",
name="Medium",
description="Organization has lost the ability to provide a critical service to a subset of system users.",
)

HIGH = SsvcDecisionPointValue(
key="H",
name="High",
description="Organization has lost the ability to provide all critical services to all system users.",
)

## based on https://www.cisa.gov/sites/default/files/publications/Federal_Incident_Notification_Guidelines_2015.pdf
FUNCTIONAL_IMPACT_1 = NcissDecisionPoint(
key="FI",
name="Functional Impact",
version="1.0.0",
description="A measure of the impact to business functionality or ability to provide services.",
values=(
IMPACT_NONE,
LOW,
MEDIUM,
HIGH,
),
)

NO_IMPACT = SsvcDecisionPointValue(
key="N",
name="No Impact",
description="Event has no impact.",
)

NO_IMPACT_TO_SERVICES = SsvcDecisionPointValue(
key="S",
name="No Impact to Services",
description="Event has no impact to any business or Industrial Control Systems (ICS) services or delivery to entity customers.",
)

MINIMAL_IMPACT_TO_NON_CRITICAL_SERVICES = SsvcDecisionPointValue(
key="M",
name="Minimal Impact to Non-Critical Services",
description="Some small level of impact to non-critical systems and services.",
)

MINIMAL_IMPACT_TO_CRITICAL_SERVICES = SsvcDecisionPointValue(
key="C",
name="Minimal Impact to Critical Services",
description="Minimal impact but to a critical system or service, such as email or active directory.",
)

SIGNIFICANT_IMPACT_TO_NON_CRITICAL_SERVICES = SsvcDecisionPointValue(
key="I",
name="Significant Impact to Non-Critical Services",
description="A non-critical service or system has a significant impact.",
)

DENIAL_OF_NON_CRITICAL_SERVICES = SsvcDecisionPointValue(
key="D",
name="Denial of Non-Critical Services",
description="A non-critical system is denied or destroyed.",
)

SIGNIFICANT_IMPACT_TO_CRITICAL_SERVICES = SsvcDecisionPointValue(
key="T",
name="Significant Impact to Critical Services",
description="A critical system has a significant impact, such as local administrative account compromise.",
)

DENIAL_OF_CRITICAL_SERVICES_LOSS_OF_CONTROL = SsvcDecisionPointValue(
key="L",
name="Denial of Critical Services/Loss of Control",
description="A critical system has been rendered unavailable.",
)

# based on https://www.cisa.gov/sites/default/files/publications/Federal_Incident_Notification_Guidelines.pdf
FUNCTIONAL_IMPACT_2 = NcissDecisionPoint(
key="FI",
name="Functional Impact",
version="2.0.0",
description="A measure of the impact to business functionality or ability to provide services.",
values=(
NO_IMPACT,
NO_IMPACT_TO_SERVICES,
MINIMAL_IMPACT_TO_NON_CRITICAL_SERVICES,
MINIMAL_IMPACT_TO_CRITICAL_SERVICES,
SIGNIFICANT_IMPACT_TO_NON_CRITICAL_SERVICES,
DENIAL_OF_NON_CRITICAL_SERVICES,
SIGNIFICANT_IMPACT_TO_CRITICAL_SERVICES,
DENIAL_OF_CRITICAL_SERVICES_LOSS_OF_CONTROL,
),
)

VERSIONS = (
FUNCTIONAL_IMPACT_1,
FUNCTIONAL_IMPACT_2,
)
LATEST = VERSIONS[-1]


def main():
print_versions_and_diffs(VERSIONS)


if __name__ == "__main__":
main()
Loading