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_uid | Name | Category | Emitted by |
|---|---|---|---|
| 1001 | File System Activity | 1 System | sensor |
| 1003 | Kernel Activity | 1 System | sensor |
| 1005 | Module Activity | 1 System | sensor |
| 1007 | Process Activity | 1 System | sensor |
| 2004 | Detection Finding | 2 Findings | core only |
| 3002 | Authentication | 3 IAM | sensor |
| 4001 | Network Activity | 4 Network | sensor |
| 4003 | DNS Activity | 4 Network | sensor |
| 5001 | Device Inventory Info | 5 Discovery | sensor |
| 5002 | Device Config State | 5 Discovery | sensor |
| 6003 | API Activity | 6 Application | cloud control plane |
| 990001 | Container Lifecycle | 1 System | Falak extension |
type_uid
The single most important identity in the schema:
type_uid = class_uid × 100 + activity_idIt 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
| Class | Activities |
|---|---|
| 1001 File System | 1 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 Kernel | 1 Create · 2 Read · 3 Update · 4 Delete · 5 Invoke |
| 1005 Module | 1 Load · 2 Unload |
| 1007 Process | 1 Launch · 2 Terminate · 3 Open · 4 Inject · 5 Set User ID |
| 2004 Detection Finding | 1 Create · 2 Update · 3 Close |
| 3002 Authentication | 1 Logon · 2 Logoff · 3 Authentication Ticket · 4 Service Ticket |
| 4001 Network | 1 Open · 2 Close · 3 Reset · 4 Fail · 5 Refuse · 6 Traffic |
| 4003 DNS | 1 Query · 2 Response · 6 Traffic |
| 6003 API | 1 Create · 2 Read · 3 Update · 4 Delete |
| 990001 Container Lifecycle | 1 Create · 2 Start · 3 Stop · 4 Destroy · 5 Pause · 6 Resume · 7 Exec · 8 Attach |
Severity
severity_id follows OCSF exactly:
| id | Label |
|---|---|
| 0 | Unknown |
| 1 | Informational |
| 2 | Low |
| 3 | Medium |
| 4 | High |
| 5 | Critical |
| 6 | Fatal |
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.
| Class | Field | Meaning |
|---|---|---|
| 1007 | exec_from_memfd | Executable inode is an anonymous memfd — fileless execution |
| 1007 | exec_from_tmpfs | Executed from a memory-backed filesystem |
| 1007 | exec_deleted_binary | Executable was unlinked while running |
| 1007 | parent_is_container_runtime | Parent is containerd-shim, runc or equivalent |
| 1001 | path_class | Sensor-resolved sensitivity: credential, persistence, anti-forensics, staging |
| 1001 | is_container_writable_layer | Write landed on the container's writable layer |
| 4001 | syscall | connect vs accept4 — a netflow record cannot tell you this |
| 4001 | crossed_pod_boundary | Connection left the pod network namespace |
| 4001 | egress_to_internet | Destination 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 uid990 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 repositoryattacks[]— at least one ATT&CK technique, required by Law 5related_events_uids[]— the evidence chainkill_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