Skip to content
Reference

OCSF schema

The exact OCSF v1.3 classes Falak Neo emits, the fields the sensor populates, and the one documented Falak extension.

Falak implements a deliberate subset of OCSF v1.3 — only the classes a Linux, Kubernetes and cloud runtime sensor can populate with high fidelity. Adding a class is a deliberate act requiring a probe that can fill it and a storage projection that can hold it.

Classes

class_uidNameCategoryEmitted by
1001File System Activity1 Systemsensor
1003Kernel Activity1 Systemsensor
1005Module Activity1 Systemsensor
1007Process Activity1 Systemsensor
2004Detection Finding2 Findingscore only
3002Authentication3 IAMsensor
4001Network Activity4 Networksensor
4003DNS Activity4 Networksensor
5001Device Inventory Info5 Discoverysensor
5002Device Config State5 Discoverysensor
6003API Activity6 Applicationcloud control plane
990001Container Lifecycle1 SystemFalak extension

type_uid

The single most important identity in the schema:

type_uid = class_uid × 100 + activity_id

It must be computed, never guessed. Core rejects an event whose type_uid does not match its class_uid and activity_id. The identity holds for the extension class too: 990001 × 100 + 1 = 99000101.

Activity ids by class

ClassActivities
1001 File System1 Create · 2 Read · 3 Update · 4 Delete · 5 Rename · 6 Set Attributes · 7 Set Security · 8 Get Attributes · 9 Get Security · 10 Encrypt · 11 Decrypt · 12 Mount · 13 Unmount · 14 Open
1003 Kernel1 Create · 2 Read · 3 Update · 4 Delete · 5 Invoke
1005 Module1 Load · 2 Unload
1007 Process1 Launch · 2 Terminate · 3 Open · 4 Inject · 5 Set User ID
2004 Detection Finding1 Create · 2 Update · 3 Close
3002 Authentication1 Logon · 2 Logoff · 3 Authentication Ticket · 4 Service Ticket
4001 Network1 Open · 2 Close · 3 Reset · 4 Fail · 5 Refuse · 6 Traffic
4003 DNS1 Query · 2 Response · 6 Traffic
6003 API1 Create · 2 Read · 3 Update · 4 Delete
990001 Container Lifecycle1 Create · 2 Start · 3 Stop · 4 Destroy · 5 Pause · 6 Resume · 7 Exec · 8 Attach

Severity

severity_id follows OCSF exactly:

idLabel
0Unknown
1Informational
2Low
3Medium
4High
5Critical
6Fatal

Base attributes

Every class embeds the same base object:

{
  "activity_id": 1,
  "category_uid": 1,
  "class_uid": 1007,
  "type_uid": 100701,
  "time": 1763458204119,
  "severity_id": 1,
  "status_id": 1,
  "metadata": {
    "version": "1.3.0",
    "product": { "name": "falak-neo-minion", "vendor_name": "Falak Neo", "version": "1.7.2" },
    "correlation_uid": "4f2c…",
    "uid": "9c2f…",
    "logged_time": 1763458204119,
    "sequence": 8412093
  },
  "device": { "uid": "…", "hostname": "…", "os": {}, "container": {}, "k8s": {} },
  "actor": { "process": {}, "user": {}, "session": {} },
  "cloud": { "provider": "aws", "region": "eu-central-1", "account": {} },
  "observables": [],
  "enrichments": []
}

Timestamps

Every OCSF timestamp is epoch milliseconds. The envelope's observed_at_ns is the exception — epoch nanoseconds, the highest-precision clock the sensor has, from which OCSF time is derived.

Falak additions

Falak adds a small number of fields inside standard classes rather than inventing classes. Each exists because a detection needed a fact the base schema does not carry.

ClassFieldMeaning
1007exec_from_memfdExecutable inode is an anonymous memfd — fileless execution
1007exec_from_tmpfsExecuted from a memory-backed filesystem
1007exec_deleted_binaryExecutable was unlinked while running
1007parent_is_container_runtimeParent is containerd-shim, runc or equivalent
1001path_classSensor-resolved sensitivity: credential, persistence, anti-forensics, staging
1001is_container_writable_layerWrite landed on the container's writable layer
4001syscallconnect vs accept4 — a netflow record cannot tell you this
4001crossed_pod_boundaryConnection left the pod network namespace
4001egress_to_internetDestination is outside RFC1918 and the cluster CIDRs

The extension class

OCSF has no container lifecycle class. Rather than bend Process Activity out of shape for CRI events, Falak registers one documented extension:

  • Extension namespace falak, extension uid 990
  • class_uid = 990001, category_uid = 1

It carries the container object, the K8s context, the init process, the mount set (with is_host_path and is_sensitive), port mappings, and the full SecurityContext including privileged, host_pid, host_network and capability adds and drops.

The mount set is what makes container-escape detection possible: a hostPath mount alone is posture, but a hostPath mount followed by an exec whose resolved inode lives on the host device is an escape in progress.

Detection Finding

2004 is emitted by core, never by a sensor. Its finding_info object carries:

  • analytics[] — the rule or model that fired, with its source repository
  • attacks[]at least one ATT&CK technique, required by Law 5
  • related_events_uids[] — the evidence chain
  • kill_chain[] — the phases the behaviour spans
{
  "class_uid": 2004,
  "finding_info": {
    "uid": "b7f1…",
    "title": "Fileless execution from an anonymous memory file descriptor",
    "analytics": [{ "uid": "1f1b8d3a-…", "type_id": 2, "source_repo": "falak" }],
    "attacks": [{ "uid": "T1620", "name": "Reflective Code Loading",
                  "tactic": { "uid": "TA0005", "name": "Defense Evasion" } }],
    "related_events_uids": ["9c2f…", "4a71…"]
  },
  "risk_score": 88,
  "confidence_id": 3
}

Something wrong or missing? Edit this page