Skip to content

DOD Incidents and CACAO playbooks

priamai edited this page May 26, 2023 · 3 revisions

We are referring to the current proposal from the DOD schema here. An incident sample activity here.

There are a lot of overlaps in functionality between the incident response model and the workflow of CACAO playbook model. One would say that the incident response should be a super set of the workflow model but in any case we should reduce the data structures between the two to provide a better integration and modelling capabilities.

Following some suggestions.

Triggering a CACAO playbook

This is an example of a task triggering a CACAO playbook. A few comments:

  • this is the playbook ID: playbook--a361b0e4-d81b-43f7-ba45-a131aa3b8080 which is stored in our data model, this makes sense
  • this playbook step is confusing: action--e984e66e-e92b-4ba1-b7a7-a319aa5c58cd, it should be pointing to a start step like so: "start--fa16a4e9-e6b9-4658-b464-ca1632ff57f4"
  • changed object: this is very fuzzy how can the playbook affect the state of the grouping object in this case a user account? Depending on the playbook type there may be many ways the playbook interact with an SDO. I am not sure we want to go to this level of granularity right in this version. I suggest we remove this feature for now.
        {
            "type": "task",
            "id": "task--9ceb67a5-5c5e-4d2c-8fa1-044c91445e49",
            "created": "2020-10-19T01:01:01.000Z",
            "modified":"2020-10-19T01:01:01.000Z",
            "spec_version": "2.1",
            "task_type": "playbook-step-execution",
            "name": "get new accounts",
            "outcome": "successful",
            "external_references": [
                {
                    "source_name": "internal-playbooks",
                    "external_id": "playbook--a361b0e4-d81b-43f7-ba45-a131aa3b8080"
                },
                {
                    "source_name": "playbook-step",
                    "external_id": "action--e984e66e-e92b-4ba1-b7a7-a319aa5c58cd"
                }
            ],
            "changed_objects": [
                {
                    "state_change_type": "output",
                    "result_ref": "grouping--5ae578cf-5884-45f4-a1bf-1998af828ccc"
                }
            ],
            "extensions": {
                "extension-definition--2074a052-8be4-4932-849e-f5e7798e0030": {
                    "extension_type": "new-sdo"
                }
            }
        },

        {
            "type": "grouping",
            "spec_version": "2.1",
            "id": "grouping--5ae578cf-5884-45f4-a1bf-1998af828ccc",
            "created": "2023-04-28T23:35:32.099185Z",
            "modified": "2023-04-28T23:35:32.099185Z",
            "context": "suspicious-activity",
            "object_refs": [
                "user-account--a5549db1-1a61-5905-ad16-3cc14b35cd22"
            ]
        },

Activity Entry

A list of activities tied to this incident. Each activity-entry MUST reference either a Task or Event. This list MUST not contain cycles.

Property Name Type Description
activity_ref (required) identifier The identity of the event or task that is described by this entry. Within an Incident this MUST reference either a Task or Identity.When used within a Task this MUST only reference other Task objects. When used within a Event this MUST only reference other Event objects.
next_steps (optional) list of type activity-sequence-entry A list of activity sequences that describes how the activities that compose the parent object flow into each other.

This is confusing because in CACAO the next_step properties, does not indicate sequentiality but: A parallel step MUST execute all workflow steps that are part of the next_steps property before this step can be considered complete and the workflow logic moves on.

Therefore if we want to decide in our case:

  • it his a parallel activity?
  • are next steps ALL required to complete or are all optional?
  • on_completion: I am guessing this is the equivalent of result_ref?
"step--46c1d6e1-874e-4588-b2a4-16d31634372c": {

  "type": "parallel",

  "next_steps": [

    "step--9afbcb12-8f82-4d35-ba70-f755b83725e1",

    "step--b4161d26-1c8d-4f19-b82f-aad144de4828"

  ],

  "on_completion": "step--44924d92-58c9-4fcc-9435-6fb651dbbddd"

}

Activity Sequence

Activity sequences entries stored references to a subsequent step for an activity entry. As these are always stored in an array of steps within an array of activity entries validation rules for step_ref MUST be performed against the entire array of activity entries.

Property Name Type Description
step_ref (required) identifier The identity of the event or task that is described by this entry.This reference MUST be included as an activity_ref within the parent array of activity-entry objects. Within this array there MUST not be any cyclical references.
condition_type (required) activity-condition-enum If the referenced step required the current one to be successful. If it is optional, or if it is unknown.
transition_type (required) activity-transition-enum What state the referenced step depends on. If it is performed upon success, failure, simple completion, or if it is unknown.

This is too complicated and could be implemented like in a the Conditional Step of CACAO.

Suggestions

We want to propose the following approach:

  • we keep the incident core as it is
  • we remove the activity objects
  • instead we "borrow" the CACAO workflow step:
    • use a type = incident-step-type (or similar to mimick the CACAO approach)
    • merge the Task type and the Activity and Activity Sequence into effectively one object
    • remove the delay, timeout, step_variables, owner and step_extensions
    • include the properties we care about like start_time and end_time
    • introduce the same vocabulary: start, end, single, playbook, parallel, if-condition, while-condition, switch-condition (maybe we take out the while-condition and switch-condition for now)
    • the playbook step will work nicely because it operates the exact same function
    • state change object: I believe this should be linked to a command-type step in CACAO playbook to resolve the fuzzy semantic explained before, for example a an OpenC2 step will be the initial_ref and the result_ref will be a DDOS prevention impact etc...