mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-11-08 09:04:26 +08:00
feat(ocsf): validate OCSF events against exported JSON Schemas (#5019)
* feat(ocsf): add JSON Schema validator for OCSF events Add openshell-ocsf-validate, which validates an OCSF event against the JSON Schema the OCSF schema server exports for the event's version, class, and declared profiles. The exports encode required attributes, at_least_one constraints, undefined attributes, types, and enum values, so the crate delegates to the jsonschema crate and only selects the schema. The exports type type_uid only as an integer, so the crate also checks that it equals class_uid * 100 + activity_id. An exported schema covers one fixed set of profiles, so the crate vendors one export per class and profile combination that OpenShell emits, under schemas/v<version>/<class>@<profiles>.json. An event whose version or combination has no vendored schema fails with the schemas/update.sh command that vendors it. Keying on the event's version lets a new OCSF version's schemas land before the emitters switch to it. The build embeds every vendored file. Top-level container is accepted unvalidated, as OCSF does not define it at the event level (#4915). Signed-off-by: Kris Hicks <khicks@nvidia.com> * test(ocsf): validate OCSF events with openshell-ocsf-validate Replace openshell-ocsf's hand-written schema walker with openshell-ocsf-validate in the builder, producer, gateway audit and Podman e2e tests. One validate_event call now covers what the per-object validate_required_fields, validate_known_fields and validate_enum_value calls checked, and adds type checks and enum checks for every attribute. Remove the validation module and the vendored OCSF object and class schemas from openshell-ocsf. The e2e suite no longer depends on openshell-ocsf directly. Signed-off-by: Kris Hicks <khicks@nvidia.com> --------- Signed-off-by: Kris Hicks <khicks@nvidia.com>
This commit is contained in:
+1
-1
@@ -10,4 +10,4 @@ python/openshell/_proto/*_pb2.pyi linguist-generated
|
||||
crates/openshell-core/src/proto/openshell.*.rs linguist-generated
|
||||
|
||||
# Vendored OCSF schemas fetched from schema.ocsf.io
|
||||
crates/openshell-ocsf/schemas/** linguist-generated
|
||||
crates/openshell-ocsf-validate/schemas/v*/** linguist-generated
|
||||
|
||||
@@ -35,6 +35,7 @@ Do not rely on this file for a full inventory. The detailed public and contribut
|
||||
| `crates/openshell-bootstrap/` | Gateway metadata | Gateway registration metadata, auth token storage, mTLS bundle storage |
|
||||
| `crates/openshell-gateway-interceptors/` | Gateway interceptors | Intercepts and transforms configured gRPC requests at the gateway routing boundary |
|
||||
| `crates/openshell-ocsf/` | OCSF logging | OCSF v1.8.0 event types, builders, shorthand/JSONL formatters, tracing layers |
|
||||
| `crates/openshell-ocsf-validate/` | OCSF validation | Test-time validation of OCSF events against vendored OCSF JSON Schemas |
|
||||
| `crates/openshell-otel/` | OpenTelemetry support | Shared OTLP trace provider, resource, and tracing-layer construction |
|
||||
| `crates/openshell-otel-test-support/` | OpenTelemetry test support | Shared loopback OTLP collector fixture for tracing tests |
|
||||
| `crates/openshell-crypto/` | Crypto backend | Backend-neutral primitives and TLS, PKI, JWT adapters; AWS-LC implementation |
|
||||
|
||||
Generated
+250
-14
@@ -63,6 +63,7 @@ dependencies = [
|
||||
"cfg-if",
|
||||
"getrandom 0.3.4",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
]
|
||||
@@ -825,12 +826,27 @@ dependencies = [
|
||||
"bit-vec 0.6.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bit-set"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
|
||||
dependencies = [
|
||||
"bit-vec 0.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.9.1"
|
||||
@@ -946,6 +962,12 @@ dependencies = [
|
||||
"serde_repr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
@@ -968,6 +990,12 @@ version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06"
|
||||
|
||||
[[package]]
|
||||
name = "bytecount"
|
||||
version = "0.6.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.25.2"
|
||||
@@ -1705,7 +1733,7 @@ dependencies = [
|
||||
"asn1-rs 0.6.2",
|
||||
"displaydoc",
|
||||
"nom",
|
||||
"num-bigint 0.4.6",
|
||||
"num-bigint 0.4.8",
|
||||
"num-traits",
|
||||
"rusticata-macros",
|
||||
]
|
||||
@@ -1719,7 +1747,7 @@ dependencies = [
|
||||
"asn1-rs 0.7.2",
|
||||
"displaydoc",
|
||||
"nom",
|
||||
"num-bigint 0.4.6",
|
||||
"num-bigint 0.4.8",
|
||||
"num-traits",
|
||||
"rusticata-macros",
|
||||
]
|
||||
@@ -2014,6 +2042,15 @@ dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "email_address"
|
||||
version = "0.2.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encode_unicode"
|
||||
version = "1.0.0"
|
||||
@@ -2134,10 +2171,21 @@ version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"bit-set 0.5.3",
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d301f5bf187b3c295fce6468d3875037a0bccc5f6b151c63cac2f85babf21912"
|
||||
dependencies = [
|
||||
"bit-set 0.8.0",
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.4.1"
|
||||
@@ -2233,6 +2281,17 @@ dependencies = [
|
||||
"zlib-rs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fluent-uri"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e"
|
||||
dependencies = [
|
||||
"borrow-or-share",
|
||||
"ref-cast",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flume"
|
||||
version = "0.12.0"
|
||||
@@ -2271,6 +2330,16 @@ dependencies = [
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fraction"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e246562084dde8ebbcc943b261c406ce4f68e5032ec28029a251a47d6a295500"
|
||||
dependencies = [
|
||||
"num",
|
||||
"num-bigint 0.4.8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs_extra"
|
||||
version = "1.3.0"
|
||||
@@ -2427,9 +2496,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"libc",
|
||||
"r-efi 5.3.0",
|
||||
"wasip2",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3370,6 +3441,59 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f622c574a29fb3034a0a90645afee194dfedc75fc124228801b6e77041075bd1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
"data-encoding",
|
||||
"email_address",
|
||||
"fancy-regex 0.19.2",
|
||||
"fraction",
|
||||
"getrandom 0.3.4",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"jsonschema-value",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"strum 0.28.0",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a968fffd387b2ab005bf00c1851f5d26e90df05b6f7ad609ed0d620033cca5e7"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-value"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39b7670345e5ce87371339d13705dbb9276b7e3e934bbe1efa2c6734a1f65a96"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
"fraction",
|
||||
"getrandom 0.3.4",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"serde_json",
|
||||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonwebtoken"
|
||||
version = "10.3.0"
|
||||
@@ -3846,6 +3970,12 @@ dependencies = [
|
||||
"sketches-ddsketch",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74"
|
||||
|
||||
[[package]]
|
||||
name = "miette"
|
||||
version = "7.6.0"
|
||||
@@ -4050,10 +4180,24 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
name = "num"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -4087,6 +4231,21 @@ dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-cmp"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa"
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-conv"
|
||||
version = "0.2.1"
|
||||
@@ -4124,6 +4283,17 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
@@ -4771,6 +4941,7 @@ name = "openshell-ocsf"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"openshell-ocsf-validate",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_repr",
|
||||
@@ -4779,6 +4950,15 @@ dependencies = [
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openshell-ocsf-validate"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"jsonschema",
|
||||
"serde_json",
|
||||
"thiserror 2.0.20",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openshell-otel"
|
||||
version = "0.0.0"
|
||||
@@ -5036,6 +5216,7 @@ dependencies = [
|
||||
"openshell-extension-core",
|
||||
"openshell-gateway-interceptors",
|
||||
"openshell-ocsf",
|
||||
"openshell-ocsf-validate",
|
||||
"openshell-otel",
|
||||
"openshell-otel-test-support",
|
||||
"openshell-policy",
|
||||
@@ -5221,6 +5402,7 @@ dependencies = [
|
||||
"openshell-driver-vm",
|
||||
"openshell-isolation-interface",
|
||||
"openshell-ocsf",
|
||||
"openshell-ocsf-validate",
|
||||
"openshell-otel",
|
||||
"openshell-policy",
|
||||
"openshell-policy-schema",
|
||||
@@ -5270,6 +5452,7 @@ dependencies = [
|
||||
"openshell-core",
|
||||
"openshell-isolation-interface",
|
||||
"openshell-ocsf",
|
||||
"openshell-ocsf-validate",
|
||||
"openshell-sandbox-backend",
|
||||
"rand 0.10.2",
|
||||
"russh",
|
||||
@@ -6492,6 +6675,43 @@ dependencies = [
|
||||
"bitflags 2.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ref-cast"
|
||||
version = "1.0.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3"
|
||||
dependencies = [
|
||||
"ref-cast-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ref-cast-impl"
|
||||
version = "1.0.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 3.0.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "558f3855529c0a7e78a48e409fa653456e55f1b167eab4109c16a255b7727e3f"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.17.0",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
@@ -6506,9 +6726,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -6537,7 +6757,7 @@ dependencies = [
|
||||
"globset",
|
||||
"lazy_static",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint 0.4.6",
|
||||
"num-bigint 0.4.8",
|
||||
"num-traits",
|
||||
"rand 0.9.4",
|
||||
"serde",
|
||||
@@ -7446,7 +7666,7 @@ version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d"
|
||||
dependencies = [
|
||||
"num-bigint 0.4.6",
|
||||
"num-bigint 0.4.8",
|
||||
"num-traits",
|
||||
"thiserror 2.0.20",
|
||||
"time",
|
||||
@@ -7982,7 +8202,7 @@ dependencies = [
|
||||
"parking_lot",
|
||||
"rustix 1.1.4",
|
||||
"signal-hook",
|
||||
"windows-sys 0.60.2",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -8051,7 +8271,7 @@ dependencies = [
|
||||
"anyhow",
|
||||
"base64 0.22.1",
|
||||
"bitflags 2.13.2",
|
||||
"fancy-regex",
|
||||
"fancy-regex 0.11.0",
|
||||
"filedescriptor",
|
||||
"finl_unicode",
|
||||
"fixedbitset 0.4.2",
|
||||
@@ -8678,6 +8898,12 @@ version = "0.3.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-general-category"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.24"
|
||||
@@ -8817,6 +9043,16 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "uuid-simd"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
|
||||
dependencies = [
|
||||
"outref",
|
||||
"vsimd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "valuable"
|
||||
version = "0.1.1"
|
||||
@@ -9878,9 +10114,9 @@ checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5"
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
[[package]]
|
||||
name = "zopfli"
|
||||
|
||||
@@ -89,6 +89,7 @@ socket2 = "0.6"
|
||||
# Serialization
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
jsonschema = { version = "=0.58.6", default-features = false }
|
||||
serde_path_to_error = "0.1"
|
||||
serde_yml = { package = "noyalib", version = "0.0.53", default-features = false, features = ["std", "compat-serde-yaml"] }
|
||||
toml = "0.8"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[package]
|
||||
name = "openshell-ocsf-validate"
|
||||
description = "Validate OCSF events against vendored OCSF JSON Schemas"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
|
||||
[dependencies]
|
||||
jsonschema = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
thiserror = { workspace = true }
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
@@ -0,0 +1,25 @@
|
||||
# openshell-ocsf-validate
|
||||
|
||||
Validates OCSF events against JSON Schemas exported by the OCSF schema server.
|
||||
|
||||
OCSF validity depends on the profiles an event declares in `metadata.profiles`, and an exported JSON Schema covers one fixed set of profiles. `schemas/v<version>/` therefore holds one schema per event class and profile combination, named `<class>@<profile>+<profile>.json` with profiles sorted. `validate_event` picks the schema from the event's `metadata.version`, `class_uid`, and declared profiles, and fails when none is vendored.
|
||||
|
||||
The schemas check required attributes, `at_least_one` constraints, undefined attributes, types, and enum values, including the class and category identifiers. The schemas type `type_uid` only as an integer, so `validate_event` also checks that it equals `class_uid * 100 + activity_id`. The top-level `container` object is accepted although OCSF does not define it at the event level (NVIDIA/OpenShell#4915).
|
||||
|
||||
## Updating
|
||||
|
||||
When a test validates an event whose version, class, and profile combination has no vendored schema, the error prints the command that vendors it. Run it from the repository root and commit the new file:
|
||||
|
||||
```shell
|
||||
crates/openshell-ocsf-validate/schemas/update.sh crates/openshell-ocsf-validate/schemas/v1.8.0/network_activity@host+network_proxy+security_control.json
|
||||
```
|
||||
|
||||
Without arguments, `schemas/update.sh` refetches every vendored schema. The schema server takes up to a few minutes per export. The build embeds every file under `schemas/v*/`, so tests need no source checkout at run time.
|
||||
|
||||
## Changing OCSF versions
|
||||
|
||||
Each version's schemas live in their own directory, so a version change can land in steps:
|
||||
|
||||
1. Run `schemas/update.sh` with the current version's file names under `schemas/v<new>/`. Events labelled with the current version still validate against its schemas.
|
||||
2. Change `openshell_ocsf::OCSF_VERSION`. Events now validate against the new schemas.
|
||||
3. Delete the old version's directory.
|
||||
@@ -0,0 +1,48 @@
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use std::fmt::Write as _;
|
||||
use std::path::PathBuf;
|
||||
|
||||
fn main() {
|
||||
let root = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("schemas");
|
||||
println!("cargo:rerun-if-changed={}", root.display());
|
||||
|
||||
let mut files = Vec::new();
|
||||
for dir in std::fs::read_dir(&root).unwrap() {
|
||||
let dir = dir.unwrap().path();
|
||||
let Some(version) = dir
|
||||
.file_name()
|
||||
.and_then(|name| name.to_str())
|
||||
.and_then(|name| name.strip_prefix('v'))
|
||||
.map(str::to_string)
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
if !dir.is_dir() {
|
||||
continue;
|
||||
}
|
||||
for file in std::fs::read_dir(&dir).unwrap() {
|
||||
let path = file.unwrap().path();
|
||||
if path.extension().is_some_and(|ext| ext == "json") {
|
||||
files.push((version.clone(), path));
|
||||
}
|
||||
}
|
||||
}
|
||||
files.sort();
|
||||
|
||||
let mut table = String::from("&[\n");
|
||||
for (version, path) in files {
|
||||
let name = path.file_stem().unwrap().to_str().unwrap();
|
||||
writeln!(
|
||||
table,
|
||||
" ({version:?}, {name:?}, include_str!({:?})),",
|
||||
path.display().to_string()
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
table.push(']');
|
||||
|
||||
let out = PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("schemas.rs");
|
||||
std::fs::write(out, table).unwrap();
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Fetch vendored schemas from the OCSF schema server: the files given, which
|
||||
# need not exist yet, or every file under v*/. Each file is
|
||||
# `v<version>/<class>@<profile>+<profile>.json`.
|
||||
set -euo pipefail
|
||||
|
||||
fetch() {
|
||||
set -euo pipefail
|
||||
local file="$1" name version class profiles="" tmp
|
||||
name="$(basename "$file" .json)"
|
||||
version="$(basename "$(dirname "$file")")"
|
||||
version="${version#v}"
|
||||
class="${name%%@*}"
|
||||
if [[ "$name" == *@* ]]; then
|
||||
profiles="${name#*@}"
|
||||
profiles="${profiles//+/,}"
|
||||
fi
|
||||
tmp="$(mktemp)"
|
||||
curl -sSfL --retry 3 --max-time 600 \
|
||||
"https://schema.ocsf.io/schema/${version}/classes/${class}?profiles=${profiles}" \
|
||||
| python3 -m json.tool --indent 2 > "$tmp"
|
||||
chmod 644 "$tmp"
|
||||
mkdir -p "$(dirname "$file")"
|
||||
mv "$tmp" "$file"
|
||||
echo "fetched v${version}/${name}"
|
||||
}
|
||||
export -f fetch
|
||||
|
||||
if [[ $# -gt 0 ]]; then
|
||||
printf '%s\0' "$@"
|
||||
else
|
||||
find "$(cd "$(dirname "$0")" && pwd)" -path '*/v*/*.json' -print0
|
||||
fi | xargs -0 -n 1 -P 2 bash -c 'fetch "$0"'
|
||||
+8269
File diff suppressed because it is too large
Load Diff
Generated
+8134
File diff suppressed because it is too large
Load Diff
Generated
+8237
File diff suppressed because it is too large
Load Diff
+8102
File diff suppressed because it is too large
Load Diff
Generated
+8261
File diff suppressed because it is too large
Load Diff
+8126
File diff suppressed because it is too large
Load Diff
+8229
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+6851
File diff suppressed because it is too large
Load Diff
+7713
File diff suppressed because it is too large
Load Diff
+6838
File diff suppressed because it is too large
Load Diff
crates/openshell-ocsf-validate/schemas/v1.8.0/detection_finding@container+host+security_control.json
Generated
+9344
File diff suppressed because it is too large
Load Diff
Generated
+9312
File diff suppressed because it is too large
Load Diff
+7076
File diff suppressed because it is too large
Load Diff
+8322
File diff suppressed because it is too large
Load Diff
+8165
File diff suppressed because it is too large
Load Diff
Generated
+7651
File diff suppressed because it is too large
Load Diff
Generated
+8185
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,427 @@
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
//! Validate OCSF events against JSON Schemas exported by the OCSF schema
|
||||
//! server, one per event class and declared profile combination.
|
||||
|
||||
use std::sync::{LazyLock, OnceLock};
|
||||
|
||||
use serde_json::Value;
|
||||
|
||||
/// `(version, file stem, schema)` for every file under `schemas/v<version>/`.
|
||||
const SCHEMAS: &[(&str, &str, &str)] = include!(concat!(env!("OUT_DIR"), "/schemas.rs"));
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum Error {
|
||||
#[error("event has no integer class_uid")]
|
||||
MissingClassUid,
|
||||
#[error("event has no string metadata.version")]
|
||||
MissingVersion,
|
||||
#[error("no vendored schemas for OCSF {0}")]
|
||||
UnsupportedVersion(String),
|
||||
#[error(
|
||||
"no vendored OCSF {version} schema for class_uid {class_uid} with profiles {profiles:?}{}",
|
||||
vendor_hint(.file)
|
||||
)]
|
||||
UnknownSchema {
|
||||
version: String,
|
||||
class_uid: u64,
|
||||
profiles: Vec<String>,
|
||||
/// Repository path to vendor the missing schema at, when the class name is known.
|
||||
file: Option<String>,
|
||||
},
|
||||
#[error("{}", format_violations(.0))]
|
||||
Invalid(Vec<Violation>),
|
||||
}
|
||||
|
||||
/// One schema violation at a JSON pointer into the event.
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Violation {
|
||||
pub path: String,
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
const SCHEMA_DIR: &str = "crates/openshell-ocsf-validate/schemas";
|
||||
|
||||
fn vendor_hint(file: &Option<String>) -> String {
|
||||
file.as_ref()
|
||||
.map(|file| format!("; vendor it with:\n {SCHEMA_DIR}/update.sh {file}"))
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
fn format_violations(violations: &[Violation]) -> String {
|
||||
violations
|
||||
.iter()
|
||||
.map(|v| format!("{}: {}", v.path, v.message))
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n")
|
||||
}
|
||||
|
||||
struct Schema {
|
||||
version: &'static str,
|
||||
class: &'static str,
|
||||
class_uid: u64,
|
||||
profiles: Vec<String>,
|
||||
json: Value,
|
||||
validator: OnceLock<jsonschema::Validator>,
|
||||
}
|
||||
|
||||
impl Schema {
|
||||
fn validator(&self) -> &jsonschema::Validator {
|
||||
self.validator.get_or_init(|| {
|
||||
let mut json = self.json.clone();
|
||||
// OCSF defines no top-level `container`; OpenShell emits it (NVIDIA/OpenShell#4915).
|
||||
json["properties"]["container"] = Value::Bool(true);
|
||||
jsonschema::draft7::new(&json).expect("vendored schema compiles")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
static INDEX: LazyLock<Vec<Schema>> = LazyLock::new(|| {
|
||||
SCHEMAS
|
||||
.iter()
|
||||
.map(|&(version, name, data)| {
|
||||
let json: Value = serde_json::from_str(data)
|
||||
.unwrap_or_else(|e| panic!("vendored schema v{version}/{name} is not JSON: {e}"));
|
||||
let class_uid = json
|
||||
.pointer("/properties/class_uid/const")
|
||||
.and_then(Value::as_u64)
|
||||
.unwrap_or_else(|| panic!("vendored schema v{version}/{name} has no class_uid"));
|
||||
let (class, profiles) = name.split_once('@').unwrap_or((name, ""));
|
||||
let profiles = profiles
|
||||
.split('+')
|
||||
.filter(|p| !p.is_empty())
|
||||
.map(str::to_string)
|
||||
.collect();
|
||||
Schema {
|
||||
version,
|
||||
class,
|
||||
class_uid,
|
||||
profiles,
|
||||
json,
|
||||
validator: OnceLock::new(),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
});
|
||||
|
||||
/// The exported schemas type `type_uid` only as an integer, so check that it
|
||||
/// equals `class_uid * 100 + activity_id`.
|
||||
fn type_uid_violation(event: &Value, class_uid: u64) -> Option<Violation> {
|
||||
let type_uid = event.get("type_uid")?.as_u64()?;
|
||||
let activity_id = event.get("activity_id")?.as_u64()?;
|
||||
let expected = class_uid * 100 + activity_id;
|
||||
(type_uid != expected).then(|| Violation {
|
||||
path: "/type_uid".to_string(),
|
||||
message: format!(
|
||||
"{type_uid} is not class_uid * 100 + activity_id ({class_uid} * 100 + {activity_id} = {expected})"
|
||||
),
|
||||
})
|
||||
}
|
||||
|
||||
/// Validate an OCSF event against the schema for its `metadata.version`,
|
||||
/// class, and declared `metadata.profiles`.
|
||||
pub fn validate_event(event: &Value) -> Result<(), Error> {
|
||||
let class_uid = event
|
||||
.get("class_uid")
|
||||
.and_then(Value::as_u64)
|
||||
.ok_or(Error::MissingClassUid)?;
|
||||
let version = event
|
||||
.pointer("/metadata/version")
|
||||
.and_then(Value::as_str)
|
||||
.ok_or(Error::MissingVersion)?;
|
||||
if !INDEX.iter().any(|s| s.version == version) {
|
||||
return Err(Error::UnsupportedVersion(version.to_string()));
|
||||
}
|
||||
let mut profiles: Vec<String> = event
|
||||
.pointer("/metadata/profiles")
|
||||
.and_then(Value::as_array)
|
||||
.map(|p| {
|
||||
p.iter()
|
||||
.filter_map(Value::as_str)
|
||||
.map(str::to_string)
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
profiles.sort();
|
||||
|
||||
let Some(schema) = INDEX
|
||||
.iter()
|
||||
.find(|s| s.version == version && s.class_uid == class_uid && s.profiles == profiles)
|
||||
else {
|
||||
let class = INDEX
|
||||
.iter()
|
||||
.find(|s| s.class_uid == class_uid)
|
||||
.map(|s| s.class.to_string())
|
||||
.or_else(|| {
|
||||
event
|
||||
.get("class_name")
|
||||
.and_then(Value::as_str)
|
||||
.map(|name| name.to_lowercase().replace(' ', "_"))
|
||||
});
|
||||
let file = class.map(|class| {
|
||||
let stem = if profiles.is_empty() {
|
||||
class
|
||||
} else {
|
||||
format!("{class}@{}", profiles.join("+"))
|
||||
};
|
||||
format!("{SCHEMA_DIR}/v{version}/{stem}.json")
|
||||
});
|
||||
return Err(Error::UnknownSchema {
|
||||
version: version.to_string(),
|
||||
class_uid,
|
||||
profiles,
|
||||
file,
|
||||
});
|
||||
};
|
||||
let mut violations: Vec<Violation> = schema
|
||||
.validator()
|
||||
.iter_errors(event)
|
||||
.map(|e| Violation {
|
||||
path: e.instance_path().to_string(),
|
||||
message: e.to_string(),
|
||||
})
|
||||
.collect();
|
||||
violations.extend(type_uid_violation(event, class_uid));
|
||||
if violations.is_empty() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::Invalid(violations))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use serde_json::json;
|
||||
|
||||
fn base_event() -> Value {
|
||||
json!({
|
||||
"activity_id": 0,
|
||||
"category_uid": 0,
|
||||
"class_uid": 0,
|
||||
"severity_id": 1,
|
||||
"time": 1_775_014_138_811_u64,
|
||||
"type_uid": 0,
|
||||
"metadata": {
|
||||
"version": "1.8.0",
|
||||
"profiles": ["container", "host"],
|
||||
"product": {"name": "OpenShell"}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn violations(event: &Value) -> Vec<Violation> {
|
||||
match validate_event(event) {
|
||||
Err(Error::Invalid(violations)) => violations,
|
||||
other => panic!("expected violations, got {other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
fn assert_violation(event: &Value, path: &str, needle: &str) {
|
||||
let violations = violations(event);
|
||||
assert!(
|
||||
violations
|
||||
.iter()
|
||||
.any(|v| v.path == path && v.message.contains(needle)),
|
||||
"no violation at {path:?} mentioning {needle:?}: {violations:?}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn accepts_conformant_event() {
|
||||
validate_event(&base_event()).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn profile_order_does_not_matter() {
|
||||
let mut event = base_event();
|
||||
event["metadata"]["profiles"] = json!(["host", "container"]);
|
||||
validate_event(&event).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_undefined_nested_attribute() {
|
||||
let mut event = base_event();
|
||||
event["metadata"]["product"]["bogus"] = json!(1);
|
||||
assert_violation(&event, "/metadata/product", "bogus");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_attribute_of_undeclared_profile() {
|
||||
let mut event = base_event();
|
||||
event["cloud"] = json!({"provider": "aws"});
|
||||
assert_violation(&event, "", "cloud");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_missing_required_attribute() {
|
||||
let mut event = base_event();
|
||||
event.as_object_mut().unwrap().remove("time");
|
||||
assert_violation(&event, "", "time");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_unsatisfied_at_least_one() {
|
||||
let mut event = base_event();
|
||||
event["metadata"]["product"] = json!({"vendor_name": "NVIDIA"});
|
||||
violations(&event)
|
||||
.iter()
|
||||
.find(|v| v.path == "/metadata/product")
|
||||
.expect("product needs a name or uid");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_out_of_range_enum_and_wrong_type() {
|
||||
let mut event = base_event();
|
||||
event["activity_id"] = json!(42);
|
||||
event["time"] = json!("now");
|
||||
let violations = violations(&event);
|
||||
assert!(
|
||||
violations.iter().any(|v| v.path == "/activity_id"),
|
||||
"{violations:?}"
|
||||
);
|
||||
assert!(
|
||||
violations.iter().any(|v| v.path == "/time"),
|
||||
"{violations:?}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_type_uid_inconsistent_with_class_and_activity() {
|
||||
let mut event = base_event();
|
||||
event["type_uid"] = json!(999_999);
|
||||
assert_violation(&event, "/type_uid", "999999");
|
||||
|
||||
event["activity_id"] = json!(99);
|
||||
event["type_uid"] = json!(0);
|
||||
assert_violation(&event, "/type_uid", "99");
|
||||
event["type_uid"] = json!(99);
|
||||
validate_event(&event).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_category_uid_of_another_category() {
|
||||
let mut event = base_event();
|
||||
event["category_uid"] = json!(4);
|
||||
violations(&event)
|
||||
.iter()
|
||||
.find(|v| v.path == "/category_uid")
|
||||
.expect("base_event belongs to category 0");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validates_every_array_element() {
|
||||
let mut event = base_event();
|
||||
event["observables"] = json!([{"type_id": 1}, {"type_id": 1, "bogus": 1}, {}]);
|
||||
assert_violation(&event, "/observables/1", "bogus");
|
||||
assert_violation(&event, "/observables/2", "type_id");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn accepts_top_level_container() {
|
||||
let mut event = base_event();
|
||||
event["container"] = json!({"name": "sandbox", "image": {"name": "example/sandbox:test"}});
|
||||
validate_event(&event).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_profile_combination_without_vendored_schema() {
|
||||
let mut event = base_event();
|
||||
event["metadata"]["profiles"] = json!(["host"]);
|
||||
let error = validate_event(&event).unwrap_err();
|
||||
let Error::UnknownSchema {
|
||||
version,
|
||||
class_uid,
|
||||
profiles,
|
||||
file,
|
||||
} = &error
|
||||
else {
|
||||
panic!("expected UnknownSchema, got {error:?}");
|
||||
};
|
||||
assert_eq!(version, "1.8.0");
|
||||
assert_eq!(*class_uid, 0);
|
||||
assert_eq!(profiles, &["host"]);
|
||||
let expected = "crates/openshell-ocsf-validate/schemas/v1.8.0/base_event@host.json";
|
||||
assert_eq!(file.as_deref(), Some(expected));
|
||||
assert!(
|
||||
error.to_string().contains(&format!(
|
||||
"crates/openshell-ocsf-validate/schemas/update.sh {expected}"
|
||||
)),
|
||||
"{error}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn names_the_schema_file_for_an_unvendored_class_from_its_class_name() {
|
||||
let mut event = base_event();
|
||||
event["class_uid"] = json!(9999);
|
||||
event["class_name"] = json!("Made Up Activity");
|
||||
match validate_event(&event) {
|
||||
Err(Error::UnknownSchema { file, .. }) => assert_eq!(
|
||||
file.as_deref(),
|
||||
Some(
|
||||
"crates/openshell-ocsf-validate/schemas/v1.8.0/made_up_activity@container+host.json"
|
||||
)
|
||||
),
|
||||
other => panic!("expected UnknownSchema, got {other:?}"),
|
||||
}
|
||||
|
||||
event.as_object_mut().unwrap().remove("class_name");
|
||||
match validate_event(&event) {
|
||||
Err(error @ Error::UnknownSchema { file: None, .. }) => {
|
||||
assert!(!error.to_string().contains("update.sh"), "{error}");
|
||||
}
|
||||
other => panic!("expected UnknownSchema without a file, got {other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_versions_without_vendored_schemas() {
|
||||
let mut event = base_event();
|
||||
event["metadata"]["version"] = json!("1.1.0");
|
||||
assert!(
|
||||
matches!(validate_event(&event), Err(Error::UnsupportedVersion(found)) if found == "1.1.0")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_event_without_version() {
|
||||
let mut event = base_event();
|
||||
event["metadata"].as_object_mut().unwrap().remove("version");
|
||||
assert!(matches!(validate_event(&event), Err(Error::MissingVersion)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_event_without_class_uid() {
|
||||
let mut event = base_event();
|
||||
event.as_object_mut().unwrap().remove("class_uid");
|
||||
assert!(matches!(
|
||||
validate_event(&event),
|
||||
Err(Error::MissingClassUid)
|
||||
));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vendored_files_are_class_exports_named_by_sorted_profiles() {
|
||||
for (version, name, data) in SCHEMAS {
|
||||
let file = format!("v{version}/{name}");
|
||||
let schema: Value =
|
||||
serde_json::from_str(data).unwrap_or_else(|e| panic!("{file}: {e}"));
|
||||
let (class, profiles) = name.split_once('@').unwrap_or((name, ""));
|
||||
let id = schema["$id"].as_str().unwrap_or_default();
|
||||
assert!(
|
||||
id.ends_with(&format!("/classes/{class}")),
|
||||
"{file}: $id {id:?}"
|
||||
);
|
||||
assert!(
|
||||
schema
|
||||
.pointer("/properties/class_uid/const")
|
||||
.is_some_and(Value::is_u64),
|
||||
"{file}"
|
||||
);
|
||||
let profiles: Vec<&str> = profiles.split('+').filter(|p| !p.is_empty()).collect();
|
||||
assert!(profiles.is_sorted(), "{file}: profiles must be sorted");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ license.workspace = true
|
||||
repository.workspace = true
|
||||
|
||||
[features]
|
||||
# Share vendored-schema assertions with producer regression tests.
|
||||
# Share OCSF event capture and a sandbox test context with producer tests.
|
||||
test-support = []
|
||||
|
||||
[dependencies]
|
||||
@@ -24,6 +24,7 @@ uuid = { workspace = true }
|
||||
tracing-subscriber = { workspace = true }
|
||||
|
||||
[dev-dependencies]
|
||||
openshell-ocsf-validate = { path = "../openshell-ocsf-validate" }
|
||||
tracing-subscriber = { workspace = true, features = ["env-filter", "json"] }
|
||||
|
||||
[lints]
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
# Vendored OCSF Schemas
|
||||
|
||||
These schemas are vendored from the [OCSF Schema Server](https://schema.ocsf.io/)
|
||||
for offline test validation.
|
||||
|
||||
## Version
|
||||
|
||||
- **OCSF v1.8.0**, fetched from `https://schema.ocsf.io/api/1.8.0/`
|
||||
|
||||
## Contents
|
||||
|
||||
### Classes (10)
|
||||
|
||||
- `network_activity` [4001]
|
||||
- `http_activity` [4002]
|
||||
- `ssh_activity` [4007]
|
||||
- `process_activity` [1007]
|
||||
- `detection_finding` [2004]
|
||||
- `application_lifecycle` [6002]
|
||||
- `device_config_state_change` [5019]
|
||||
- `api_activity` [6003]
|
||||
- `authentication` [3002]
|
||||
- `base_event` [0]
|
||||
|
||||
### Objects (26)
|
||||
|
||||
- `metadata`, `network_endpoint`, `network_proxy`, `process`, `actor`
|
||||
- `device`, `container`, `product`, `firewall_rule`, `finding_info`
|
||||
- `evidences`, `http_request`, `http_response`, `url`, `attack`
|
||||
- `remediation`, `connection_info`, `network_connection_info`, `ai_model`,
|
||||
`api`, `user`, `service`, `os`, `resource_details`, `tactic`, `technique`
|
||||
|
||||
### Profiles (1)
|
||||
|
||||
- `ai_operation`
|
||||
|
||||
The validator loads an object schema for every object attribute an event
|
||||
carries, so a missing file fails the test with `Missing vendored schema: ...`;
|
||||
vendor that object.
|
||||
|
||||
With the `test-support` feature, the schemas are compiled into the binary
|
||||
(`src/validation/embedded.rs`), so archived test binaries run on other machines
|
||||
need no files from this directory.
|
||||
|
||||
## Updating
|
||||
|
||||
To update to a new OCSF version:
|
||||
|
||||
```bash
|
||||
VERSION=1.8.0
|
||||
DIR="v${VERSION}"
|
||||
mkdir -p "${DIR}/classes" "${DIR}/objects"
|
||||
|
||||
for class in network_activity http_activity ssh_activity process_activity \
|
||||
detection_finding application_lifecycle device_config_state_change \
|
||||
api_activity authentication base_event; do
|
||||
curl -sf "https://schema.ocsf.io/api/${VERSION}/classes/${class}" \
|
||||
| python3 -m json.tool > "${DIR}/classes/${class}.json"
|
||||
done
|
||||
|
||||
for object in metadata network_endpoint network_proxy process actor device \
|
||||
container product firewall_rule finding_info evidences \
|
||||
http_request http_response url attack remediation connection_info \
|
||||
network_connection_info ai_model api user service os resource_details tactic technique; do
|
||||
curl -sf "https://schema.ocsf.io/api/${VERSION}/objects/${object}" \
|
||||
| python3 -m json.tool > "${DIR}/objects/${object}.json"
|
||||
done
|
||||
|
||||
echo "${VERSION}" > "${DIR}/VERSION"
|
||||
```
|
||||
|
||||
After adding or removing any schema file, regenerate the embedded table:
|
||||
|
||||
```bash
|
||||
UPDATE_OCSF_EMBEDDED_SCHEMAS=1 cargo test -p openshell-ocsf embedded_schemas
|
||||
```
|
||||
|
||||
Then update `OCSF_VERSION` in `crates/openshell-ocsf/src/lib.rs` to match, run
|
||||
`cargo test -p openshell-ocsf` (`every_builder_emits_schema_conformant_events`
|
||||
reports attributes that are newly required, renamed, or undefined), and update
|
||||
the version strings in `docs/observability/ocsf-json-export.mdx`.
|
||||
|
||||
## Validating against the official OCSF server
|
||||
|
||||
The vendored-schema validator checks presence, nesting, undefined attributes,
|
||||
and profiles. It does not check value types or enum ranges. To check those,
|
||||
run the official [OCSF server](https://github.com/ocsf/ocsf-server) locally:
|
||||
|
||||
```bash
|
||||
git clone --depth 1 https://github.com/ocsf/ocsf-server.git
|
||||
podman build -t ocsf-server ocsf-server
|
||||
|
||||
# The compiler requires Python 3.14 or later.
|
||||
uv venv --python 3.14 .venv && uv pip install --python .venv/bin/python ocsf-schema-compiler
|
||||
mkdir -p compiled
|
||||
git clone --depth 1 --branch v1.8.0 https://github.com/ocsf/ocsf-schema.git ocsf-schema-v1.8.0
|
||||
.venv/bin/ocsf-schema-compiler ocsf-schema-v1.8.0 -b > compiled/ocsf-schema-v1.8.0-browser.json
|
||||
|
||||
podman run -d --name ocsf-1.8.0 -v "$PWD/compiled:/app/schemas:ro" \
|
||||
-e SCHEMA_FILE=/app/schemas/ocsf-schema-v1.8.0-browser.json \
|
||||
-p 127.0.0.1:18150:8080 ocsf-server
|
||||
```
|
||||
|
||||
Then `POST` each JSONL record to `http://127.0.0.1:18150/api/v2/validate`. A
|
||||
record is valid when the response has `"error_count": 0`; the response lists
|
||||
each problem under `errors`. Use the v2 endpoint: the older `/api/validate`
|
||||
does not report constraint failures such as `at_least_one`, so a record missing
|
||||
both endpoints can look valid.
|
||||
|
||||
To check against the hosted server instead, use
|
||||
`https://schema.ocsf.io/api/1.8.0/v2/validate`. Keep the version in the path;
|
||||
the unversioned `/api/v2/validate` validates against the latest OCSF version.
|
||||
@@ -1 +0,0 @@
|
||||
1.8.0
|
||||
@@ -1,964 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"status_code": {
|
||||
"type": "string_t",
|
||||
"description": "The event status code, as reported by the event source.<br /><br />For example, in a Windows Failed Authentication event, this would be the value of 'Failure Code', e.g. 0x18.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Code",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "required",
|
||||
"caption": "Event Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"observables": {
|
||||
"type": "object_t",
|
||||
"description": "The observables associated with the event or a finding.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "OCSF Observables FAQ",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/defining-and-using-observables.md"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Observables",
|
||||
"object_type": "observable",
|
||||
"object_name": "Observable"
|
||||
},
|
||||
"severity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "Action is required but the situation is not serious at this time.",
|
||||
"caption": "Medium"
|
||||
},
|
||||
"6": {
|
||||
"description": "An error occurred but it is too late to take remedial action.",
|
||||
"caption": "Fatal"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event/finding severity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Informational message. No action required.",
|
||||
"caption": "Informational"
|
||||
},
|
||||
"2": {
|
||||
"description": "The user decides if action is needed.",
|
||||
"caption": "Low"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event/finding severity is not mapped. See the <code>severity</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Action is required immediately.",
|
||||
"caption": "High"
|
||||
},
|
||||
"5": {
|
||||
"description": "Action is required immediately and the scope is broad.",
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "<p>The normalized identifier of the event/finding severity.</p>The normalized severity is a measurement the effort and expense required to manage and resolve an event or incident. Smaller numerical values represent lower impact events, and larger numerical values represent higher impact events.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Severity ID",
|
||||
"sibling": "severity",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"resources": {
|
||||
"type": "object_t",
|
||||
"description": "Details about resources that were affected by the activity/event.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Resources Array",
|
||||
"object_type": "resource_details",
|
||||
"object_name": "Resource Details"
|
||||
},
|
||||
"http_response": {
|
||||
"type": "object_t",
|
||||
"description": "Details about the underlying http response.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Response",
|
||||
"object_type": "http_response",
|
||||
"object_name": "HTTP Response"
|
||||
},
|
||||
"action": {
|
||||
"type": "string_t",
|
||||
"description": "The normalized caption of <code>action_id</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"message_context": {
|
||||
"type": "object_t",
|
||||
"description": "Communication context for AI system interactions including protocols, roles, clients, and session information for MCP and other AI communication systems.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Message Context",
|
||||
"object_type": "message_context",
|
||||
"profiles": [
|
||||
"ai_operation"
|
||||
],
|
||||
"object_name": "Message Context"
|
||||
},
|
||||
"start_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"enrichments": {
|
||||
"type": "object_t",
|
||||
"description": "The additional information from an external data source, which is associated with the event or a finding. For example add location information for the IP address in the DNS answers:</p><code>[{\"name\": \"answers.ip\", \"value\": \"92.24.47.250\", \"type\": \"location\", \"data\": {\"city\": \"Socotra\", \"continent\": \"Asia\", \"coordinates\": [-25.4153, 17.0743], \"country\": \"YE\", \"desc\": \"Yemen\"}}]</code>",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Enrichments",
|
||||
"object_type": "enrichment",
|
||||
"object_name": "Enrichment"
|
||||
},
|
||||
"end_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"authorizations": {
|
||||
"type": "object_t",
|
||||
"description": "Provides details about an authorization, such as authorization outcome, and any associated policies related to the activity/event.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Authorization Information",
|
||||
"object_type": "authorization",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Authorization Result"
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string_t",
|
||||
"description": "The confidence, normalized to the caption of the confidence_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"osint": {
|
||||
"type": "object_t",
|
||||
"description": "The OSINT (Open Source Intelligence) object contains details related to an indicator such as the indicator itself, related indicators, geolocation, registrar information, subdomains, analyst commentary, and other contextual information. This information can be used to further enrich a detection or finding by providing decisioning support to other analysts and engineers.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "required",
|
||||
"caption": "OSINT",
|
||||
"object_type": "osint",
|
||||
"profiles": [
|
||||
"osint"
|
||||
],
|
||||
"object_name": "OSINT"
|
||||
},
|
||||
"firewall_rule": {
|
||||
"type": "object_t",
|
||||
"description": "The firewall rule that pertains to the control that triggered the event, if applicable.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Firewall Rule",
|
||||
"object_type": "firewall_rule",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Firewall Rule"
|
||||
},
|
||||
"malware_scan_info": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the scan job that identified malware on the target system.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Malware Scan Info",
|
||||
"object_type": "malware_scan_info",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware Scan Info"
|
||||
},
|
||||
"end_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"attacks": {
|
||||
"type": "object_t",
|
||||
"description": "An array of MITRE ATT&CK\u00ae objects describing identified tactics, techniques & sub-techniques. The objects are compatible with MITRE ATLAS\u2122 tactics, techniques & sub-techniques.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "MITRE ATT&CK\u00ae",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "MITRE ATLAS",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE ATT&CK\u00ae and ATLAS\u2122 Details",
|
||||
"object_type": "attack",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
},
|
||||
"time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Event Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object_t",
|
||||
"description": "The metadata associated with the event or a finding.",
|
||||
"group": "context",
|
||||
"requirement": "required",
|
||||
"caption": "Metadata",
|
||||
"object_type": "metadata",
|
||||
"object_name": "Metadata"
|
||||
},
|
||||
"raw_data_hash": {
|
||||
"type": "object_t",
|
||||
"description": "The hash, which describes the content of the raw_data field.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Hash",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"disposition": {
|
||||
"type": "string_t",
|
||||
"description": "The disposition name, normalized to the caption of the disposition_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"device": {
|
||||
"type": "object_t",
|
||||
"description": "An addressable device, computer system or host.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Device",
|
||||
"object_type": "device",
|
||||
"profiles": [
|
||||
"host"
|
||||
],
|
||||
"object_name": "Device"
|
||||
},
|
||||
"confidence_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"description": "The normalized confidence is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The confidence is not mapped to the defined enum values. See the <code>confidence</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized confidence refers to the accuracy of the rule that created the finding. A rule with a low confidence means that the finding scope is wide and may create finding reports that may not be malicious in nature.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Confidence ID",
|
||||
"sibling": "confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"type_uid": {
|
||||
"type": "long_t",
|
||||
"enum": {
|
||||
"600300": {
|
||||
"caption": "API Activity: Unknown"
|
||||
},
|
||||
"600399": {
|
||||
"caption": "API Activity: Other"
|
||||
},
|
||||
"600301": {
|
||||
"description": "The API call in the event pertains to a 'create' activity.",
|
||||
"caption": "API Activity: Create"
|
||||
},
|
||||
"600302": {
|
||||
"description": "The API call in the event pertains to a 'read' activity.",
|
||||
"caption": "API Activity: Read"
|
||||
},
|
||||
"600303": {
|
||||
"description": "The API call in the event pertains to a 'update' activity.",
|
||||
"caption": "API Activity: Update"
|
||||
},
|
||||
"600304": {
|
||||
"description": "The API call in the event pertains to a 'delete' activity.",
|
||||
"caption": "API Activity: Delete"
|
||||
}
|
||||
},
|
||||
"description": "The event/finding type ID. It identifies the event's semantics and structure. The value is calculated by the logging system as: <code>class_uid * 100 + activity_id</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type_name",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"confidence_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The confidence score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cloud": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Cloud environment where the event or finding was created.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Cloud",
|
||||
"object_type": "cloud",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "Cloud"
|
||||
},
|
||||
"type_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding type name, as defined by the type_uid.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Type Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"trace": {
|
||||
"type": "object_t",
|
||||
"description": "The trace object contains information about distributed traces which are critical to observability and describe how requests move through a system, capturing each step's timing and status.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Trace",
|
||||
"object_type": "trace",
|
||||
"profiles": [
|
||||
"trace"
|
||||
],
|
||||
"object_name": "Trace"
|
||||
},
|
||||
"status_detail": {
|
||||
"type": "string_t",
|
||||
"description": "The status detail contains additional information about the event/finding outcome.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Detail",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"6": {
|
||||
"description": "Application Activity events report detailed information about the behavior of applications and services.",
|
||||
"uid": 6,
|
||||
"caption": "Application Activity"
|
||||
}
|
||||
},
|
||||
"description": "The category unique identifier of the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Category ID",
|
||||
"sibling": "category_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"activity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The API call in the event pertains to a 'update' activity.",
|
||||
"caption": "Update"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event activity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The API call in the event pertains to a 'create' activity.",
|
||||
"caption": "Create"
|
||||
},
|
||||
"2": {
|
||||
"description": "The API call in the event pertains to a 'read' activity.",
|
||||
"caption": "Read"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event activity is not mapped. See the <code>activity_name</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The API call in the event pertains to a 'delete' activity.",
|
||||
"caption": "Delete"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the activity that triggered the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Activity ID",
|
||||
"sibling": "activity_name",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"sibling_convention"
|
||||
]
|
||||
},
|
||||
"category_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event category name, as defined by category_uid value: <code>Application Activity</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Category",
|
||||
"type_name": "String"
|
||||
},
|
||||
"ai_model": {
|
||||
"type": "object_t",
|
||||
"description": "The AI Model object describes the characteristics of an AI/ML model. Examples include language models like GPT-4, embedding models like text-embedding-ada-002, and computer vision models like CLIP.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "AI Model",
|
||||
"object_type": "ai_model",
|
||||
"profiles": [
|
||||
"ai_operation"
|
||||
],
|
||||
"object_name": "AI Model"
|
||||
},
|
||||
"start_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"message": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the event/finding, as defined by the source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Message",
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data_size": {
|
||||
"type": "long_t",
|
||||
"description": "The size of the raw data which was transformed into an OCSF event, in bytes.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Size",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"status_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The status is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Success"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Failure"
|
||||
},
|
||||
"99": {
|
||||
"description": "The status is not mapped. See the <code>status</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the event status.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status ID",
|
||||
"sibling": "status",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event class name, as defined by class_uid value: <code>API Activity</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Class",
|
||||
"type_name": "String"
|
||||
},
|
||||
"http_request": {
|
||||
"type": "object_t",
|
||||
"description": "Details about the underlying http request.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Request",
|
||||
"object_type": "http_request",
|
||||
"object_name": "HTTP Request"
|
||||
},
|
||||
"activity_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event activity name, as defined by the activity_id.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Activity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of times that events in the same logical group occurred during the event <strong>Start Time</strong> to <strong>End Time</strong> period.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Count",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"duration": {
|
||||
"type": "long_t",
|
||||
"description": "The event duration or aggregate time, the amount of time the event covers from <code>start_time</code> to <code>end_time</code> in milliseconds.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Duration Milliseconds",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"action_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The activity was observed, but neither explicitly allowed nor denied. This is common with IDS and EDR controls that report additional information on observed behavior such as TTPs. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Logged', 'Alert', 'Detected', 'Count', etc.",
|
||||
"caption": "Observed"
|
||||
},
|
||||
"0": {
|
||||
"description": "The action was unknown. The <code>disposition_id</code> attribute may still be set to a non-unknown value, for example 'Custom Action', 'Challenge'.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The activity was allowed. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Allowed', 'Approved', 'Delayed', 'No Action', 'Count' etc.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "The attempted activity was denied. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Blocked', 'Rejected', 'Quarantined', 'Isolated', 'Dropped', 'Access Revoked, etc.",
|
||||
"caption": "Denied"
|
||||
},
|
||||
"99": {
|
||||
"description": "The action is not mapped. See the <code>action</code> attribute which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The activity was modified, adjusted, or corrected. The <code>disposition_id</code> attribute should be set appropriately, for example 'Restored', 'Corrected', 'Delayed', 'Captcha', 'Tagged'.",
|
||||
"caption": "Modified"
|
||||
}
|
||||
},
|
||||
"description": "The action taken by a control or other policy-based system leading to an outcome or disposition. An unknown action may still correspond to a known disposition. Refer to <code>disposition_id</code> for the outcome of the action.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Action ID",
|
||||
"sibling": "action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"6003": {
|
||||
"description": "API events describe general CRUD (Create, Read, Update, Delete) API activities, e.g. (AWS Cloudtrail)",
|
||||
"caption": "API Activity"
|
||||
}
|
||||
},
|
||||
"description": "The unique identifier of a class. A class describes the attributes available in an event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Class ID",
|
||||
"sibling": "class_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"unmapped": {
|
||||
"type": "object_t",
|
||||
"description": "The attributes that are not mapped to the event schema. The names and values of those attributes are specific to the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Unmapped Data",
|
||||
"object_type": "object",
|
||||
"object_name": "Object"
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level ID",
|
||||
"sibling": "risk_level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"dst_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "The network destination endpoint.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Destination Endpoint",
|
||||
"object_type": "network_endpoint",
|
||||
"object_name": "Network Endpoint"
|
||||
},
|
||||
"is_alert": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates that the event is considered to be an alertable signal. Should be set to <code>true</code> if <code>disposition_id = Alert</code> among other dispositions, and/or <code>risk_level_id</code> or <code>severity_id</code> of the event is elevated. Not all control events will be alertable, for example if <code>disposition_id = Exonerated</code> or <code>disposition_id = Allowed</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Alert",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"policy": {
|
||||
"type": "object_t",
|
||||
"description": "The policy that pertains to the control that triggered the event, if applicable. For example the name of an anti-malware policy or an access control policy.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Policy",
|
||||
"object_type": "policy",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Policy"
|
||||
},
|
||||
"risk_details": {
|
||||
"type": "string_t",
|
||||
"description": "Describes the risk associated with the finding.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Details",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"src_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "Details about the source of the activity.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Source Endpoint",
|
||||
"object_type": "network_endpoint",
|
||||
"object_name": "Network Endpoint"
|
||||
},
|
||||
"raw_data": {
|
||||
"type": "string_t",
|
||||
"description": "The raw event/finding data as received from the source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data",
|
||||
"type_name": "String"
|
||||
},
|
||||
"malware": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Malware objects, describing details about the identified malware.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Malware",
|
||||
"object_type": "malware",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware"
|
||||
},
|
||||
"actor": {
|
||||
"type": "object_t",
|
||||
"description": "The actor object describes details about the user/role/process that was the source of the activity. Note that this is not the threat actor of a campaign but may be part of a campaign.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Actor",
|
||||
"object_type": "actor",
|
||||
"profiles": null,
|
||||
"object_name": "Actor"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"status": {
|
||||
"type": "string_t",
|
||||
"description": "The event status, normalized to the caption of the status_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status",
|
||||
"type_name": "String"
|
||||
},
|
||||
"api": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about a typical API (Application Programming Interface) call.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "API Details",
|
||||
"object_type": "api",
|
||||
"profiles": null,
|
||||
"object_name": "API"
|
||||
},
|
||||
"timezone_offset": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of minutes that the reported event <code>time</code> is ahead or behind UTC, in the range -1,080 to +1,080.",
|
||||
"group": "occurrence",
|
||||
"requirement": "recommended",
|
||||
"caption": "Timezone Offset",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"severity": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding severity, normalized to the caption of the <code>severity_id</code> value. In the case of 'Other', it is defined by the source.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Severity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"disposition_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A suspicious file or other content was moved to a benign location.",
|
||||
"caption": "Quarantined"
|
||||
},
|
||||
"6": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being dropped.",
|
||||
"caption": "Dropped"
|
||||
},
|
||||
"0": {
|
||||
"description": "The disposition is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Granted access or allowed the action to the protected resource.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "Denied access or blocked the action to the protected resource.",
|
||||
"caption": "Blocked"
|
||||
},
|
||||
"99": {
|
||||
"description": "The disposition is not mapped. See the <code>disposition</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A session was isolated on the network or within a browser.",
|
||||
"caption": "Isolated"
|
||||
},
|
||||
"5": {
|
||||
"description": "A file or other content was deleted.",
|
||||
"caption": "Deleted"
|
||||
},
|
||||
"7": {
|
||||
"description": "A custom action was executed such as running of a command script. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Custom Action"
|
||||
},
|
||||
"8": {
|
||||
"description": "A request or submission was approved. For example, when a form was properly filled out and submitted. This is distinct from <code>1</code> 'Allowed'.",
|
||||
"caption": "Approved"
|
||||
},
|
||||
"9": {
|
||||
"description": "A quarantined file or other content was restored to its original location.",
|
||||
"caption": "Restored"
|
||||
},
|
||||
"10": {
|
||||
"description": "A suspicious or risky entity was deemed to no longer be suspicious (re-scored).",
|
||||
"caption": "Exonerated"
|
||||
},
|
||||
"11": {
|
||||
"description": "A corrupt file or configuration was corrected.",
|
||||
"caption": "Corrected"
|
||||
},
|
||||
"12": {
|
||||
"description": "A corrupt file or configuration was partially corrected.",
|
||||
"caption": "Partially Corrected"
|
||||
},
|
||||
"14": {
|
||||
"description": "An operation was delayed, for example if a restart was required to finish the operation.",
|
||||
"caption": "Delayed"
|
||||
},
|
||||
"15": {
|
||||
"description": "Suspicious activity or a policy violation was detected without further action.",
|
||||
"caption": "Detected"
|
||||
},
|
||||
"16": {
|
||||
"description": "The outcome of an operation had no action taken.",
|
||||
"caption": "No Action"
|
||||
},
|
||||
"17": {
|
||||
"description": "The operation or action was logged without further action.",
|
||||
"caption": "Logged"
|
||||
},
|
||||
"18": {
|
||||
"description": "A file or other entity was marked with extended attributes.",
|
||||
"caption": "Tagged"
|
||||
},
|
||||
"20": {
|
||||
"description": "Counted the request or activity but did not determine whether to allow it or block it.",
|
||||
"caption": "Count"
|
||||
},
|
||||
"21": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being reset.",
|
||||
"caption": "Reset"
|
||||
},
|
||||
"22": {
|
||||
"description": "Required the end user to solve a CAPTCHA puzzle to prove that a human being is sending the request.",
|
||||
"caption": "Captcha"
|
||||
},
|
||||
"23": {
|
||||
"description": "Ran a silent challenge that required the client session to verify that it's a browser, and not a bot.",
|
||||
"caption": "Challenge"
|
||||
},
|
||||
"24": {
|
||||
"description": "The requestor's access has been revoked due to security policy enforcements. Note: use the <code>Host</code> profile if the <code>User</code> or <code>Actor</code> requestor is not present in the event class.",
|
||||
"caption": "Access Revoked"
|
||||
},
|
||||
"25": {
|
||||
"description": "A request or submission was rejected. For example, when a form was improperly filled out and submitted. This is distinct from <code>2</code> 'Blocked'.",
|
||||
"caption": "Rejected"
|
||||
},
|
||||
"26": {
|
||||
"description": "An attempt to access a resource was denied due to an authorization check that failed. This is a more specific disposition than <code>2</code> 'Blocked' and can be complemented with the <code>authorizations</code> attribute for more detail.",
|
||||
"caption": "Unauthorized"
|
||||
},
|
||||
"27": {
|
||||
"description": "An error occurred during the processing of the activity or request. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Error"
|
||||
},
|
||||
"13": {
|
||||
"description": "A corrupt file or configuration was not corrected.",
|
||||
"caption": "Uncorrected"
|
||||
},
|
||||
"19": {
|
||||
"description": "The request or activity was detected as a threat and resulted in a notification but request was not blocked.",
|
||||
"caption": "Alert"
|
||||
}
|
||||
},
|
||||
"description": "Describes the outcome or action taken by a security control, such as access control checks, malware detections or various types of policy violations.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Disposition ID",
|
||||
"sibling": "disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "api_activity",
|
||||
"description": "API events describe general CRUD (Create, Read, Update, Delete) API activities, e.g. (AWS Cloudtrail)",
|
||||
"uid": 6003,
|
||||
"extends": "application",
|
||||
"category": "application",
|
||||
"caption": "API Activity",
|
||||
"profiles": [
|
||||
"ai_operation",
|
||||
"cloud",
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime",
|
||||
"host",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users",
|
||||
"osint",
|
||||
"security_control",
|
||||
"trace"
|
||||
],
|
||||
"category_name": "Application Activity",
|
||||
"category_uid": 6
|
||||
}
|
||||
@@ -1,931 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"status_code": {
|
||||
"type": "string_t",
|
||||
"description": "The event status code, as reported by the event source.<br /><br />For example, in a Windows Failed Authentication event, this would be the value of 'Failure Code', e.g. 0x18.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Code",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "required",
|
||||
"caption": "Event Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"observables": {
|
||||
"type": "object_t",
|
||||
"description": "The observables associated with the event or a finding.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "OCSF Observables FAQ",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/defining-and-using-observables.md"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Observables",
|
||||
"object_type": "observable",
|
||||
"object_name": "Observable"
|
||||
},
|
||||
"severity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "Action is required but the situation is not serious at this time.",
|
||||
"caption": "Medium"
|
||||
},
|
||||
"6": {
|
||||
"description": "An error occurred but it is too late to take remedial action.",
|
||||
"caption": "Fatal"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event/finding severity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Informational message. No action required.",
|
||||
"caption": "Informational"
|
||||
},
|
||||
"2": {
|
||||
"description": "The user decides if action is needed.",
|
||||
"caption": "Low"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event/finding severity is not mapped. See the <code>severity</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Action is required immediately.",
|
||||
"caption": "High"
|
||||
},
|
||||
"5": {
|
||||
"description": "Action is required immediately and the scope is broad.",
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "<p>The normalized identifier of the event/finding severity.</p>The normalized severity is a measurement the effort and expense required to manage and resolve an event or incident. Smaller numerical values represent lower impact events, and larger numerical values represent higher impact events.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Severity ID",
|
||||
"sibling": "severity",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"action": {
|
||||
"type": "string_t",
|
||||
"description": "The normalized caption of <code>action_id</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"enrichments": {
|
||||
"type": "object_t",
|
||||
"description": "The additional information from an external data source, which is associated with the event or a finding. For example add location information for the IP address in the DNS answers:</p><code>[{\"name\": \"answers.ip\", \"value\": \"92.24.47.250\", \"type\": \"location\", \"data\": {\"city\": \"Socotra\", \"continent\": \"Asia\", \"coordinates\": [-25.4153, 17.0743], \"country\": \"YE\", \"desc\": \"Yemen\"}}]</code>",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Enrichments",
|
||||
"object_type": "enrichment",
|
||||
"object_name": "Enrichment"
|
||||
},
|
||||
"end_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"authorizations": {
|
||||
"type": "object_t",
|
||||
"description": "Provides details about an authorization, such as authorization outcome, and any associated policies related to the activity/event.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Authorization Information",
|
||||
"object_type": "authorization",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Authorization Result"
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string_t",
|
||||
"description": "The confidence, normalized to the caption of the confidence_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"osint": {
|
||||
"type": "object_t",
|
||||
"description": "The OSINT (Open Source Intelligence) object contains details related to an indicator such as the indicator itself, related indicators, geolocation, registrar information, subdomains, analyst commentary, and other contextual information. This information can be used to further enrich a detection or finding by providing decisioning support to other analysts and engineers.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "required",
|
||||
"caption": "OSINT",
|
||||
"object_type": "osint",
|
||||
"profiles": [
|
||||
"osint"
|
||||
],
|
||||
"object_name": "OSINT"
|
||||
},
|
||||
"firewall_rule": {
|
||||
"type": "object_t",
|
||||
"description": "The firewall rule that pertains to the control that triggered the event, if applicable.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Firewall Rule",
|
||||
"object_type": "firewall_rule",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Firewall Rule"
|
||||
},
|
||||
"malware_scan_info": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the scan job that identified malware on the target system.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Malware Scan Info",
|
||||
"object_type": "malware_scan_info",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware Scan Info"
|
||||
},
|
||||
"end_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"attacks": {
|
||||
"type": "object_t",
|
||||
"description": "An array of MITRE ATT&CK\u00ae objects describing identified tactics, techniques & sub-techniques. The objects are compatible with MITRE ATLAS\u2122 tactics, techniques & sub-techniques.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "MITRE ATT&CK\u00ae",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "MITRE ATLAS",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE ATT&CK\u00ae and ATLAS\u2122 Details",
|
||||
"object_type": "attack",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
},
|
||||
"time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Event Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object_t",
|
||||
"description": "The metadata associated with the event or a finding.",
|
||||
"group": "context",
|
||||
"requirement": "required",
|
||||
"caption": "Metadata",
|
||||
"object_type": "metadata",
|
||||
"object_name": "Metadata"
|
||||
},
|
||||
"raw_data_hash": {
|
||||
"type": "object_t",
|
||||
"description": "The hash, which describes the content of the raw_data field.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Hash",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"disposition": {
|
||||
"type": "string_t",
|
||||
"description": "The disposition name, normalized to the caption of the disposition_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"device": {
|
||||
"type": "object_t",
|
||||
"description": "An addressable device, computer system or host.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Device",
|
||||
"object_type": "device",
|
||||
"profiles": [
|
||||
"host"
|
||||
],
|
||||
"object_name": "Device"
|
||||
},
|
||||
"app": {
|
||||
"type": "object_t",
|
||||
"description": "The application that was affected by the lifecycle event. This also applies to self-updating application systems.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Application",
|
||||
"object_type": "product",
|
||||
"object_name": "Product"
|
||||
},
|
||||
"confidence_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"description": "The normalized confidence is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The confidence is not mapped to the defined enum values. See the <code>confidence</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized confidence refers to the accuracy of the rule that created the finding. A rule with a low confidence means that the finding scope is wide and may create finding reports that may not be malicious in nature.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Confidence ID",
|
||||
"sibling": "confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"type_uid": {
|
||||
"type": "long_t",
|
||||
"enum": {
|
||||
"600200": {
|
||||
"caption": "Application Lifecycle: Unknown"
|
||||
},
|
||||
"600299": {
|
||||
"caption": "Application Lifecycle: Other"
|
||||
},
|
||||
"600201": {
|
||||
"description": "Install the application.",
|
||||
"caption": "Application Lifecycle: Install"
|
||||
},
|
||||
"600202": {
|
||||
"description": "Remove the application.",
|
||||
"caption": "Application Lifecycle: Remove"
|
||||
},
|
||||
"600203": {
|
||||
"description": "Start the application.",
|
||||
"caption": "Application Lifecycle: Start"
|
||||
},
|
||||
"600204": {
|
||||
"description": "Stop the application.",
|
||||
"caption": "Application Lifecycle: Stop"
|
||||
},
|
||||
"600205": {
|
||||
"description": "Restart the application.",
|
||||
"caption": "Application Lifecycle: Restart"
|
||||
},
|
||||
"600206": {
|
||||
"description": "Enable the application.",
|
||||
"caption": "Application Lifecycle: Enable"
|
||||
},
|
||||
"600207": {
|
||||
"description": "Disable the application.",
|
||||
"caption": "Application Lifecycle: Disable"
|
||||
},
|
||||
"600208": {
|
||||
"description": "Update the application.",
|
||||
"caption": "Application Lifecycle: Update"
|
||||
}
|
||||
},
|
||||
"description": "The event/finding type ID. It identifies the event's semantics and structure. The value is calculated by the logging system as: <code>class_uid * 100 + activity_id</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type_name",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"confidence_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The confidence score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cloud": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Cloud environment where the event or finding was created.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Cloud",
|
||||
"object_type": "cloud",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "Cloud"
|
||||
},
|
||||
"type_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding type name, as defined by the type_uid.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Type Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"status_detail": {
|
||||
"type": "string_t",
|
||||
"description": "The status detail contains additional information about the event/finding outcome.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Detail",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"6": {
|
||||
"description": "Application Activity events report detailed information about the behavior of applications and services.",
|
||||
"uid": 6,
|
||||
"caption": "Application Activity"
|
||||
}
|
||||
},
|
||||
"description": "The category unique identifier of the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Category ID",
|
||||
"sibling": "category_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"activity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "Start the application.",
|
||||
"caption": "Start"
|
||||
},
|
||||
"6": {
|
||||
"description": "Enable the application.",
|
||||
"caption": "Enable"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event activity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Install the application.",
|
||||
"caption": "Install"
|
||||
},
|
||||
"2": {
|
||||
"description": "Remove the application.",
|
||||
"caption": "Remove"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event activity is not mapped. See the <code>activity_name</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Stop the application.",
|
||||
"caption": "Stop"
|
||||
},
|
||||
"5": {
|
||||
"description": "Restart the application.",
|
||||
"caption": "Restart"
|
||||
},
|
||||
"7": {
|
||||
"description": "Disable the application.",
|
||||
"caption": "Disable"
|
||||
},
|
||||
"8": {
|
||||
"description": "Update the application.",
|
||||
"caption": "Update"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the activity that triggered the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Activity ID",
|
||||
"sibling": "activity_name",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"sibling_convention"
|
||||
]
|
||||
},
|
||||
"category_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event category name, as defined by category_uid value: <code>Application Activity</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Category",
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"message": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the event/finding, as defined by the source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Message",
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data_size": {
|
||||
"type": "long_t",
|
||||
"description": "The size of the raw data which was transformed into an OCSF event, in bytes.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Size",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"status_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The status is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Success"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Failure"
|
||||
},
|
||||
"99": {
|
||||
"description": "The status is not mapped. See the <code>status</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the event status.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status ID",
|
||||
"sibling": "status",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event class name, as defined by class_uid value: <code>Application Lifecycle</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Class",
|
||||
"type_name": "String"
|
||||
},
|
||||
"activity_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event activity name, as defined by the activity_id.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Activity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of times that events in the same logical group occurred during the event <strong>Start Time</strong> to <strong>End Time</strong> period.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Count",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"duration": {
|
||||
"type": "long_t",
|
||||
"description": "The event duration or aggregate time, the amount of time the event covers from <code>start_time</code> to <code>end_time</code> in milliseconds.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Duration Milliseconds",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"action_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The activity was observed, but neither explicitly allowed nor denied. This is common with IDS and EDR controls that report additional information on observed behavior such as TTPs. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Logged', 'Alert', 'Detected', 'Count', etc.",
|
||||
"caption": "Observed"
|
||||
},
|
||||
"0": {
|
||||
"description": "The action was unknown. The <code>disposition_id</code> attribute may still be set to a non-unknown value, for example 'Custom Action', 'Challenge'.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The activity was allowed. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Allowed', 'Approved', 'Delayed', 'No Action', 'Count' etc.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "The attempted activity was denied. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Blocked', 'Rejected', 'Quarantined', 'Isolated', 'Dropped', 'Access Revoked, etc.",
|
||||
"caption": "Denied"
|
||||
},
|
||||
"99": {
|
||||
"description": "The action is not mapped. See the <code>action</code> attribute which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The activity was modified, adjusted, or corrected. The <code>disposition_id</code> attribute should be set appropriately, for example 'Restored', 'Corrected', 'Delayed', 'Captcha', 'Tagged'.",
|
||||
"caption": "Modified"
|
||||
}
|
||||
},
|
||||
"description": "The action taken by a control or other policy-based system leading to an outcome or disposition. An unknown action may still correspond to a known disposition. Refer to <code>disposition_id</code> for the outcome of the action.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Action ID",
|
||||
"sibling": "action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"6002": {
|
||||
"description": "Application Lifecycle events report installation, removal, start, stop of an application or service.",
|
||||
"caption": "Application Lifecycle"
|
||||
}
|
||||
},
|
||||
"description": "The unique identifier of a class. A class describes the attributes available in an event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Class ID",
|
||||
"sibling": "class_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"unmapped": {
|
||||
"type": "object_t",
|
||||
"description": "The attributes that are not mapped to the event schema. The names and values of those attributes are specific to the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Unmapped Data",
|
||||
"object_type": "object",
|
||||
"object_name": "Object"
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level ID",
|
||||
"sibling": "risk_level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"is_alert": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates that the event is considered to be an alertable signal. Should be set to <code>true</code> if <code>disposition_id = Alert</code> among other dispositions, and/or <code>risk_level_id</code> or <code>severity_id</code> of the event is elevated. Not all control events will be alertable, for example if <code>disposition_id = Exonerated</code> or <code>disposition_id = Allowed</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Alert",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"policy": {
|
||||
"type": "object_t",
|
||||
"description": "The policy that pertains to the control that triggered the event, if applicable. For example the name of an anti-malware policy or an access control policy.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Policy",
|
||||
"object_type": "policy",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Policy"
|
||||
},
|
||||
"risk_details": {
|
||||
"type": "string_t",
|
||||
"description": "Describes the risk associated with the finding.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Details",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data": {
|
||||
"type": "string_t",
|
||||
"description": "The raw event/finding data as received from the source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data",
|
||||
"type_name": "String"
|
||||
},
|
||||
"malware": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Malware objects, describing details about the identified malware.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Malware",
|
||||
"object_type": "malware",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware"
|
||||
},
|
||||
"actor": {
|
||||
"type": "object_t",
|
||||
"description": "The actor object describes details about the user/role/process that was the source of the activity. Note that this is not the threat actor of a campaign but may be part of a campaign.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Actor",
|
||||
"object_type": "actor",
|
||||
"profiles": [
|
||||
"host"
|
||||
],
|
||||
"object_name": "Actor"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"status": {
|
||||
"type": "string_t",
|
||||
"description": "The event status, normalized to the caption of the status_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status",
|
||||
"type_name": "String"
|
||||
},
|
||||
"api": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about a typical API (Application Programming Interface) call.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "API Details",
|
||||
"object_type": "api",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "API"
|
||||
},
|
||||
"timezone_offset": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of minutes that the reported event <code>time</code> is ahead or behind UTC, in the range -1,080 to +1,080.",
|
||||
"group": "occurrence",
|
||||
"requirement": "recommended",
|
||||
"caption": "Timezone Offset",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"severity": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding severity, normalized to the caption of the <code>severity_id</code> value. In the case of 'Other', it is defined by the source.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Severity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"disposition_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A suspicious file or other content was moved to a benign location.",
|
||||
"caption": "Quarantined"
|
||||
},
|
||||
"6": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being dropped.",
|
||||
"caption": "Dropped"
|
||||
},
|
||||
"0": {
|
||||
"description": "The disposition is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Granted access or allowed the action to the protected resource.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "Denied access or blocked the action to the protected resource.",
|
||||
"caption": "Blocked"
|
||||
},
|
||||
"99": {
|
||||
"description": "The disposition is not mapped. See the <code>disposition</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A session was isolated on the network or within a browser.",
|
||||
"caption": "Isolated"
|
||||
},
|
||||
"5": {
|
||||
"description": "A file or other content was deleted.",
|
||||
"caption": "Deleted"
|
||||
},
|
||||
"7": {
|
||||
"description": "A custom action was executed such as running of a command script. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Custom Action"
|
||||
},
|
||||
"8": {
|
||||
"description": "A request or submission was approved. For example, when a form was properly filled out and submitted. This is distinct from <code>1</code> 'Allowed'.",
|
||||
"caption": "Approved"
|
||||
},
|
||||
"9": {
|
||||
"description": "A quarantined file or other content was restored to its original location.",
|
||||
"caption": "Restored"
|
||||
},
|
||||
"10": {
|
||||
"description": "A suspicious or risky entity was deemed to no longer be suspicious (re-scored).",
|
||||
"caption": "Exonerated"
|
||||
},
|
||||
"11": {
|
||||
"description": "A corrupt file or configuration was corrected.",
|
||||
"caption": "Corrected"
|
||||
},
|
||||
"12": {
|
||||
"description": "A corrupt file or configuration was partially corrected.",
|
||||
"caption": "Partially Corrected"
|
||||
},
|
||||
"14": {
|
||||
"description": "An operation was delayed, for example if a restart was required to finish the operation.",
|
||||
"caption": "Delayed"
|
||||
},
|
||||
"15": {
|
||||
"description": "Suspicious activity or a policy violation was detected without further action.",
|
||||
"caption": "Detected"
|
||||
},
|
||||
"16": {
|
||||
"description": "The outcome of an operation had no action taken.",
|
||||
"caption": "No Action"
|
||||
},
|
||||
"17": {
|
||||
"description": "The operation or action was logged without further action.",
|
||||
"caption": "Logged"
|
||||
},
|
||||
"18": {
|
||||
"description": "A file or other entity was marked with extended attributes.",
|
||||
"caption": "Tagged"
|
||||
},
|
||||
"20": {
|
||||
"description": "Counted the request or activity but did not determine whether to allow it or block it.",
|
||||
"caption": "Count"
|
||||
},
|
||||
"21": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being reset.",
|
||||
"caption": "Reset"
|
||||
},
|
||||
"22": {
|
||||
"description": "Required the end user to solve a CAPTCHA puzzle to prove that a human being is sending the request.",
|
||||
"caption": "Captcha"
|
||||
},
|
||||
"23": {
|
||||
"description": "Ran a silent challenge that required the client session to verify that it's a browser, and not a bot.",
|
||||
"caption": "Challenge"
|
||||
},
|
||||
"24": {
|
||||
"description": "The requestor's access has been revoked due to security policy enforcements. Note: use the <code>Host</code> profile if the <code>User</code> or <code>Actor</code> requestor is not present in the event class.",
|
||||
"caption": "Access Revoked"
|
||||
},
|
||||
"25": {
|
||||
"description": "A request or submission was rejected. For example, when a form was improperly filled out and submitted. This is distinct from <code>2</code> 'Blocked'.",
|
||||
"caption": "Rejected"
|
||||
},
|
||||
"26": {
|
||||
"description": "An attempt to access a resource was denied due to an authorization check that failed. This is a more specific disposition than <code>2</code> 'Blocked' and can be complemented with the <code>authorizations</code> attribute for more detail.",
|
||||
"caption": "Unauthorized"
|
||||
},
|
||||
"27": {
|
||||
"description": "An error occurred during the processing of the activity or request. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Error"
|
||||
},
|
||||
"13": {
|
||||
"description": "A corrupt file or configuration was not corrected.",
|
||||
"caption": "Uncorrected"
|
||||
},
|
||||
"19": {
|
||||
"description": "The request or activity was detected as a threat and resulted in a notification but request was not blocked.",
|
||||
"caption": "Alert"
|
||||
}
|
||||
},
|
||||
"description": "Describes the outcome or action taken by a security control, such as access control checks, malware detections or various types of policy violations.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Disposition ID",
|
||||
"sibling": "disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "application_lifecycle",
|
||||
"description": "Application Lifecycle events report installation, removal, start, stop of an application or service.",
|
||||
"uid": 6002,
|
||||
"extends": "application",
|
||||
"category": "application",
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:ApplicationEvent",
|
||||
"url": "https://d3fend.mitre.org/event/d3f:ApplicationEvent/"
|
||||
}
|
||||
],
|
||||
"caption": "Application Lifecycle",
|
||||
"profiles": [
|
||||
"cloud",
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime",
|
||||
"host",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users",
|
||||
"osint",
|
||||
"security_control"
|
||||
],
|
||||
"category_name": "Application Activity",
|
||||
"category_uid": 6
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,848 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"status_code": {
|
||||
"type": "string_t",
|
||||
"description": "The event status code, as reported by the event source.<br /><br />For example, in a Windows Failed Authentication event, this would be the value of 'Failure Code', e.g. 0x18.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Code",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "required",
|
||||
"caption": "Event Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"observables": {
|
||||
"type": "object_t",
|
||||
"description": "The observables associated with the event or a finding.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "OCSF Observables FAQ",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/defining-and-using-observables.md"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Observables",
|
||||
"object_type": "observable",
|
||||
"object_name": "Observable"
|
||||
},
|
||||
"severity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "Action is required but the situation is not serious at this time.",
|
||||
"caption": "Medium"
|
||||
},
|
||||
"6": {
|
||||
"description": "An error occurred but it is too late to take remedial action.",
|
||||
"caption": "Fatal"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event/finding severity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Informational message. No action required.",
|
||||
"caption": "Informational"
|
||||
},
|
||||
"2": {
|
||||
"description": "The user decides if action is needed.",
|
||||
"caption": "Low"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event/finding severity is not mapped. See the <code>severity</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Action is required immediately.",
|
||||
"caption": "High"
|
||||
},
|
||||
"5": {
|
||||
"description": "Action is required immediately and the scope is broad.",
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "<p>The normalized identifier of the event/finding severity.</p>The normalized severity is a measurement the effort and expense required to manage and resolve an event or incident. Smaller numerical values represent lower impact events, and larger numerical values represent higher impact events.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Severity ID",
|
||||
"sibling": "severity",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"action": {
|
||||
"type": "string_t",
|
||||
"description": "The normalized caption of <code>action_id</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"enrichments": {
|
||||
"type": "object_t",
|
||||
"description": "The additional information from an external data source, which is associated with the event or a finding. For example add location information for the IP address in the DNS answers:</p><code>[{\"name\": \"answers.ip\", \"value\": \"92.24.47.250\", \"type\": \"location\", \"data\": {\"city\": \"Socotra\", \"continent\": \"Asia\", \"coordinates\": [-25.4153, 17.0743], \"country\": \"YE\", \"desc\": \"Yemen\"}}]</code>",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Enrichments",
|
||||
"object_type": "enrichment",
|
||||
"object_name": "Enrichment"
|
||||
},
|
||||
"end_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"authorizations": {
|
||||
"type": "object_t",
|
||||
"description": "Provides details about an authorization, such as authorization outcome, and any associated policies related to the activity/event.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Authorization Information",
|
||||
"object_type": "authorization",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Authorization Result"
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string_t",
|
||||
"description": "The confidence, normalized to the caption of the confidence_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"osint": {
|
||||
"type": "object_t",
|
||||
"description": "The OSINT (Open Source Intelligence) object contains details related to an indicator such as the indicator itself, related indicators, geolocation, registrar information, subdomains, analyst commentary, and other contextual information. This information can be used to further enrich a detection or finding by providing decisioning support to other analysts and engineers.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "required",
|
||||
"caption": "OSINT",
|
||||
"object_type": "osint",
|
||||
"profiles": [
|
||||
"osint"
|
||||
],
|
||||
"object_name": "OSINT"
|
||||
},
|
||||
"firewall_rule": {
|
||||
"type": "object_t",
|
||||
"description": "The firewall rule that pertains to the control that triggered the event, if applicable.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Firewall Rule",
|
||||
"object_type": "firewall_rule",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Firewall Rule"
|
||||
},
|
||||
"malware_scan_info": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the scan job that identified malware on the target system.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Malware Scan Info",
|
||||
"object_type": "malware_scan_info",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware Scan Info"
|
||||
},
|
||||
"end_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"attacks": {
|
||||
"type": "object_t",
|
||||
"description": "An array of MITRE ATT&CK\u00ae objects describing identified tactics, techniques & sub-techniques. The objects are compatible with MITRE ATLAS\u2122 tactics, techniques & sub-techniques.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "MITRE ATT&CK\u00ae",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "MITRE ATLAS",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE ATT&CK\u00ae and ATLAS\u2122 Details",
|
||||
"object_type": "attack",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
},
|
||||
"time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Event Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object_t",
|
||||
"description": "The metadata associated with the event or a finding.",
|
||||
"group": "context",
|
||||
"requirement": "required",
|
||||
"caption": "Metadata",
|
||||
"object_type": "metadata",
|
||||
"object_name": "Metadata"
|
||||
},
|
||||
"raw_data_hash": {
|
||||
"type": "object_t",
|
||||
"description": "The hash, which describes the content of the raw_data field.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Hash",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"disposition": {
|
||||
"type": "string_t",
|
||||
"description": "The disposition name, normalized to the caption of the disposition_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"device": {
|
||||
"type": "object_t",
|
||||
"description": "An addressable device, computer system or host.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Device",
|
||||
"object_type": "device",
|
||||
"profiles": [
|
||||
"host"
|
||||
],
|
||||
"object_name": "Device"
|
||||
},
|
||||
"confidence_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"description": "The normalized confidence is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The confidence is not mapped to the defined enum values. See the <code>confidence</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized confidence refers to the accuracy of the rule that created the finding. A rule with a low confidence means that the finding scope is wide and may create finding reports that may not be malicious in nature.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Confidence ID",
|
||||
"sibling": "confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"type_uid": {
|
||||
"type": "long_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"caption": "Base Event: Unknown"
|
||||
},
|
||||
"99": {
|
||||
"caption": "Base Event: Other"
|
||||
}
|
||||
},
|
||||
"description": "The event/finding type ID. It identifies the event's semantics and structure. The value is calculated by the logging system as: <code>class_uid * 100 + activity_id</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type_name",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"confidence_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The confidence score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cloud": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Cloud environment where the event or finding was created.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Cloud",
|
||||
"object_type": "cloud",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "Cloud"
|
||||
},
|
||||
"type_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding type name, as defined by the type_uid.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Type Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"status_detail": {
|
||||
"type": "string_t",
|
||||
"description": "The status detail contains additional information about the event/finding outcome.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Detail",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"caption": "Uncategorized"
|
||||
}
|
||||
},
|
||||
"description": "The category unique identifier of the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Category ID",
|
||||
"sibling": "category_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"activity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The event activity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event activity is not mapped. See the <code>activity_name</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the activity that triggered the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Activity ID",
|
||||
"sibling": "activity_name",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"sibling_convention"
|
||||
]
|
||||
},
|
||||
"category_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event category name, as defined by category_uid value.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Category",
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"message": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the event/finding, as defined by the source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Message",
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data_size": {
|
||||
"type": "long_t",
|
||||
"description": "The size of the raw data which was transformed into an OCSF event, in bytes.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Size",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"status_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The status is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Success"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Failure"
|
||||
},
|
||||
"99": {
|
||||
"description": "The status is not mapped. See the <code>status</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the event status.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status ID",
|
||||
"sibling": "status",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event class name, as defined by class_uid value: <code>Base Event</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Class",
|
||||
"type_name": "String"
|
||||
},
|
||||
"activity_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event activity name, as defined by the activity_id.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Activity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of times that events in the same logical group occurred during the event <strong>Start Time</strong> to <strong>End Time</strong> period.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Count",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"duration": {
|
||||
"type": "long_t",
|
||||
"description": "The event duration or aggregate time, the amount of time the event covers from <code>start_time</code> to <code>end_time</code> in milliseconds.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Duration Milliseconds",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"action_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The activity was observed, but neither explicitly allowed nor denied. This is common with IDS and EDR controls that report additional information on observed behavior such as TTPs. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Logged', 'Alert', 'Detected', 'Count', etc.",
|
||||
"caption": "Observed"
|
||||
},
|
||||
"0": {
|
||||
"description": "The action was unknown. The <code>disposition_id</code> attribute may still be set to a non-unknown value, for example 'Custom Action', 'Challenge'.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The activity was allowed. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Allowed', 'Approved', 'Delayed', 'No Action', 'Count' etc.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "The attempted activity was denied. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Blocked', 'Rejected', 'Quarantined', 'Isolated', 'Dropped', 'Access Revoked, etc.",
|
||||
"caption": "Denied"
|
||||
},
|
||||
"99": {
|
||||
"description": "The action is not mapped. See the <code>action</code> attribute which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The activity was modified, adjusted, or corrected. The <code>disposition_id</code> attribute should be set appropriately, for example 'Restored', 'Corrected', 'Delayed', 'Captcha', 'Tagged'.",
|
||||
"caption": "Modified"
|
||||
}
|
||||
},
|
||||
"description": "The action taken by a control or other policy-based system leading to an outcome or disposition. An unknown action may still correspond to a known disposition. Refer to <code>disposition_id</code> for the outcome of the action.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Action ID",
|
||||
"sibling": "action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The base event is a generic and concrete event. It also defines a set of attributes available in most event classes. As a generic event that does not belong to any event category, it could be used to log events that are not otherwise defined by the schema.",
|
||||
"caption": "Base Event"
|
||||
}
|
||||
},
|
||||
"description": "The unique identifier of a class. A class describes the attributes available in an event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Class ID",
|
||||
"sibling": "class_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"unmapped": {
|
||||
"type": "object_t",
|
||||
"description": "The attributes that are not mapped to the event schema. The names and values of those attributes are specific to the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Unmapped Data",
|
||||
"object_type": "object",
|
||||
"object_name": "Object"
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level ID",
|
||||
"sibling": "risk_level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"is_alert": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates that the event is considered to be an alertable signal. Should be set to <code>true</code> if <code>disposition_id = Alert</code> among other dispositions, and/or <code>risk_level_id</code> or <code>severity_id</code> of the event is elevated. Not all control events will be alertable, for example if <code>disposition_id = Exonerated</code> or <code>disposition_id = Allowed</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Alert",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"policy": {
|
||||
"type": "object_t",
|
||||
"description": "The policy that pertains to the control that triggered the event, if applicable. For example the name of an anti-malware policy or an access control policy.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Policy",
|
||||
"object_type": "policy",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Policy"
|
||||
},
|
||||
"risk_details": {
|
||||
"type": "string_t",
|
||||
"description": "Describes the risk associated with the finding.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Details",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data": {
|
||||
"type": "string_t",
|
||||
"description": "The raw event/finding data as received from the source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data",
|
||||
"type_name": "String"
|
||||
},
|
||||
"malware": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Malware objects, describing details about the identified malware.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Malware",
|
||||
"object_type": "malware",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware"
|
||||
},
|
||||
"actor": {
|
||||
"type": "object_t",
|
||||
"description": "The actor object describes details about the user/role/process that was the source of the activity. Note that this is not the threat actor of a campaign but may be part of a campaign.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Actor",
|
||||
"object_type": "actor",
|
||||
"profiles": [
|
||||
"host"
|
||||
],
|
||||
"object_name": "Actor"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"status": {
|
||||
"type": "string_t",
|
||||
"description": "The event status, normalized to the caption of the status_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status",
|
||||
"type_name": "String"
|
||||
},
|
||||
"api": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about a typical API (Application Programming Interface) call.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "API Details",
|
||||
"object_type": "api",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "API"
|
||||
},
|
||||
"timezone_offset": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of minutes that the reported event <code>time</code> is ahead or behind UTC, in the range -1,080 to +1,080.",
|
||||
"group": "occurrence",
|
||||
"requirement": "recommended",
|
||||
"caption": "Timezone Offset",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"severity": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding severity, normalized to the caption of the <code>severity_id</code> value. In the case of 'Other', it is defined by the source.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Severity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"disposition_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A suspicious file or other content was moved to a benign location.",
|
||||
"caption": "Quarantined"
|
||||
},
|
||||
"6": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being dropped.",
|
||||
"caption": "Dropped"
|
||||
},
|
||||
"0": {
|
||||
"description": "The disposition is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Granted access or allowed the action to the protected resource.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "Denied access or blocked the action to the protected resource.",
|
||||
"caption": "Blocked"
|
||||
},
|
||||
"99": {
|
||||
"description": "The disposition is not mapped. See the <code>disposition</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A session was isolated on the network or within a browser.",
|
||||
"caption": "Isolated"
|
||||
},
|
||||
"5": {
|
||||
"description": "A file or other content was deleted.",
|
||||
"caption": "Deleted"
|
||||
},
|
||||
"7": {
|
||||
"description": "A custom action was executed such as running of a command script. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Custom Action"
|
||||
},
|
||||
"8": {
|
||||
"description": "A request or submission was approved. For example, when a form was properly filled out and submitted. This is distinct from <code>1</code> 'Allowed'.",
|
||||
"caption": "Approved"
|
||||
},
|
||||
"9": {
|
||||
"description": "A quarantined file or other content was restored to its original location.",
|
||||
"caption": "Restored"
|
||||
},
|
||||
"10": {
|
||||
"description": "A suspicious or risky entity was deemed to no longer be suspicious (re-scored).",
|
||||
"caption": "Exonerated"
|
||||
},
|
||||
"11": {
|
||||
"description": "A corrupt file or configuration was corrected.",
|
||||
"caption": "Corrected"
|
||||
},
|
||||
"12": {
|
||||
"description": "A corrupt file or configuration was partially corrected.",
|
||||
"caption": "Partially Corrected"
|
||||
},
|
||||
"14": {
|
||||
"description": "An operation was delayed, for example if a restart was required to finish the operation.",
|
||||
"caption": "Delayed"
|
||||
},
|
||||
"15": {
|
||||
"description": "Suspicious activity or a policy violation was detected without further action.",
|
||||
"caption": "Detected"
|
||||
},
|
||||
"16": {
|
||||
"description": "The outcome of an operation had no action taken.",
|
||||
"caption": "No Action"
|
||||
},
|
||||
"17": {
|
||||
"description": "The operation or action was logged without further action.",
|
||||
"caption": "Logged"
|
||||
},
|
||||
"18": {
|
||||
"description": "A file or other entity was marked with extended attributes.",
|
||||
"caption": "Tagged"
|
||||
},
|
||||
"20": {
|
||||
"description": "Counted the request or activity but did not determine whether to allow it or block it.",
|
||||
"caption": "Count"
|
||||
},
|
||||
"21": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being reset.",
|
||||
"caption": "Reset"
|
||||
},
|
||||
"22": {
|
||||
"description": "Required the end user to solve a CAPTCHA puzzle to prove that a human being is sending the request.",
|
||||
"caption": "Captcha"
|
||||
},
|
||||
"23": {
|
||||
"description": "Ran a silent challenge that required the client session to verify that it's a browser, and not a bot.",
|
||||
"caption": "Challenge"
|
||||
},
|
||||
"24": {
|
||||
"description": "The requestor's access has been revoked due to security policy enforcements. Note: use the <code>Host</code> profile if the <code>User</code> or <code>Actor</code> requestor is not present in the event class.",
|
||||
"caption": "Access Revoked"
|
||||
},
|
||||
"25": {
|
||||
"description": "A request or submission was rejected. For example, when a form was improperly filled out and submitted. This is distinct from <code>2</code> 'Blocked'.",
|
||||
"caption": "Rejected"
|
||||
},
|
||||
"26": {
|
||||
"description": "An attempt to access a resource was denied due to an authorization check that failed. This is a more specific disposition than <code>2</code> 'Blocked' and can be complemented with the <code>authorizations</code> attribute for more detail.",
|
||||
"caption": "Unauthorized"
|
||||
},
|
||||
"27": {
|
||||
"description": "An error occurred during the processing of the activity or request. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Error"
|
||||
},
|
||||
"13": {
|
||||
"description": "A corrupt file or configuration was not corrected.",
|
||||
"caption": "Uncorrected"
|
||||
},
|
||||
"19": {
|
||||
"description": "The request or activity was detected as a threat and resulted in a notification but request was not blocked.",
|
||||
"caption": "Alert"
|
||||
}
|
||||
},
|
||||
"description": "Describes the outcome or action taken by a security control, such as access control checks, malware detections or various types of policy violations.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Disposition ID",
|
||||
"sibling": "disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "base_event",
|
||||
"description": "The base event is a generic and concrete event. It also defines a set of attributes available in most event classes. As a generic event that does not belong to any event category, it could be used to log events that are not otherwise defined by the schema.",
|
||||
"uid": 0,
|
||||
"category": "other",
|
||||
"caption": "Base Event",
|
||||
"profiles": [
|
||||
"cloud",
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime",
|
||||
"host",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users",
|
||||
"osint",
|
||||
"security_control"
|
||||
],
|
||||
"category_uid": 0
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,987 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"state_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The Config Change state is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Config State Changed to Disabled.",
|
||||
"caption": "Disabled"
|
||||
},
|
||||
"2": {
|
||||
"description": "Config State Changed to Enabled.",
|
||||
"caption": "Enabled"
|
||||
},
|
||||
"99": {
|
||||
"description": "The Config Change is not mapped. See the <code>state</code> attribute, which contains data source specific values.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The Config Change State of the managed entity.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Config Change State ID",
|
||||
"sibling": "state",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"status_code": {
|
||||
"type": "string_t",
|
||||
"description": "The event status code, as reported by the event source.<br /><br />For example, in a Windows Failed Authentication event, this would be the value of 'Failure Code', e.g. 0x18.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Code",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"state": {
|
||||
"type": "string_t",
|
||||
"description": "The Config Change Stat, normalized to the caption of the state_id value. In the case of 'Other', it is defined by the source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Config Change State",
|
||||
"type_name": "String"
|
||||
},
|
||||
"time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "required",
|
||||
"caption": "Event Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"observables": {
|
||||
"type": "object_t",
|
||||
"description": "The observables associated with the event or a finding.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "OCSF Observables FAQ",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/defining-and-using-observables.md"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Observables",
|
||||
"object_type": "observable",
|
||||
"object_name": "Observable"
|
||||
},
|
||||
"severity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "Action is required but the situation is not serious at this time.",
|
||||
"caption": "Medium"
|
||||
},
|
||||
"6": {
|
||||
"description": "An error occurred but it is too late to take remedial action.",
|
||||
"caption": "Fatal"
|
||||
},
|
||||
"0": {
|
||||
"description": "The event/finding severity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Informational message. No action required.",
|
||||
"caption": "Informational"
|
||||
},
|
||||
"2": {
|
||||
"description": "The user decides if action is needed.",
|
||||
"caption": "Low"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event/finding severity is not mapped. See the <code>severity</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Action is required immediately.",
|
||||
"caption": "High"
|
||||
},
|
||||
"5": {
|
||||
"description": "Action is required immediately and the scope is broad.",
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "<p>The normalized identifier of the event/finding severity.</p>The normalized severity is a measurement the effort and expense required to manage and resolve an event or incident. Smaller numerical values represent lower impact events, and larger numerical values represent higher impact events.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Severity ID",
|
||||
"sibling": "severity",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"action": {
|
||||
"type": "string_t",
|
||||
"description": "The normalized caption of <code>action_id</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"enrichments": {
|
||||
"type": "object_t",
|
||||
"description": "The additional information from an external data source, which is associated with the event or a finding. For example add location information for the IP address in the DNS answers:</p><code>[{\"name\": \"answers.ip\", \"value\": \"92.24.47.250\", \"type\": \"location\", \"data\": {\"city\": \"Socotra\", \"continent\": \"Asia\", \"coordinates\": [-25.4153, 17.0743], \"country\": \"YE\", \"desc\": \"Yemen\"}}]</code>",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Enrichments",
|
||||
"object_type": "enrichment",
|
||||
"object_name": "Enrichment"
|
||||
},
|
||||
"end_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"authorizations": {
|
||||
"type": "object_t",
|
||||
"description": "Provides details about an authorization, such as authorization outcome, and any associated policies related to the activity/event.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Authorization Information",
|
||||
"object_type": "authorization",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Authorization Result"
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string_t",
|
||||
"description": "The confidence, normalized to the caption of the confidence_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"osint": {
|
||||
"type": "object_t",
|
||||
"description": "The OSINT (Open Source Intelligence) object contains details related to an indicator such as the indicator itself, related indicators, geolocation, registrar information, subdomains, analyst commentary, and other contextual information. This information can be used to further enrich a detection or finding by providing decisioning support to other analysts and engineers.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "required",
|
||||
"caption": "OSINT",
|
||||
"object_type": "osint",
|
||||
"profiles": [
|
||||
"osint"
|
||||
],
|
||||
"object_name": "OSINT"
|
||||
},
|
||||
"firewall_rule": {
|
||||
"type": "object_t",
|
||||
"description": "The firewall rule that pertains to the control that triggered the event, if applicable.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Firewall Rule",
|
||||
"object_type": "firewall_rule",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Firewall Rule"
|
||||
},
|
||||
"malware_scan_info": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the scan job that identified malware on the target system.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Malware Scan Info",
|
||||
"object_type": "malware_scan_info",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware Scan Info"
|
||||
},
|
||||
"end_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The end time of a time period, or the time of the most recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "End Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"attacks": {
|
||||
"type": "object_t",
|
||||
"description": "An array of MITRE ATT&CK\u00ae objects describing identified tactics, techniques & sub-techniques. The objects are compatible with MITRE ATLAS\u2122 tactics, techniques & sub-techniques.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "MITRE ATT&CK\u00ae",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "MITRE ATLAS",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE ATT&CK\u00ae and ATLAS\u2122 Details",
|
||||
"object_type": "attack",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
},
|
||||
"time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The normalized event occurrence time or the finding creation time.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Event Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object_t",
|
||||
"description": "The metadata associated with the event or a finding.",
|
||||
"group": "context",
|
||||
"requirement": "required",
|
||||
"caption": "Metadata",
|
||||
"object_type": "metadata",
|
||||
"object_name": "Metadata"
|
||||
},
|
||||
"raw_data_hash": {
|
||||
"type": "object_t",
|
||||
"description": "The hash, which describes the content of the raw_data field.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Hash",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"disposition": {
|
||||
"type": "string_t",
|
||||
"description": "The disposition name, normalized to the caption of the disposition_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"device": {
|
||||
"type": "object_t",
|
||||
"description": "The device that is impacted by the state change.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Device",
|
||||
"object_type": "device",
|
||||
"profiles": null,
|
||||
"object_name": "Device"
|
||||
},
|
||||
"confidence_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"description": "The normalized confidence is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The confidence is not mapped to the defined enum values. See the <code>confidence</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized confidence refers to the accuracy of the rule that created the finding. A rule with a low confidence means that the finding scope is wide and may create finding reports that may not be malicious in nature.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Confidence ID",
|
||||
"sibling": "confidence",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"type_uid": {
|
||||
"type": "long_t",
|
||||
"enum": {
|
||||
"501900": {
|
||||
"caption": "Device Config State Change: Unknown"
|
||||
},
|
||||
"501999": {
|
||||
"caption": "Device Config State Change: Other"
|
||||
},
|
||||
"501901": {
|
||||
"description": "The discovered information is via a log.",
|
||||
"caption": "Device Config State Change: Log"
|
||||
},
|
||||
"501902": {
|
||||
"description": "The discovered information is via a collection process.",
|
||||
"caption": "Device Config State Change: Collect"
|
||||
}
|
||||
},
|
||||
"description": "The event/finding type ID. It identifies the event's semantics and structure. The value is calculated by the logging system as: <code>class_uid * 100 + activity_id</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type_name",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"security_states": {
|
||||
"type": "object_t",
|
||||
"description": "The current security states of the device.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Security States",
|
||||
"object_type": "security_state",
|
||||
"object_name": "Security State"
|
||||
},
|
||||
"confidence_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The confidence score as reported by the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Confidence Score",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cloud": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Cloud environment where the event or finding was created.",
|
||||
"group": "primary",
|
||||
"requirement": "required",
|
||||
"caption": "Cloud",
|
||||
"object_type": "cloud",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "Cloud"
|
||||
},
|
||||
"type_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding type name, as defined by the type_uid.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Type Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"prev_security_states": {
|
||||
"type": "object_t",
|
||||
"description": "The previous security states of the device.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Previous Security States",
|
||||
"object_type": "security_state",
|
||||
"object_name": "Security State"
|
||||
},
|
||||
"status_detail": {
|
||||
"type": "string_t",
|
||||
"description": "The status detail contains additional information about the event/finding outcome.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status Detail",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"5": {
|
||||
"description": "Discovery events report the existence and state of devices, files, configurations, processes, registry keys, and other objects.",
|
||||
"uid": 5,
|
||||
"caption": "Discovery"
|
||||
}
|
||||
},
|
||||
"description": "The category unique identifier of the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Category ID",
|
||||
"sibling": "category_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"activity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The event activity is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The discovered information is via a log.",
|
||||
"caption": "Log"
|
||||
},
|
||||
"2": {
|
||||
"description": "The discovered information is via a collection process.",
|
||||
"caption": "Collect"
|
||||
},
|
||||
"99": {
|
||||
"description": "The event activity is not mapped. See the <code>activity_name</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the activity that triggered the event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Activity ID",
|
||||
"sibling": "activity_name",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"sibling_convention"
|
||||
]
|
||||
},
|
||||
"category_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event category name, as defined by category_uid value: <code>Discovery</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Category",
|
||||
"type_name": "String"
|
||||
},
|
||||
"start_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The start time of a time period, or the time of the least recent event included in the aggregate event.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Start Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"message": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the event/finding, as defined by the source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Message",
|
||||
"type_name": "String"
|
||||
},
|
||||
"prev_security_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "Compromised"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Secure"
|
||||
},
|
||||
"2": {
|
||||
"caption": "At Risk"
|
||||
},
|
||||
"99": {
|
||||
"description": "The security level is not mapped. See the <code>prev_security_level</code> attribute, which contains data source specific values.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The previous security level of the entity",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Previous Security Level ID",
|
||||
"sibling": "prev_security_level",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"raw_data_size": {
|
||||
"type": "long_t",
|
||||
"description": "The size of the raw data which was transformed into an OCSF event, in bytes.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data Size",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"status_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The status is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Success"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Failure"
|
||||
},
|
||||
"99": {
|
||||
"description": "The status is not mapped. See the <code>status</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the event status.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status ID",
|
||||
"sibling": "status",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event class name, as defined by class_uid value: <code>Device Config State Change</code>.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Class",
|
||||
"type_name": "String"
|
||||
},
|
||||
"security_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "Compromised"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Secure"
|
||||
},
|
||||
"2": {
|
||||
"caption": "At Risk"
|
||||
},
|
||||
"99": {
|
||||
"description": "The security level is not mapped. See the <code>security_level</code> attribute, which contains data source specific values.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The current security level of the entity",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Security Level ID",
|
||||
"sibling": "security_level",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"activity_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event activity name, as defined by the activity_id.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Activity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of times that events in the same logical group occurred during the event <strong>Start Time</strong> to <strong>End Time</strong> period.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Count",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"duration": {
|
||||
"type": "long_t",
|
||||
"description": "The event duration or aggregate time, the amount of time the event covers from <code>start_time</code> to <code>end_time</code> in milliseconds.",
|
||||
"group": "occurrence",
|
||||
"requirement": "optional",
|
||||
"caption": "Duration Milliseconds",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"action_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The activity was observed, but neither explicitly allowed nor denied. This is common with IDS and EDR controls that report additional information on observed behavior such as TTPs. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Logged', 'Alert', 'Detected', 'Count', etc.",
|
||||
"caption": "Observed"
|
||||
},
|
||||
"0": {
|
||||
"description": "The action was unknown. The <code>disposition_id</code> attribute may still be set to a non-unknown value, for example 'Custom Action', 'Challenge'.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The activity was allowed. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Allowed', 'Approved', 'Delayed', 'No Action', 'Count' etc.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "The attempted activity was denied. The <code>disposition_id</code> attribute should be set to a value that conforms to this action, for example 'Blocked', 'Rejected', 'Quarantined', 'Isolated', 'Dropped', 'Access Revoked, etc.",
|
||||
"caption": "Denied"
|
||||
},
|
||||
"99": {
|
||||
"description": "The action is not mapped. See the <code>action</code> attribute which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The activity was modified, adjusted, or corrected. The <code>disposition_id</code> attribute should be set appropriately, for example 'Restored', 'Corrected', 'Delayed', 'Captcha', 'Tagged'.",
|
||||
"caption": "Modified"
|
||||
}
|
||||
},
|
||||
"description": "The action taken by a control or other policy-based system leading to an outcome or disposition. An unknown action may still correspond to a known disposition. Refer to <code>disposition_id</code> for the outcome of the action.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Action ID",
|
||||
"sibling": "action",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"class_uid": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"5019": {
|
||||
"description": "Device Config State Change events report state changes that impact the security of the device.",
|
||||
"caption": "Device Config State Change"
|
||||
}
|
||||
},
|
||||
"description": "The unique identifier of a class. A class describes the attributes available in an event.",
|
||||
"group": "classification",
|
||||
"requirement": "required",
|
||||
"caption": "Class ID",
|
||||
"sibling": "class_name",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"unmapped": {
|
||||
"type": "object_t",
|
||||
"description": "The attributes that are not mapped to the event schema. The names and values of those attributes are specific to the event source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Unmapped Data",
|
||||
"object_type": "object",
|
||||
"object_name": "Object"
|
||||
},
|
||||
"security_level": {
|
||||
"type": "string_t",
|
||||
"description": "The current security level of the entity",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Security Level",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level ID",
|
||||
"sibling": "risk_level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"prev_security_level": {
|
||||
"type": "string_t",
|
||||
"description": "The previous security level of the entity",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Previous Security Level",
|
||||
"type_name": "String"
|
||||
},
|
||||
"is_alert": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates that the event is considered to be an alertable signal. Should be set to <code>true</code> if <code>disposition_id = Alert</code> among other dispositions, and/or <code>risk_level_id</code> or <code>severity_id</code> of the event is elevated. Not all control events will be alertable, for example if <code>disposition_id = Exonerated</code> or <code>disposition_id = Allowed</code>.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Alert",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"policy": {
|
||||
"type": "object_t",
|
||||
"description": "The policy that pertains to the control that triggered the event, if applicable. For example the name of an anti-malware policy or an access control policy.",
|
||||
"group": "primary",
|
||||
"requirement": "optional",
|
||||
"caption": "Policy",
|
||||
"object_type": "policy",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Policy"
|
||||
},
|
||||
"risk_details": {
|
||||
"type": "string_t",
|
||||
"description": "Describes the risk associated with the finding.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Details",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"raw_data": {
|
||||
"type": "string_t",
|
||||
"description": "The raw event/finding data as received from the source.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Raw Data",
|
||||
"type_name": "String"
|
||||
},
|
||||
"malware": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Malware objects, describing details about the identified malware.",
|
||||
"group": "primary",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Malware",
|
||||
"object_type": "malware",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"object_name": "Malware"
|
||||
},
|
||||
"actor": {
|
||||
"type": "object_t",
|
||||
"description": "The actor object describes details about the user/role/process that was the source of the activity. Note that this is not the threat actor of a campaign but may be part of a campaign.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Actor",
|
||||
"object_type": "actor",
|
||||
"profiles": null,
|
||||
"object_name": "Actor"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"status": {
|
||||
"type": "string_t",
|
||||
"description": "The event status, normalized to the caption of the status_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Status",
|
||||
"type_name": "String"
|
||||
},
|
||||
"api": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about a typical API (Application Programming Interface) call.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "API Details",
|
||||
"object_type": "api",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"object_name": "API"
|
||||
},
|
||||
"timezone_offset": {
|
||||
"type": "integer_t",
|
||||
"description": "The number of minutes that the reported event <code>time</code> is ahead or behind UTC, in the range -1,080 to +1,080.",
|
||||
"group": "occurrence",
|
||||
"requirement": "recommended",
|
||||
"caption": "Timezone Offset",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"severity": {
|
||||
"type": "string_t",
|
||||
"description": "The event/finding severity, normalized to the caption of the <code>severity_id</code> value. In the case of 'Other', it is defined by the source.",
|
||||
"group": "classification",
|
||||
"requirement": "optional",
|
||||
"caption": "Severity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"disposition_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A suspicious file or other content was moved to a benign location.",
|
||||
"caption": "Quarantined"
|
||||
},
|
||||
"6": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being dropped.",
|
||||
"caption": "Dropped"
|
||||
},
|
||||
"0": {
|
||||
"description": "The disposition is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Granted access or allowed the action to the protected resource.",
|
||||
"caption": "Allowed"
|
||||
},
|
||||
"2": {
|
||||
"description": "Denied access or blocked the action to the protected resource.",
|
||||
"caption": "Blocked"
|
||||
},
|
||||
"99": {
|
||||
"description": "The disposition is not mapped. See the <code>disposition</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A session was isolated on the network or within a browser.",
|
||||
"caption": "Isolated"
|
||||
},
|
||||
"5": {
|
||||
"description": "A file or other content was deleted.",
|
||||
"caption": "Deleted"
|
||||
},
|
||||
"7": {
|
||||
"description": "A custom action was executed such as running of a command script. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Custom Action"
|
||||
},
|
||||
"8": {
|
||||
"description": "A request or submission was approved. For example, when a form was properly filled out and submitted. This is distinct from <code>1</code> 'Allowed'.",
|
||||
"caption": "Approved"
|
||||
},
|
||||
"9": {
|
||||
"description": "A quarantined file or other content was restored to its original location.",
|
||||
"caption": "Restored"
|
||||
},
|
||||
"10": {
|
||||
"description": "A suspicious or risky entity was deemed to no longer be suspicious (re-scored).",
|
||||
"caption": "Exonerated"
|
||||
},
|
||||
"11": {
|
||||
"description": "A corrupt file or configuration was corrected.",
|
||||
"caption": "Corrected"
|
||||
},
|
||||
"12": {
|
||||
"description": "A corrupt file or configuration was partially corrected.",
|
||||
"caption": "Partially Corrected"
|
||||
},
|
||||
"14": {
|
||||
"description": "An operation was delayed, for example if a restart was required to finish the operation.",
|
||||
"caption": "Delayed"
|
||||
},
|
||||
"15": {
|
||||
"description": "Suspicious activity or a policy violation was detected without further action.",
|
||||
"caption": "Detected"
|
||||
},
|
||||
"16": {
|
||||
"description": "The outcome of an operation had no action taken.",
|
||||
"caption": "No Action"
|
||||
},
|
||||
"17": {
|
||||
"description": "The operation or action was logged without further action.",
|
||||
"caption": "Logged"
|
||||
},
|
||||
"18": {
|
||||
"description": "A file or other entity was marked with extended attributes.",
|
||||
"caption": "Tagged"
|
||||
},
|
||||
"20": {
|
||||
"description": "Counted the request or activity but did not determine whether to allow it or block it.",
|
||||
"caption": "Count"
|
||||
},
|
||||
"21": {
|
||||
"description": "The request was detected as a threat and resulted in the connection being reset.",
|
||||
"caption": "Reset"
|
||||
},
|
||||
"22": {
|
||||
"description": "Required the end user to solve a CAPTCHA puzzle to prove that a human being is sending the request.",
|
||||
"caption": "Captcha"
|
||||
},
|
||||
"23": {
|
||||
"description": "Ran a silent challenge that required the client session to verify that it's a browser, and not a bot.",
|
||||
"caption": "Challenge"
|
||||
},
|
||||
"24": {
|
||||
"description": "The requestor's access has been revoked due to security policy enforcements. Note: use the <code>Host</code> profile if the <code>User</code> or <code>Actor</code> requestor is not present in the event class.",
|
||||
"caption": "Access Revoked"
|
||||
},
|
||||
"25": {
|
||||
"description": "A request or submission was rejected. For example, when a form was improperly filled out and submitted. This is distinct from <code>2</code> 'Blocked'.",
|
||||
"caption": "Rejected"
|
||||
},
|
||||
"26": {
|
||||
"description": "An attempt to access a resource was denied due to an authorization check that failed. This is a more specific disposition than <code>2</code> 'Blocked' and can be complemented with the <code>authorizations</code> attribute for more detail.",
|
||||
"caption": "Unauthorized"
|
||||
},
|
||||
"27": {
|
||||
"description": "An error occurred during the processing of the activity or request. Use the <code>message</code> attribute of the base class for details.",
|
||||
"caption": "Error"
|
||||
},
|
||||
"13": {
|
||||
"description": "A corrupt file or configuration was not corrected.",
|
||||
"caption": "Uncorrected"
|
||||
},
|
||||
"19": {
|
||||
"description": "The request or activity was detected as a threat and resulted in a notification but request was not blocked.",
|
||||
"caption": "Alert"
|
||||
}
|
||||
},
|
||||
"description": "Describes the outcome or action taken by a security control, such as access control checks, malware detections or various types of policy violations.",
|
||||
"group": "primary",
|
||||
"requirement": "recommended",
|
||||
"caption": "Disposition ID",
|
||||
"sibling": "disposition",
|
||||
"profiles": [
|
||||
"security_control"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "device_config_state_change",
|
||||
"description": "Device Config State Change events report state changes that impact the security of the device.",
|
||||
"uid": 5019,
|
||||
"extends": "discovery",
|
||||
"category": "discovery",
|
||||
"caption": "Device Config State Change",
|
||||
"profiles": [
|
||||
"cloud",
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime",
|
||||
"host",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users",
|
||||
"osint",
|
||||
"security_control"
|
||||
],
|
||||
"category_name": "Discovery",
|
||||
"category_uid": 5
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,96 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"process": {
|
||||
"type": "object_t",
|
||||
"description": "The process that initiated the activity.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Process",
|
||||
"object_type": "process",
|
||||
"object_name": "Process"
|
||||
},
|
||||
"session": {
|
||||
"type": "object_t",
|
||||
"description": "The user session from which the activity was initiated.",
|
||||
"requirement": "optional",
|
||||
"caption": "Session",
|
||||
"object_type": "session",
|
||||
"object_name": "Session"
|
||||
},
|
||||
"user": {
|
||||
"type": "object_t",
|
||||
"description": "The user that initiated the activity or the user context from which the activity was initiated.",
|
||||
"requirement": "recommended",
|
||||
"caption": "User",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"app_name": {
|
||||
"type": "string_t",
|
||||
"description": "The client application or service that initiated the activity. This can be in conjunction with the <code>user</code> if present. Note that <code>app_name</code> is distinct from the <code>process</code> if present.",
|
||||
"requirement": "optional",
|
||||
"caption": "Application Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"app_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the client application or service that initiated the activity. This can be in conjunction with the <code>user</code> if present. Note that <code>app_name</code> is distinct from the <code>process.pid</code> or <code>process.uid</code> if present.",
|
||||
"requirement": "optional",
|
||||
"caption": "Application ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"authorizations": {
|
||||
"type": "object_t",
|
||||
"description": "Provides details about an authorization, such as authorization outcome, and any associated policies related to the activity/event.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Authorization Information",
|
||||
"object_type": "authorization",
|
||||
"object_name": "Authorization Result"
|
||||
},
|
||||
"idp": {
|
||||
"type": "object_t",
|
||||
"description": "This object describes details about the Identity Provider used.",
|
||||
"requirement": "optional",
|
||||
"caption": "Identity Provider",
|
||||
"object_type": "idp",
|
||||
"object_name": "Identity Provider"
|
||||
},
|
||||
"invoked_by": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the service that invoked the activity as described in the event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Invoked by",
|
||||
"type_name": "String",
|
||||
"@deprecated": {
|
||||
"message": "Use <code> app_name, app_uid </code> attributes instead.",
|
||||
"since": "1.2.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "actor",
|
||||
"description": "The Actor object contains details about the user, role, application, service, or process that initiated or performed a specific activity. Note that Actor is not the threat actor of a campaign but may be part of a campaign.",
|
||||
"extends": "object",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"process",
|
||||
"user",
|
||||
"invoked_by",
|
||||
"session",
|
||||
"app_name",
|
||||
"app_uid"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:Agent.",
|
||||
"url": "https://next.d3fend.mitre.org/agent/d3f:Agent/"
|
||||
}
|
||||
],
|
||||
"caption": "Actor",
|
||||
"profiles": [
|
||||
"container",
|
||||
"data_classification",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users"
|
||||
]
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "Human-readable model name. For example: <code>gpt-4o</code>, <code>claude-3-sonnet</code>, or <code>text-embedding-ada-002</code>.",
|
||||
"requirement": "required",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "Model version identifier. For example: <code>2024-05-13</code>, <code>v2.1.0</code>, or <code>beta</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the AI model.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"ai_provider": {
|
||||
"type": "string_t",
|
||||
"description": "AI service provider or organization name. For example: <code>OpenAI</code>, <code>Anthropic</code>, <code>Google</code>, or <code>Internal</code>.",
|
||||
"requirement": "required",
|
||||
"caption": "AI Provider",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "ai_model",
|
||||
"description": "The AI Model object describes the characteristics of an AI/ML model. Examples include language models like GPT-4, embedding models like text-embedding-ada-002, and computer vision models like CLIP.",
|
||||
"extends": "_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "AI Model Registry and Documentation Standards",
|
||||
"url": "https://huggingface.co/docs/hub/models"
|
||||
},
|
||||
{
|
||||
"description": "OpenAI Model Documentation",
|
||||
"url": "https://platform.openai.com/docs/models"
|
||||
}
|
||||
],
|
||||
"caption": "AI Model"
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the API service.",
|
||||
"requirement": "optional",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"request": {
|
||||
"type": "object_t",
|
||||
"description": "Details pertaining to the API request.",
|
||||
"requirement": "recommended",
|
||||
"caption": "API Request Details",
|
||||
"object_type": "request",
|
||||
"object_name": "Request Elements"
|
||||
},
|
||||
"service": {
|
||||
"type": "object_t",
|
||||
"description": "The information pertaining to the API service.",
|
||||
"requirement": "optional",
|
||||
"caption": "Service",
|
||||
"object_type": "service",
|
||||
"object_name": "Service"
|
||||
},
|
||||
"group": {
|
||||
"type": "object_t",
|
||||
"description": "The information pertaining to the API group.",
|
||||
"requirement": "optional",
|
||||
"caption": "Group",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"response": {
|
||||
"type": "object_t",
|
||||
"description": "Details pertaining to the API response.",
|
||||
"requirement": "recommended",
|
||||
"caption": "API Response Details",
|
||||
"object_type": "response",
|
||||
"object_name": "Response Elements"
|
||||
},
|
||||
"operation": {
|
||||
"type": "string_t",
|
||||
"description": "Verb/Operation associated with the request",
|
||||
"requirement": "required",
|
||||
"caption": "Operation",
|
||||
"type_name": "String"
|
||||
},
|
||||
"token": {
|
||||
"type": "object_t",
|
||||
"description": "The API or client token used to authenticate or authorize the API request. This attribute contains the base <code>token</code> object that represents: (1) IdP-issued client tokens (type_id: 6) such as Okta API tokens or Microsoft Entra ID Application Registration client secrets, or (2) generic API tokens/keys (type_id: 7) used for SaaS application authentication. Use this attribute when the API request was authenticated using a token that should be tracked as part of the API activity event. Note: Protocol-specific authentication tokens (Kerberos, OIDC, SAML) should be represented using <code>authentication_token</code> in authentication events, not in API activity events.",
|
||||
"requirement": "optional",
|
||||
"caption": "Token",
|
||||
"object_type": "token",
|
||||
"object_name": "Token"
|
||||
}
|
||||
},
|
||||
"name": "api",
|
||||
"description": "The API, or Application Programming Interface, object represents information pertaining to an API request and response.",
|
||||
"extends": "object",
|
||||
"caption": "API"
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The ATT&CK\u00ae or ATLAS\u2122 Matrix version.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"tactics": {
|
||||
"type": "object_t",
|
||||
"description": "The Tactic object describes the tactic ID and/or tactic name that are associated with the attack technique, as defined by <a target='_blank' href='https://attack.mitre.org/wiki/ATT&CK_Matrix'>ATT&CK\u00ae Matrix</a>.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Tactics",
|
||||
"object_type": "tactic",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>tactic</code> attribute instead.",
|
||||
"since": "1.1.0"
|
||||
},
|
||||
"object_name": "MITRE Tactic"
|
||||
},
|
||||
"technique": {
|
||||
"type": "object_t",
|
||||
"description": "The Technique object describes the MITRE ATT&CK\u00ae or ATLAS\u2122 Technique ID and/or name associated to an attack.",
|
||||
"references": [
|
||||
{
|
||||
"description": "ATT&CK\u00ae Matrix",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "ATLAS\u2122 Matrix",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "MITRE Technique",
|
||||
"object_type": "technique",
|
||||
"object_name": "MITRE Technique"
|
||||
},
|
||||
"mitigation": {
|
||||
"type": "object_t",
|
||||
"description": "The Mitigation object describes the MITRE ATT&CK\u00ae or ATLAS\u2122 Mitigation ID and/or name that is associated to an attack.",
|
||||
"references": [
|
||||
{
|
||||
"description": "ATT&CK\u00ae Matrix",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "ATLAS\u2122 Matrix",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE Mitigation",
|
||||
"object_type": "mitigation",
|
||||
"object_name": "MITRE Mitigation"
|
||||
},
|
||||
"sub_technique": {
|
||||
"type": "object_t",
|
||||
"description": "The Sub-technique object describes the MITRE ATT&CK\u00ae or ATLAS\u2122 Sub-technique ID and/or name associated to an attack.",
|
||||
"references": [
|
||||
{
|
||||
"description": "ATT&CK\u00ae Matrix",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "ATLAS\u2122 Matrix",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "MITRE Sub-technique",
|
||||
"object_type": "sub_technique",
|
||||
"object_name": "MITRE Sub-technique"
|
||||
},
|
||||
"tactic": {
|
||||
"type": "object_t",
|
||||
"description": "The Tactic object describes the MITRE ATT&CK\u00ae or ATLAS\u2122 Tactic ID and/or name that is associated to an attack.",
|
||||
"references": [
|
||||
{
|
||||
"description": "ATT&CK\u00ae Matrix",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "ATLAS\u2122 Matrix",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "MITRE Tactic",
|
||||
"object_type": "tactic",
|
||||
"object_name": "MITRE Tactic"
|
||||
}
|
||||
},
|
||||
"name": "attack",
|
||||
"description": "The MITRE ATT&CK\u00ae & ATLAS\u2122 object describes the tactic, technique, sub-technique & mitigation associated to an attack.",
|
||||
"extends": "object",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"tactic",
|
||||
"technique",
|
||||
"sub_technique"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "ATT&CK\u00ae Matrix",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "ATLAS\u2122 Matrix",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"caption": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"error": "Object connection_info not found"
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The container name.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"runtime": {
|
||||
"type": "string_t",
|
||||
"description": "The backend running the container, such as containerd or cri-o.",
|
||||
"requirement": "optional",
|
||||
"caption": "Runtime",
|
||||
"type_name": "String"
|
||||
},
|
||||
"size": {
|
||||
"type": "long_t",
|
||||
"description": "The size of the container image.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Size",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"tag": {
|
||||
"type": "string_t",
|
||||
"description": "The tag used by the container. It can indicate version, format, OS.",
|
||||
"requirement": "optional",
|
||||
"caption": "Image Tag",
|
||||
"type_name": "String",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>labels or tags</code> attribute instead.",
|
||||
"since": "1.4.0"
|
||||
}
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The full container unique identifier for this instantiation of the container. For example: <code>ac2ea168264a08f9aaca0dfc82ff3551418dfd22d02b713142a6843caa2f61bf</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"hash": {
|
||||
"type": "object_t",
|
||||
"description": "Commit hash of image created for docker or the SHA256 hash of the container. For example: <code>13550340a8681c84c861aac2e5b440161c2b33a3e4f302ac680ca5b686de48de</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hash",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"image": {
|
||||
"type": "object_t",
|
||||
"description": "The container image used as a template to run the container.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Image",
|
||||
"object_type": "image",
|
||||
"object_name": "Image"
|
||||
},
|
||||
"labels": {
|
||||
"type": "string_t",
|
||||
"description": "The list of labels associated to the container.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Labels",
|
||||
"type_name": "String"
|
||||
},
|
||||
"tags": {
|
||||
"type": "object_t",
|
||||
"description": "The list of tags; <code>{key:value}</code> pairs associated to the container.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Tags",
|
||||
"object_type": "key_value_object",
|
||||
"object_name": "Key:Value object"
|
||||
},
|
||||
"network_driver": {
|
||||
"type": "string_t",
|
||||
"description": "The network driver used by the container. For example, bridge, overlay, host, none, etc.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Driver",
|
||||
"type_name": "String"
|
||||
},
|
||||
"orchestrator": {
|
||||
"type": "string_t",
|
||||
"description": "The orchestrator managing the container, such as ECS, EKS, K8s, or OpenShift.",
|
||||
"requirement": "optional",
|
||||
"caption": "Orchestrator",
|
||||
"type_name": "String"
|
||||
},
|
||||
"pod_uuid": {
|
||||
"type": "uuid_t",
|
||||
"description": "The unique identifier of the pod (or equivalent) that the container is executing on.",
|
||||
"requirement": "optional",
|
||||
"caption": "Pod UUID",
|
||||
"type_name": "UUID"
|
||||
}
|
||||
},
|
||||
"name": "container",
|
||||
"description": "The Container object describes an instance of a specific container. A container is a prepackaged, portable system image that runs isolated on an existing system using a container runtime like containerd.",
|
||||
"extends": "object",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"uid",
|
||||
"name"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:ContainerProcess.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:ContainerProcess/"
|
||||
}
|
||||
],
|
||||
"caption": "Container",
|
||||
"observable": 27
|
||||
}
|
||||
@@ -1,642 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"imei": {
|
||||
"type": "string_t",
|
||||
"description": "The International Mobile Equipment Identity that is associated with the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "IMEI",
|
||||
"type_name": "String",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>imei_list</code> attribute instead.",
|
||||
"since": "1.4.0"
|
||||
}
|
||||
},
|
||||
"org": {
|
||||
"type": "object_t",
|
||||
"description": "Organization and org unit related to the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Organization",
|
||||
"object_type": "organization",
|
||||
"object_name": "Organization"
|
||||
},
|
||||
"last_seen_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The most recent discovery time of the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Last Seen",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"vpc_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the Virtual Private Cloud (VPC).",
|
||||
"requirement": "optional",
|
||||
"caption": "VPC UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"os": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS",
|
||||
"object_type": "os",
|
||||
"object_name": "Operating System (OS)"
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"uid_alt": {
|
||||
"type": "string_t",
|
||||
"description": "An alternate unique identifier of the device if any. For example the ActiveDirectory DN.",
|
||||
"requirement": "optional",
|
||||
"caption": "Alternate ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:LaptopComputer/'>laptop computer</a>.",
|
||||
"caption": "Laptop"
|
||||
},
|
||||
"6": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:VirtualizationSoftware/'>virtual machine</a>.",
|
||||
"caption": "Virtual"
|
||||
},
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Server/'>server</a>.",
|
||||
"caption": "Server"
|
||||
},
|
||||
"2": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:DesktopComputer/'>desktop computer</a>.",
|
||||
"caption": "Desktop"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:TabletComputer/'>tablet computer</a>.",
|
||||
"caption": "Tablet"
|
||||
},
|
||||
"5": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:MobilePhone/'>mobile phone</a>.",
|
||||
"caption": "Mobile"
|
||||
},
|
||||
"7": {
|
||||
"description": "An <a target='_blank' href='https://www.techtarget.com/iotagenda/definition/IoT-device'>IOT (Internet of Things) device</a>.",
|
||||
"caption": "IOT"
|
||||
},
|
||||
"8": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Browser/'>web browser</a>.",
|
||||
"caption": "Browser"
|
||||
},
|
||||
"9": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Firewall/'>networking firewall</a>.",
|
||||
"caption": "Firewall"
|
||||
},
|
||||
"10": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Switch/'>networking switch</a>.",
|
||||
"caption": "Switch"
|
||||
},
|
||||
"11": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Ethernet_hub'>networking hub</a>.",
|
||||
"caption": "Hub"
|
||||
},
|
||||
"12": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Router/'>networking router</a>.",
|
||||
"caption": "Router"
|
||||
},
|
||||
"14": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionPreventionSystem/'>intrusion prevention system</a>.",
|
||||
"caption": "IPS"
|
||||
},
|
||||
"15": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Load_balancing_(computing)'>Load Balancer device.</a>",
|
||||
"caption": "Load Balancer"
|
||||
},
|
||||
"13": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionDetectionSystem/'>intrusion detection system</a>.",
|
||||
"caption": "IDS"
|
||||
}
|
||||
},
|
||||
"description": "The device type ID.",
|
||||
"requirement": "required",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"is_backed_up": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates whether the device or resource has a backup enabled, such as an automated snapshot or a cloud backup. For example, this is indicated by the <code>cloudBackupEnabled</code> value within JAMF Pro mobile devices or the registration of an AWS ARN with the AWS Backup service.",
|
||||
"requirement": "optional",
|
||||
"caption": "Back Ups Configured",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"vendor_name": {
|
||||
"type": "string_t",
|
||||
"description": "The vendor for the device. For example <code>Dell</code> or <code>Lenovo</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Vendor Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"groups": {
|
||||
"type": "object_t",
|
||||
"description": "The group names to which the device belongs. For example: <code>[\"Windows Laptops\", \"Engineering\"]</code>.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Groups",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"subnet_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a virtual subnet.",
|
||||
"requirement": "optional",
|
||||
"caption": "Subnet UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"created_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the device was known to have been created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"is_shared": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a shared device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Shared Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"mac_vendor": {
|
||||
"type": "string_t",
|
||||
"description": "The vendor or manufacturer of the endpoint's network interface controller (NIC), as identified from the MAC address.",
|
||||
"references": [
|
||||
{
|
||||
"description": "IEEE Registration Authority",
|
||||
"url": "https://standards.ieee.org/products-programs/regauth/"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Vendor",
|
||||
"type_name": "String"
|
||||
},
|
||||
"owner": {
|
||||
"type": "object_t",
|
||||
"description": "The identity of the service or user account that owns the endpoint or was last logged into it.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Owner",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"vlan_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The Virtual LAN identifier.",
|
||||
"requirement": "optional",
|
||||
"caption": "VLAN",
|
||||
"type_name": "String"
|
||||
},
|
||||
"desc": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the device, ordinarily as reported by the operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "Description",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The device type. For example: <code>unknown</code>, <code>server</code>, <code>desktop</code>, <code>laptop</code>, <code>tablet</code>, <code>mobile</code>, <code>virtual</code>, <code>browser</code>, or <code>other</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"first_seen_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The initial discovery time of the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "First Seen",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"image": {
|
||||
"type": "object_t",
|
||||
"description": "The image used as a template to run the virtual machine.",
|
||||
"requirement": "optional",
|
||||
"caption": "Image",
|
||||
"object_type": "image",
|
||||
"object_name": "Image"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string_t",
|
||||
"description": "The network domain where the device resides. For example: <code>work.example.com</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Domain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"pool": {
|
||||
"type": "object_t",
|
||||
"description": "The pool of desktops or virtual machines to which the endpoint belongs.",
|
||||
"requirement": "optional",
|
||||
"caption": "Pool",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"location": {
|
||||
"type": "object_t",
|
||||
"description": "The geographical location of the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Geo Location",
|
||||
"object_type": "location",
|
||||
"object_name": "Geo Location"
|
||||
},
|
||||
"interface_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the network interface.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"model": {
|
||||
"type": "string_t",
|
||||
"description": "The model of the device. For example <code>ThinkPad X1 Carbon</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Model",
|
||||
"type_name": "String"
|
||||
},
|
||||
"modified_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the device was last known to have been modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"eid": {
|
||||
"type": "string_t",
|
||||
"description": "An Embedded Identity Document, is a unique serial number that identifies an eSIM-enabled device.",
|
||||
"requirement": "optional",
|
||||
"caption": "EID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"iccid": {
|
||||
"type": "string_t",
|
||||
"description": "The Integrated Circuit Card Identification of a mobile device. Typically it is a unique 18 to 22 digit number that identifies a SIM card.",
|
||||
"requirement": "optional",
|
||||
"caption": "ICCID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The alternate device name, ordinarily as assigned by an administrator. <p><b>Note:</b> The <b>Name</b> could be any other string that helps to identify the device, such as a phone number; for example <code>310-555-1234</code>.</p>",
|
||||
"requirement": "optional",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"namespace_pid": {
|
||||
"type": "integer_t",
|
||||
"description": "If running under a process namespace (such as in a container), the process identifier within that process namespace.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Namespace PID",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"is_trusted": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a trusted device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Trusted Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"os_machine_uuid": {
|
||||
"type": "uuid_t",
|
||||
"description": "The operating system assigned Machine ID. In Windows, this is the value stored at the registry path: <code>HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MachineGuid</code>. In Linux, this is stored in the file: <code>/etc/machine-id</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS Machine UUID",
|
||||
"type_name": "UUID"
|
||||
},
|
||||
"instance_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a VM instance.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Instance ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"boot_uid": {
|
||||
"type": "string_t",
|
||||
"description": "A unique identifier of the device that changes after every reboot. For example, the value of <code>/proc/sys/kernel/random/boot_id</code> from Linux's procfs.",
|
||||
"references": [
|
||||
{
|
||||
"description": "Linux kernel's documentation",
|
||||
"url": "https://docs.kernel.org/admin-guide/sysctl/kernel.html#random"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "Boot UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"container": {
|
||||
"type": "object_t",
|
||||
"description": "The information describing an instance of a container. A container is a prepackaged, portable system image that runs isolated on an existing system using a container runtime like containerd.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Container",
|
||||
"object_type": "container",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"object_name": "Container"
|
||||
},
|
||||
"mac": {
|
||||
"type": "mac_t",
|
||||
"description": "The Media Access Control (MAC) address of the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Address",
|
||||
"type_name": "MAC Address"
|
||||
},
|
||||
"imei_list": {
|
||||
"type": "string_t",
|
||||
"description": "The International Mobile Equipment Identity values that are associated with the device.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "IMEI List",
|
||||
"type_name": "String"
|
||||
},
|
||||
"hostname": {
|
||||
"type": "hostname_t",
|
||||
"description": "The device hostname.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hostname",
|
||||
"type_name": "Hostname"
|
||||
},
|
||||
"created_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the device was known to have been created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"is_personal": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a personal device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Personal Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"interface_name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the network interface (e.g. eth2).",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"is_supervised": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a supervised device. Devices that are supervised are typically mobile devices managed by a Mobile Device Management solution and are restricted from specific behaviors such as Apple AirDrop.",
|
||||
"requirement": "optional",
|
||||
"caption": "Supervised Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"autoscale_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the cloud autoscale configuration.",
|
||||
"requirement": "optional",
|
||||
"caption": "Autoscale UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"is_managed": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a managed device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Managed Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"modified_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the device was last known to have been modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"region": {
|
||||
"type": "string_t",
|
||||
"description": "The region where the virtual machine is located. For example, an AWS Region.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Region",
|
||||
"type_name": "String"
|
||||
},
|
||||
"zone": {
|
||||
"type": "string_t",
|
||||
"description": "The network zone or LAN segment.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Zone",
|
||||
"type_name": "String"
|
||||
},
|
||||
"is_mobile_account_active": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates whether the device has an active mobile account. For example, this is indicated by the <code>itunesStoreAccountActive</code> value within JAMF Pro mobile devices.",
|
||||
"requirement": "optional",
|
||||
"caption": "Mobile Account Active",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"boot_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time the system was booted.",
|
||||
"requirement": "optional",
|
||||
"caption": "Boot Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"subnet": {
|
||||
"type": "subnet_t",
|
||||
"description": "The subnet mask.",
|
||||
"requirement": "optional",
|
||||
"caption": "Subnet",
|
||||
"type_name": "Subnet"
|
||||
},
|
||||
"udid": {
|
||||
"type": "string_t",
|
||||
"description": "The Apple assigned Unique Device Identifier (UDID). For iOS, iPadOS, tvOS, watchOS and visionOS devices, this is the UDID. For macOS devices, it is the Provisioning UDID. For example: <code>00008020-008D4548007B4F26</code>",
|
||||
"references": [
|
||||
{
|
||||
"description": "Apple Wiki",
|
||||
"url": "https://theapplewiki.com/wiki/UDID"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "Unique Device Identifier",
|
||||
"type_name": "String"
|
||||
},
|
||||
"first_seen_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The initial discovery time of the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "First Seen",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"meid": {
|
||||
"type": "string_t",
|
||||
"description": "The Mobile Equipment Identifier. It's a unique number that identifies a Code Division Multiple Access (CDMA) mobile device.",
|
||||
"requirement": "optional",
|
||||
"caption": "MEID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"is_compliant": {
|
||||
"type": "boolean_t",
|
||||
"description": "The event occurred on a compliant device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Compliant Device",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the device. For example the Windows TargetSID or AWS EC2 ARN.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String",
|
||||
"observable": 47
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level ID",
|
||||
"sibling": "risk_level",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"hw_info": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint hardware information.",
|
||||
"requirement": "optional",
|
||||
"caption": "Hardware Info",
|
||||
"object_type": "device_hw_info",
|
||||
"object_name": "Device Hardware Info"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"type_name": "String"
|
||||
},
|
||||
"ip": {
|
||||
"type": "ip_t",
|
||||
"description": "The device IP address, in either IPv4 or IPv6 format.",
|
||||
"requirement": "optional",
|
||||
"caption": "IP Address",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"network_interfaces": {
|
||||
"type": "object_t",
|
||||
"description": "The physical or virtual network interfaces that are associated with the device, one for each unique MAC address/IP address/hostname/name combination.<p><b>Note:</b> The first element of the array is the network information that pertains to the event.</p>",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Network Interfaces",
|
||||
"object_type": "network_interface",
|
||||
"object_name": "Network Interface"
|
||||
},
|
||||
"last_seen_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The most recent discovery time of the device.",
|
||||
"requirement": "optional",
|
||||
"caption": "Last Seen",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"boot_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time the system was booted.",
|
||||
"requirement": "optional",
|
||||
"caption": "Boot Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"agent_list": {
|
||||
"type": "object_t",
|
||||
"description": "A list of <code>agent</code> objects associated with a device, endpoint, or resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Agent List",
|
||||
"object_type": "agent",
|
||||
"object_name": "Agent"
|
||||
},
|
||||
"hypervisor": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the hypervisor running on the device. For example, <code>Xen</code>, <code>VMware</code>, <code>Hyper-V</code>, <code>VirtualBox</code>, etc.",
|
||||
"requirement": "optional",
|
||||
"caption": "Hypervisor",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "device",
|
||||
"description": "The Device object represents an addressable computer system or host, which is typically connected to a computer network and participates in the transmission or processing of data within the computer network.",
|
||||
"extends": "endpoint",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"ip",
|
||||
"uid",
|
||||
"name",
|
||||
"hostname",
|
||||
"instance_uid",
|
||||
"interface_uid",
|
||||
"interface_name"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:Host.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:Host/"
|
||||
}
|
||||
],
|
||||
"caption": "Device",
|
||||
"profiles": [
|
||||
"container",
|
||||
"datetime"
|
||||
],
|
||||
"observable": 20
|
||||
}
|
||||
@@ -1,333 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"data": {
|
||||
"type": "json_t",
|
||||
"description": "Additional evidence data that is not accounted for in the specific evidence attributes.<code> Use only when absolutely necessary.</code>",
|
||||
"requirement": "optional",
|
||||
"caption": "Data",
|
||||
"type_name": "JSON"
|
||||
},
|
||||
"http_response": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the http response associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Response",
|
||||
"object_type": "http_response",
|
||||
"object_name": "HTTP Response"
|
||||
},
|
||||
"http_request": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the http request associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Request",
|
||||
"object_type": "http_request",
|
||||
"object_name": "HTTP Request"
|
||||
},
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The naming convention or type identifier of the evidence associated with the security detection. For example, the <code>@odata.type</code> from Microsoft Graph Alerts V2 or <code>display_name</code> from CrowdStrike Falcon Incident Behaviors.",
|
||||
"requirement": "optional",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"process": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the process associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Process",
|
||||
"object_type": "process",
|
||||
"object_name": "Process"
|
||||
},
|
||||
"file": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the file associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "File",
|
||||
"object_type": "file",
|
||||
"object_name": "File"
|
||||
},
|
||||
"user": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the user that was the target or somehow else associated with the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "User",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"script": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the script that was associated with the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Script",
|
||||
"object_type": "script",
|
||||
"object_name": "Script"
|
||||
},
|
||||
"device": {
|
||||
"type": "object_t",
|
||||
"description": "An addressable device, computer system or host associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Device",
|
||||
"object_type": "device",
|
||||
"object_name": "Device"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the evidence associated with the security detection. For example, the <code>activity_id</code> from CrowdStrike Falcon Alerts or <code>behavior_id</code> from CrowdStrike Falcon Incident Behaviors.",
|
||||
"requirement": "optional",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"query": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the DNS query associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "DNS Query",
|
||||
"object_type": "dns_query",
|
||||
"object_name": "DNS Query"
|
||||
},
|
||||
"connection_info": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the network connection associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Connection Info",
|
||||
"object_type": "network_connection_info",
|
||||
"object_name": "Network Connection Information"
|
||||
},
|
||||
"url": {
|
||||
"type": "object_t",
|
||||
"description": "The URL object that pertains to the event or object associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "URL",
|
||||
"object_type": "url",
|
||||
"object_name": "Uniform Resource Locator"
|
||||
},
|
||||
"email": {
|
||||
"type": "object_t",
|
||||
"description": "The email object associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Email",
|
||||
"object_type": "email",
|
||||
"object_name": "Email"
|
||||
},
|
||||
"tls": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Transport Layer Security (TLS) activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "TLS",
|
||||
"object_type": "tls",
|
||||
"object_name": "Transport Layer Security (TLS)"
|
||||
},
|
||||
"api": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the API call associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "API Details",
|
||||
"object_type": "api",
|
||||
"object_name": "API"
|
||||
},
|
||||
"resources": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the cloud resources directly related to activity that triggered the detection. For resources impacted by the detection, use <code>Affected Resources</code> at the top-level of the finding.",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Cloud Resources",
|
||||
"object_type": "resource_details",
|
||||
"object_name": "Resource Details"
|
||||
},
|
||||
"actor": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the user/role/process that was the source of the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Actor",
|
||||
"object_type": "actor",
|
||||
"object_name": "Actor"
|
||||
},
|
||||
"container": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the container associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Container",
|
||||
"object_type": "container",
|
||||
"object_name": "Container"
|
||||
},
|
||||
"database": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the database associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Database",
|
||||
"object_type": "database",
|
||||
"object_name": "Database"
|
||||
},
|
||||
"databucket": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the databucket associated to the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Databucket",
|
||||
"object_type": "databucket",
|
||||
"object_name": "Databucket"
|
||||
},
|
||||
"dst_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the destination of the network activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Destination Endpoint",
|
||||
"object_type": "network_endpoint",
|
||||
"object_name": "Network Endpoint"
|
||||
},
|
||||
"ja4_fingerprint_list": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the JA4+ fingerprints that triggered the detection.",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "JA4+ Fingerprints",
|
||||
"object_type": "ja4_fingerprint",
|
||||
"object_name": "JA4+ Fingerprint"
|
||||
},
|
||||
"job": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the scheduled job that was associated with the activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Job",
|
||||
"object_type": "job",
|
||||
"object_name": "Job"
|
||||
},
|
||||
"src_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the source of the network activity that triggered the detection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Source Endpoint",
|
||||
"object_type": "network_endpoint",
|
||||
"object_name": "Network Endpoint"
|
||||
},
|
||||
"verdict": {
|
||||
"type": "string_t",
|
||||
"description": "The normalized verdict of the evidence associated with the security detection. ",
|
||||
"requirement": "optional",
|
||||
"caption": "Verdict",
|
||||
"type_name": "String"
|
||||
},
|
||||
"verdict_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The verdict for the evidence is that is should be Disregarded.",
|
||||
"caption": "Disregard"
|
||||
},
|
||||
"6": {
|
||||
"description": "The evidence is part of a Test, or other sanctioned behavior(s).",
|
||||
"caption": "Test"
|
||||
},
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The verdict for the evidence has been identified as a False Positive.",
|
||||
"caption": "False Positive"
|
||||
},
|
||||
"2": {
|
||||
"description": "The verdict for the evidence has been identified as a True Positive.",
|
||||
"caption": "True Positive"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The verdict for the evidence is that the behavior has been identified as Suspicious.",
|
||||
"caption": "Suspicious"
|
||||
},
|
||||
"5": {
|
||||
"description": "The verdict for the evidence is that the behavior has been identified as Benign.",
|
||||
"caption": "Benign"
|
||||
},
|
||||
"7": {
|
||||
"description": "There is insufficient data to render a verdict on the evidence.",
|
||||
"caption": "Insufficient Data"
|
||||
},
|
||||
"8": {
|
||||
"description": "The verdict for the evidence is that the behavior has been identified as a Security Risk.",
|
||||
"caption": "Security Risk"
|
||||
},
|
||||
"9": {
|
||||
"description": "The verdict for the evidence is Managed Externally, such as in a case management tool.",
|
||||
"caption": "Managed Externally"
|
||||
},
|
||||
"10": {
|
||||
"description": "This evidence duplicates existing evidence related to this finding.",
|
||||
"caption": "Duplicate"
|
||||
}
|
||||
},
|
||||
"description": "The normalized verdict (or status) ID of the evidence associated with the security detection. For example, Microsoft Graph Security Alerts contain a <code>verdict</code> enumeration for each type of <code>evidence</code> associated with the Alert. This is typically set by an automated investigation process or an analyst/investigator assigned to the finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Verdict ID",
|
||||
"sibling": "verdict",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"reg_key": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the registry key that triggered the detection.",
|
||||
"extension": "win",
|
||||
"requirement": "recommended",
|
||||
"extension_id": 2,
|
||||
"caption": "Registry Key",
|
||||
"object_type": "win/reg_key",
|
||||
"object_name": "Registry Key"
|
||||
},
|
||||
"win_service": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the Windows service that triggered the detection.",
|
||||
"extension": "win",
|
||||
"requirement": "recommended",
|
||||
"extension_id": 2,
|
||||
"caption": "Windows Service",
|
||||
"object_type": "win/win_service",
|
||||
"object_name": "Windows Service"
|
||||
},
|
||||
"reg_value": {
|
||||
"type": "object_t",
|
||||
"description": "Describes details about the registry value that triggered the detection.",
|
||||
"extension": "win",
|
||||
"requirement": "recommended",
|
||||
"extension_id": 2,
|
||||
"caption": "Registry Value",
|
||||
"object_type": "win/reg_value",
|
||||
"object_name": "Registry Value"
|
||||
}
|
||||
},
|
||||
"name": "evidences",
|
||||
"description": "A collection of evidence artifacts associated to the activity/activities that triggered a security detection.",
|
||||
"extends": "_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"actor",
|
||||
"api",
|
||||
"connection_info",
|
||||
"data",
|
||||
"database",
|
||||
"databucket",
|
||||
"device",
|
||||
"dst_endpoint",
|
||||
"email",
|
||||
"file",
|
||||
"process",
|
||||
"query",
|
||||
"src_endpoint",
|
||||
"url",
|
||||
"user",
|
||||
"job",
|
||||
"script",
|
||||
"reg_key",
|
||||
"reg_value",
|
||||
"win_service"
|
||||
]
|
||||
},
|
||||
"caption": "Evidence Artifacts",
|
||||
"profiles": [
|
||||
"cloud",
|
||||
"container",
|
||||
"data_classification",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users"
|
||||
]
|
||||
}
|
||||
@@ -1,248 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"title": {
|
||||
"type": "string_t",
|
||||
"description": "A title or a brief phrase summarizing the reported finding.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Title",
|
||||
"type_name": "String"
|
||||
},
|
||||
"product": {
|
||||
"type": "object_t",
|
||||
"description": "Details about the product that reported the finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Product",
|
||||
"object_type": "product",
|
||||
"object_name": "Product"
|
||||
},
|
||||
"desc": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the reported finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Description",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the reported finding.",
|
||||
"requirement": "required",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"types": {
|
||||
"type": "string_t",
|
||||
"description": "One or more types of the reported finding.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Types",
|
||||
"type_name": "String"
|
||||
},
|
||||
"tags": {
|
||||
"type": "object_t",
|
||||
"description": "The list of tags; <code>{key:value}</code> pairs associated with the finding.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Tags",
|
||||
"object_type": "key_value_object",
|
||||
"object_name": "Key:Value object"
|
||||
},
|
||||
"attacks": {
|
||||
"type": "object_t",
|
||||
"description": "The <a target='_blank' href='https://attack.mitre.org'>MITRE ATT&CK\u00ae</a> technique and associated tactics related to the finding.",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "MITRE ATT&CK\u00ae",
|
||||
"url": "https://attack.mitre.org"
|
||||
},
|
||||
{
|
||||
"description": "MITRE ATLAS",
|
||||
"url": "https://atlas.mitre.org/matrices/ATLAS"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MITRE ATT&CK\u00ae and ATLAS\u2122 Details",
|
||||
"object_type": "attack",
|
||||
"object_name": "MITRE ATT&CK\u00ae & ATLAS\u2122"
|
||||
},
|
||||
"analytic": {
|
||||
"type": "object_t",
|
||||
"description": "The analytic technique used to analyze and derive insights from the data or information that led to the finding or conclusion.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Analytic",
|
||||
"object_type": "analytic",
|
||||
"object_name": "Analytic"
|
||||
},
|
||||
"attack_graph": {
|
||||
"type": "object_t",
|
||||
"description": "An Attack Graph describes possible routes an attacker could take through an environment. It describes relationships between resources and their findings, such as malware detections, vulnerabilities, misconfigurations, and other security actions.",
|
||||
"group": "context",
|
||||
"references": [
|
||||
{
|
||||
"description": "MS Defender description of Attack Path",
|
||||
"url": "https://learn.microsoft.com/en-us/azure/defender-for-cloud/how-to-manage-attack-path"
|
||||
},
|
||||
{
|
||||
"description": "SentinelOne Attack Path documentation",
|
||||
"url": "https://www.sentinelone.com/cybersecurity-101/cybersecurity/attack-path-analysis/"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "Attack Graph",
|
||||
"object_type": "graph",
|
||||
"object_name": "Graph"
|
||||
},
|
||||
"created_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the finding was created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"data_sources": {
|
||||
"type": "string_t",
|
||||
"description": "A list of data sources utilized in generation of the finding.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Data Sources",
|
||||
"type_name": "String"
|
||||
},
|
||||
"first_seen_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the finding was first observed. e.g. The time when a vulnerability was first observed. <p>It can differ from the <code>created_time</code> timestamp, which reflects the time this finding was created.</p>",
|
||||
"requirement": "optional",
|
||||
"caption": "First Seen",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"kill_chain": {
|
||||
"type": "object_t",
|
||||
"description": "The <a target='_blank' href='https://www.lockheedmartin.com/en-us/capabilities/cyber/cyber-kill-chain.html'>Cyber Kill Chain\u00ae</a> provides a detailed description of each phase and its associated activities within the broader context of a cyber attack.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Kill Chain",
|
||||
"object_type": "kill_chain_phase",
|
||||
"object_name": "Kill Chain Phase"
|
||||
},
|
||||
"last_seen_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the finding was most recently observed. e.g. The time when a vulnerability was most recently observed. <p>It can differ from the <code>modified_time</code> timestamp, which reflects the time this finding was last modified.</p>",
|
||||
"requirement": "optional",
|
||||
"caption": "Last Seen",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"modified_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the finding was last modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"product_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the product that reported the finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Product Identifier",
|
||||
"type_name": "String",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>uid</code> attribute in the <code>product</code> object instead. See specific usage.",
|
||||
"since": "1.4.0"
|
||||
}
|
||||
},
|
||||
"related_analytics": {
|
||||
"type": "object_t",
|
||||
"description": "Other analytics related to this finding.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Related Analytics",
|
||||
"object_type": "analytic",
|
||||
"object_name": "Analytic"
|
||||
},
|
||||
"related_events": {
|
||||
"type": "object_t",
|
||||
"description": "Describes events and/or other findings related to the finding as identified by the security product. Note that these events may or may not be in OCSF.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Related Events/Findings",
|
||||
"object_type": "related_event",
|
||||
"object_name": "Related Event/Finding"
|
||||
},
|
||||
"related_events_count": {
|
||||
"type": "integer_t",
|
||||
"description": "Number of related events or findings.",
|
||||
"requirement": "optional",
|
||||
"caption": "Related Events/Findings Count",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"src_url": {
|
||||
"type": "url_t",
|
||||
"description": "The URL pointing to the source of the finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Source URL",
|
||||
"type_name": "URL String"
|
||||
},
|
||||
"traits": {
|
||||
"type": "object_t",
|
||||
"description": "The list of key traits or characteristics extracted from the finding.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Traits",
|
||||
"object_type": "trait",
|
||||
"object_name": "Trait"
|
||||
},
|
||||
"uid_alt": {
|
||||
"type": "string_t",
|
||||
"description": "The alternative unique identifier of the reported finding.",
|
||||
"requirement": "optional",
|
||||
"caption": "Alternate ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"created_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the finding was created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"first_seen_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the finding was first observed. e.g. The time when a vulnerability was first observed. <p>It can differ from the <code>created_time</code> timestamp, which reflects the time this finding was created.</p>",
|
||||
"requirement": "optional",
|
||||
"caption": "First Seen",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"last_seen_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the finding was most recently observed. e.g. The time when a vulnerability was most recently observed. <p>It can differ from the <code>modified_time</code> timestamp, which reflects the time this finding was last modified.</p>",
|
||||
"requirement": "optional",
|
||||
"caption": "Last Seen",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"modified_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the finding was last modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
}
|
||||
},
|
||||
"name": "finding_info",
|
||||
"description": "The Finding Information object describes metadata related to a security finding generated by a security tool or system.",
|
||||
"extends": "object",
|
||||
"caption": "Finding Information",
|
||||
"profiles": [
|
||||
"data_classification",
|
||||
"datetime"
|
||||
]
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the rule that generated the event.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The rule type.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The rule version. For example: <code>1.1</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"desc": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the rule that generated the event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Description",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the rule that generated the event.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category": {
|
||||
"type": "string_t",
|
||||
"description": "The rule category.",
|
||||
"requirement": "optional",
|
||||
"caption": "Category",
|
||||
"type_name": "String"
|
||||
},
|
||||
"duration": {
|
||||
"type": "long_t",
|
||||
"description": "The rule response time duration, usually used for challenge completion time.",
|
||||
"requirement": "optional",
|
||||
"caption": "Duration Milliseconds",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"condition": {
|
||||
"type": "string_t",
|
||||
"description": "The rule trigger condition for the rule. For example: SQL_INJECTION.",
|
||||
"requirement": "optional",
|
||||
"caption": "Condition",
|
||||
"type_name": "String"
|
||||
},
|
||||
"match_details": {
|
||||
"type": "string_t",
|
||||
"description": "The data in a request that rule matched. For example: '[\"10\",\"and\",\"1\"]'.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Match Details",
|
||||
"type_name": "String"
|
||||
},
|
||||
"match_location": {
|
||||
"type": "string_t",
|
||||
"description": "The location of the matched data in the source which resulted in the triggered firewall rule. For example: HEADER.",
|
||||
"requirement": "optional",
|
||||
"caption": "Match Location",
|
||||
"type_name": "String"
|
||||
},
|
||||
"rate_limit": {
|
||||
"type": "integer_t",
|
||||
"description": "The rate limit for a rate-based rule.",
|
||||
"requirement": "optional",
|
||||
"caption": "Rate Limit",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"sensitivity": {
|
||||
"type": "string_t",
|
||||
"description": "The sensitivity of the firewall rule in the matched event. For example: HIGH.",
|
||||
"requirement": "optional",
|
||||
"caption": "Sensitivity",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "firewall_rule",
|
||||
"description": "The Firewall Rule object represents a specific rule within a firewall policy or event. It contains information about a rule's configuration, properties, and associated actions that define how network traffic is handled by the firewall.",
|
||||
"extends": "rule",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"caption": "Firewall Rule"
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"args": {
|
||||
"type": "string_t",
|
||||
"description": "The arguments sent along with the HTTP request.",
|
||||
"requirement": "optional",
|
||||
"caption": "HTTP Arguments",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The Hypertext Transfer Protocol (HTTP) version.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"length": {
|
||||
"type": "integer_t",
|
||||
"description": "The length of the entire HTTP request, in number of bytes.",
|
||||
"requirement": "optional",
|
||||
"caption": "Request Length",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the http request.",
|
||||
"requirement": "optional",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"url": {
|
||||
"type": "object_t",
|
||||
"description": "The URL object that pertains to the request.",
|
||||
"requirement": "recommended",
|
||||
"caption": "URL",
|
||||
"object_type": "url",
|
||||
"object_name": "Uniform Resource Locator"
|
||||
},
|
||||
"x_forwarded_for": {
|
||||
"type": "ip_t",
|
||||
"description": "The X-Forwarded-For header identifying the originating IP address(es) of a client connecting to a web server through an HTTP proxy or a load balancer.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "X-Forwarded-For",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"body_length": {
|
||||
"type": "integer_t",
|
||||
"description": "The actual length of the HTTP request body, in number of bytes, independent of a potentially existing Content-Length header.",
|
||||
"requirement": "optional",
|
||||
"caption": "Request Body Length",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"user_agent": {
|
||||
"type": "string_t",
|
||||
"description": "The request header that identifies the operating system and web browser.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP User-Agent",
|
||||
"type_name": "String",
|
||||
"observable": 16
|
||||
},
|
||||
"http_headers": {
|
||||
"type": "object_t",
|
||||
"description": "Additional HTTP headers of an HTTP request or response.",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Headers",
|
||||
"object_type": "http_header",
|
||||
"object_name": "HTTP Header"
|
||||
},
|
||||
"http_method": {
|
||||
"type": "string_t",
|
||||
"enum": {
|
||||
"OPTIONS": {
|
||||
"description": "The OPTIONS method describes the communication options for the target resource.",
|
||||
"caption": "Options"
|
||||
},
|
||||
"GET": {
|
||||
"description": "The GET method requests a representation of the specified resource. Requests using GET should only retrieve data.",
|
||||
"caption": "Get"
|
||||
},
|
||||
"HEAD": {
|
||||
"description": "The HEAD method asks for a response identical to a GET request, but without the response body.",
|
||||
"caption": "Head"
|
||||
},
|
||||
"POST": {
|
||||
"description": "The POST method submits an entity to the specified resource, often causing a change in state or side effects on the server.",
|
||||
"caption": "Post"
|
||||
},
|
||||
"PUT": {
|
||||
"description": "The PUT method replaces all current representations of the target resource with the request payload.",
|
||||
"caption": "Put"
|
||||
},
|
||||
"DELETE": {
|
||||
"description": "The DELETE method deletes the specified resource.",
|
||||
"caption": "Delete"
|
||||
},
|
||||
"TRACE": {
|
||||
"description": "The TRACE method performs a message loop-back test along the path to the target resource.",
|
||||
"caption": "Trace"
|
||||
},
|
||||
"CONNECT": {
|
||||
"description": "The CONNECT method establishes a tunnel to the server identified by the target resource.",
|
||||
"caption": "Connect"
|
||||
},
|
||||
"PATCH": {
|
||||
"description": "The PATCH method applies partial modifications to a resource.",
|
||||
"caption": "Patch"
|
||||
}
|
||||
},
|
||||
"description": "The <a target='_blank' href='https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods'>HTTP request method</a> indicates the desired action to be performed for a given resource.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Method",
|
||||
"type_name": "String"
|
||||
},
|
||||
"referrer": {
|
||||
"type": "string_t",
|
||||
"description": "The request header that identifies the address of the previous web page, which is linked to the current web page or resource being requested.",
|
||||
"requirement": "optional",
|
||||
"caption": "HTTP Referrer",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "http_request",
|
||||
"description": "The HTTP Request object represents the attributes of a request made to a web server. It encapsulates the details and metadata associated with an HTTP request, including the request method, headers, URL, query parameters, body content, and other relevant information.",
|
||||
"extends": "object",
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:OutboundInternetNetworkTraffic.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:OutboundInternetNetworkTraffic/"
|
||||
}
|
||||
],
|
||||
"caption": "HTTP Request"
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"code": {
|
||||
"type": "integer_t",
|
||||
"description": "The Hypertext Transfer Protocol (HTTP) status code returned from the web server to the client. For example, 200.",
|
||||
"requirement": "required",
|
||||
"caption": "Response Code",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"message": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the event/finding, as defined by the source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Message",
|
||||
"type_name": "String"
|
||||
},
|
||||
"status": {
|
||||
"type": "string_t",
|
||||
"description": "The response status. For example: A successful HTTP status of 'OK' which corresponds to a code of 200.",
|
||||
"requirement": "optional",
|
||||
"caption": "Status",
|
||||
"type_name": "String"
|
||||
},
|
||||
"length": {
|
||||
"type": "integer_t",
|
||||
"description": "The length of the entire HTTP response, in number of bytes.",
|
||||
"requirement": "optional",
|
||||
"caption": "Response Length",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"content_type": {
|
||||
"type": "string_t",
|
||||
"description": "The request header that identifies the original <a target='_blank' href='https://www.iana.org/assignments/media-types/media-types.xhtml'>media type </a> of the resource (prior to any content encoding applied for sending).",
|
||||
"requirement": "optional",
|
||||
"caption": "HTTP Content Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"body_length": {
|
||||
"type": "integer_t",
|
||||
"description": "The actual length of the HTTP response body, in number of bytes, independent of a potentially existing Content-Length header.",
|
||||
"requirement": "optional",
|
||||
"caption": "Response Body Length",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"http_headers": {
|
||||
"type": "object_t",
|
||||
"description": "Additional HTTP headers of an HTTP request or response.",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Headers",
|
||||
"object_type": "http_header",
|
||||
"object_name": "HTTP Header"
|
||||
},
|
||||
"latency": {
|
||||
"type": "integer_t",
|
||||
"description": "The HTTP response latency measured in milliseconds.",
|
||||
"requirement": "optional",
|
||||
"caption": "Latency",
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "http_response",
|
||||
"description": "The HTTP Response object contains detailed information about the response sent from a web server to the requester. It encompasses attributes and metadata that describe the response status, headers, body content, and other relevant information.",
|
||||
"extends": "object",
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:InboundInternetNetworkTraffic.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:InboundInternetNetworkTraffic/"
|
||||
}
|
||||
],
|
||||
"caption": "HTTP Response"
|
||||
}
|
||||
@@ -1,338 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"tenant_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique tenant identifier.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Tenant UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"log_version": {
|
||||
"type": "string_t",
|
||||
"description": "The event log schema version of the original event. For example the syslog version or the Cisco Log Schema version",
|
||||
"requirement": "optional",
|
||||
"caption": "Log Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"labels": {
|
||||
"type": "string_t",
|
||||
"description": "The list of labels attached to the event. For example: <code>[\"sample\", \"dev\"]</code>",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Labels",
|
||||
"type_name": "String"
|
||||
},
|
||||
"original_time": {
|
||||
"type": "string_t",
|
||||
"description": "The original event time as reported by the event source. For example, the time in the original format from system event log such as Syslog on Unix/Linux and the System event file on Windows. Omit if event is generated instead of collected via logs.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Original Time",
|
||||
"type_name": "String"
|
||||
},
|
||||
"log_level": {
|
||||
"type": "string_t",
|
||||
"description": "The level at which an event was logged. This can be log provider specific. For example the audit level.",
|
||||
"requirement": "optional",
|
||||
"caption": "Log Level",
|
||||
"type_name": "String"
|
||||
},
|
||||
"transmit_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the event was transmitted from the logging device to it's next destination.",
|
||||
"requirement": "optional",
|
||||
"caption": "Transmission Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"is_truncated": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates whether the OCSF event data has been truncated due to size limitations. When <code>true</code>, some event data may have been omitted to fit within system constraints.",
|
||||
"requirement": "optional",
|
||||
"caption": "Is Truncated",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"processed_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The event processed time, such as an ETL operation.",
|
||||
"requirement": "optional",
|
||||
"caption": "Processed Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The type of the event or finding as a subset of the <code>source</code> of the event. This can be any distinguishing characteristic of the data. For example 'Management Events' or 'Device Penetration Test'.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"extensions": {
|
||||
"type": "object_t",
|
||||
"description": "The schema extensions used to create the event.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Schema Extensions",
|
||||
"object_type": "extension",
|
||||
"object_name": "Schema Extension"
|
||||
},
|
||||
"log_format": {
|
||||
"type": "string_t",
|
||||
"description": "The format of data in the log where the data originated. For example CSV, XML, Windows Multiline, JSON, syslog or Cisco Log Schema.",
|
||||
"requirement": "optional",
|
||||
"caption": "Log Source Format",
|
||||
"type_name": "String"
|
||||
},
|
||||
"untruncated_size": {
|
||||
"type": "integer_t",
|
||||
"description": "The original size of the OCSF event data in kilobytes before any truncation occurred. This field is typically populated when <code>is_truncated</code> is <code>true</code> to indicate the full size of the original event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Untruncated Size",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"processed_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The event processed time, such as an ETL operation.",
|
||||
"requirement": "optional",
|
||||
"caption": "Processed Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"modified_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the event was last modified or enriched.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"original_event_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier assigned to the event in its original logging system before transformation to OCSF format. This field preserves the source system's native event identifier, enabling traceability back to the raw log entry. For example, a Windows Event Record ID, a syslog message ID, a Splunk _cd value, or a database transaction log sequence number.",
|
||||
"requirement": "optional",
|
||||
"caption": "Original Event ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"log_provider": {
|
||||
"type": "string_t",
|
||||
"description": "The logging provider or logging service that logged the event. For example AWS CloudWatch or Splunk.",
|
||||
"requirement": "optional",
|
||||
"caption": "Log Provider",
|
||||
"type_name": "String"
|
||||
},
|
||||
"loggers": {
|
||||
"type": "object_t",
|
||||
"description": "An array of Logger objects that describe the pipeline of devices and logging products between the event source and its eventual destination. Note, this attribute can be used when there is a complex end-to-end path of event flow and/or to track the chain of custody of the data.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Loggers",
|
||||
"object_type": "logger",
|
||||
"object_name": "Logger"
|
||||
},
|
||||
"log_source": {
|
||||
"type": "string_t",
|
||||
"description": "The log system or component where the data originated. For example, a file path, syslog server name or a Windows hostname and logging subsystem such as Security.",
|
||||
"requirement": "optional",
|
||||
"caption": "Log Source",
|
||||
"type_name": "String"
|
||||
},
|
||||
"log_name": {
|
||||
"type": "string_t",
|
||||
"description": "The event log name, typically for the consumer of the event. For example, the storage bucket name, SIEM repository index name, etc.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Log Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"product": {
|
||||
"type": "object_t",
|
||||
"description": "The product that reported the event.",
|
||||
"requirement": "required",
|
||||
"caption": "Product",
|
||||
"object_type": "product",
|
||||
"object_name": "Product"
|
||||
},
|
||||
"tags": {
|
||||
"type": "object_t",
|
||||
"description": "The list of tags; <code>{key:value}</code> pairs associated to the event.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Tags",
|
||||
"object_type": "key_value_object",
|
||||
"object_name": "Key:Value object"
|
||||
},
|
||||
"profiles": {
|
||||
"type": "string_t",
|
||||
"description": "The list of profiles used to create the event. Profiles should be referenced by their <code>name</code> attribute for core profiles, or <code>extension/name</code> for profiles from extensions.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Profiles",
|
||||
"type_name": "String"
|
||||
},
|
||||
"extension": {
|
||||
"type": "object_t",
|
||||
"description": "The schema extension used to create the event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Schema Extension",
|
||||
"object_type": "extension",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>extensions</code> attribute instead.",
|
||||
"since": "1.1.0"
|
||||
},
|
||||
"object_name": "Schema Extension"
|
||||
},
|
||||
"logged_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "<p>The time when the logging system collected and logged the event.</p>This attribute is distinct from the event time in that event time typically contain the time extracted from the original event. Most of the time, these two times will be different.",
|
||||
"requirement": "optional",
|
||||
"caption": "Logged Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"event_code": {
|
||||
"type": "string_t",
|
||||
"description": "The identifier of the original event. For example the numerical Windows Event Code or Cisco syslog code.",
|
||||
"requirement": "optional",
|
||||
"caption": "Event Code",
|
||||
"type_name": "String"
|
||||
},
|
||||
"reporter": {
|
||||
"type": "object_t",
|
||||
"description": "The entity from which the event or finding was first reported.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Reporter",
|
||||
"object_type": "reporter",
|
||||
"object_name": "Reporter"
|
||||
},
|
||||
"transformation_info_list": {
|
||||
"type": "object_t",
|
||||
"description": "An array of transformation info that describes the mappings or transforms applied to the data.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Transformation Info",
|
||||
"object_type": "transformation_info",
|
||||
"object_name": "Transformation Info"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the OCSF schema, using Semantic Versioning Specification (<a target='_blank' href='https://semver.org'>SemVer</a>). For example: <code>1.0.0.</code> Event consumers use the version to determine the available event attributes.",
|
||||
"requirement": "required",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"modified_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the event was last modified or enriched.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"total_queued_duration": {
|
||||
"type": "object_t",
|
||||
"description": "The amount of time an event spent in a queue awaiting processing. In this case, the value is the difference between <code>processed_time</code> and <code>logged_time</code>. This duration is inclusive of all queues between the originator of the event and the intended long-term storage destination of the event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Total Queued Duration",
|
||||
"object_type": "timespan",
|
||||
"object_name": "Time Span"
|
||||
},
|
||||
"correlation_uid": {
|
||||
"type": "string_t",
|
||||
"description": "A unique identifier used to correlate this OCSF event with other related OCSF events, distinct from the event's <code>uid</code> value. This enables linking multiple OCSF events that are part of the same activity, transaction, or security incident across different systems or time periods.",
|
||||
"requirement": "optional",
|
||||
"caption": "Correlation UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"debug": {
|
||||
"type": "string_t",
|
||||
"description": "Debug information about non-fatal issues with this OCSF event. Each issue is a line in this string array.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Debug Information",
|
||||
"type_name": "String"
|
||||
},
|
||||
"data_classification": {
|
||||
"type": "object_t",
|
||||
"description": "The Data Classification object includes information about data classification levels and data category types.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"@deprecated": {
|
||||
"message": "Use the attribute <code>data_classifications</code> instead",
|
||||
"since": "1.4.0"
|
||||
},
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"source": {
|
||||
"type": "string_t",
|
||||
"description": "The source of the event or finding. This can be any distinguishing name for the logical origin of the data \u2014 for example, 'CloudTrail Events', or a use case like 'Attack Simulations' or 'Vulnerability Scans'.",
|
||||
"requirement": "optional",
|
||||
"caption": "Source",
|
||||
"type_name": "String"
|
||||
},
|
||||
"logged_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "<p>The time when the logging system collected and logged the event.</p>This attribute is distinct from the event time in that event time typically contain the time extracted from the original event. Most of the time, these two times will be different.",
|
||||
"requirement": "optional",
|
||||
"caption": "Logged Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "A unique identifier assigned to the OCSF event. This ID is specific to the OCSF event itself and is distinct from the original event identifier in the source system (see <code>original_event_uid</code>).",
|
||||
"requirement": "optional",
|
||||
"caption": "Event UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"sequence": {
|
||||
"type": "integer_t",
|
||||
"description": "Sequence number of the event. The sequence number is a value available in some events, to make the exact ordering of events unambiguous, regardless of the event time precision.",
|
||||
"requirement": "optional",
|
||||
"caption": "Sequence Number",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"data_classifications": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Data Classification objects, that include information about data classification levels and data category types, identified by a classifier.",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"transmit_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the event was transmitted from the logging device to it's next destination.",
|
||||
"requirement": "optional",
|
||||
"caption": "Transmission Time",
|
||||
"type_name": "Timestamp"
|
||||
}
|
||||
},
|
||||
"name": "metadata",
|
||||
"description": "The Metadata object describes the metadata associated with the event.",
|
||||
"extends": "object",
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:Metadata",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:Metadata/"
|
||||
}
|
||||
],
|
||||
"caption": "Metadata",
|
||||
"profiles": [
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime"
|
||||
]
|
||||
}
|
||||
@@ -1,387 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"vpc_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the Virtual Private Cloud (VPC).",
|
||||
"requirement": "optional",
|
||||
"caption": "VPC UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"os": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS",
|
||||
"object_type": "os",
|
||||
"object_name": "Operating System (OS)"
|
||||
},
|
||||
"type_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:LaptopComputer/'>laptop computer</a>.",
|
||||
"caption": "Laptop"
|
||||
},
|
||||
"6": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:VirtualizationSoftware/'>virtual machine</a>.",
|
||||
"caption": "Virtual"
|
||||
},
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Server/'>server</a>.",
|
||||
"caption": "Server"
|
||||
},
|
||||
"2": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:DesktopComputer/'>desktop computer</a>.",
|
||||
"caption": "Desktop"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:TabletComputer/'>tablet computer</a>.",
|
||||
"caption": "Tablet"
|
||||
},
|
||||
"5": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:MobilePhone/'>mobile phone</a>.",
|
||||
"caption": "Mobile"
|
||||
},
|
||||
"7": {
|
||||
"description": "An <a target='_blank' href='https://www.techtarget.com/iotagenda/definition/IoT-device'>IOT (Internet of Things) device</a>.",
|
||||
"caption": "IOT"
|
||||
},
|
||||
"8": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Browser/'>web browser</a>.",
|
||||
"caption": "Browser"
|
||||
},
|
||||
"9": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Firewall/'>networking firewall</a>.",
|
||||
"caption": "Firewall"
|
||||
},
|
||||
"10": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Switch/'>networking switch</a>.",
|
||||
"caption": "Switch"
|
||||
},
|
||||
"11": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Ethernet_hub'>networking hub</a>.",
|
||||
"caption": "Hub"
|
||||
},
|
||||
"12": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Router/'>networking router</a>.",
|
||||
"caption": "Router"
|
||||
},
|
||||
"14": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionPreventionSystem/'>intrusion prevention system</a>.",
|
||||
"caption": "IPS"
|
||||
},
|
||||
"15": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Load_balancing_(computing)'>Load Balancer device.</a>",
|
||||
"caption": "Load Balancer"
|
||||
},
|
||||
"13": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionDetectionSystem/'>intrusion detection system</a>.",
|
||||
"caption": "IDS"
|
||||
}
|
||||
},
|
||||
"description": "The network endpoint type ID.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"subnet_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a virtual subnet.",
|
||||
"requirement": "optional",
|
||||
"caption": "Subnet UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"network_scope_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "Unknown whether this endpoint resides within the customer\u2019s network.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The endpoint resides inside the customer\u2019s network.",
|
||||
"caption": "Internal"
|
||||
},
|
||||
"2": {
|
||||
"description": "The endpoint is on the Internet or otherwise external to the customer\u2019s network.",
|
||||
"caption": "External"
|
||||
},
|
||||
"99": {
|
||||
"description": "The network scope is not mapped. See the <code>network_scope</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the endpoint\u2019s network scope. The normalized network scope identifier indicates whether the endpoint resides inside the customer\u2019s network, outside on the Internet, or if its location relative to the customer\u2019s network cannot be determined.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Scope ID",
|
||||
"sibling": "network_scope",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"port": {
|
||||
"type": "port_t",
|
||||
"description": "The port used for communication within the network connection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Port",
|
||||
"type_name": "Port"
|
||||
},
|
||||
"mac_vendor": {
|
||||
"type": "string_t",
|
||||
"description": "The vendor or manufacturer of the endpoint's network interface controller (NIC), as identified from the MAC address.",
|
||||
"references": [
|
||||
{
|
||||
"description": "IEEE Registration Authority",
|
||||
"url": "https://standards.ieee.org/products-programs/regauth/"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Vendor",
|
||||
"type_name": "String"
|
||||
},
|
||||
"owner": {
|
||||
"type": "object_t",
|
||||
"description": "The identity of the service or user account that owns the endpoint or was last logged into it.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Owner",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"vlan_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The Virtual LAN identifier.",
|
||||
"requirement": "optional",
|
||||
"caption": "VLAN",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The network endpoint type. For example: <code>unknown</code>, <code>server</code>, <code>desktop</code>, <code>laptop</code>, <code>tablet</code>, <code>mobile</code>, <code>virtual</code>, <code>browser</code>, or <code>other</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the domain that the endpoint belongs to or that corresponds to the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "Domain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"pool": {
|
||||
"type": "object_t",
|
||||
"description": "The pool of desktops or virtual machines to which the endpoint belongs.",
|
||||
"requirement": "optional",
|
||||
"caption": "Pool",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"location": {
|
||||
"type": "object_t",
|
||||
"description": "The geographical location of the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "Geo Location",
|
||||
"object_type": "location",
|
||||
"object_name": "Geo Location"
|
||||
},
|
||||
"interface_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the network interface.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"network_scope": {
|
||||
"type": "string_t",
|
||||
"description": "Indicates whether the endpoint resides inside the customer\u2019s network, outside on the Internet, or if its location relative to the customer\u2019s network cannot be determined. The value is normalized to the caption of the <code>network_scope_id</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Scope",
|
||||
"type_name": "String"
|
||||
},
|
||||
"proxy_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "The network proxy information pertaining to a specific endpoint. This can be used to describe information pertaining to network address translation (NAT).",
|
||||
"requirement": "optional",
|
||||
"caption": "Proxy Endpoint",
|
||||
"object_type": "network_proxy",
|
||||
"object_name": "Network Proxy Endpoint"
|
||||
},
|
||||
"isp": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the Internet Service Provider (ISP).",
|
||||
"requirement": "optional",
|
||||
"caption": "ISP Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The short name of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"namespace_pid": {
|
||||
"type": "integer_t",
|
||||
"description": "If running under a process namespace (such as in a container), the process identifier within that process namespace.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Namespace PID",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"autonomous_system": {
|
||||
"type": "object_t",
|
||||
"description": "The Autonomous System details associated with an IP address.",
|
||||
"requirement": "optional",
|
||||
"caption": "Autonomous System",
|
||||
"object_type": "autonomous_system",
|
||||
"object_name": "Autonomous System"
|
||||
},
|
||||
"intermediate_ips": {
|
||||
"type": "ip_t",
|
||||
"description": "The intermediate IP Addresses. For example, the IP addresses in the HTTP X-Forwarded-For header.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Intermediate IP Addresses",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"instance_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a VM instance.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Instance ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"container": {
|
||||
"type": "object_t",
|
||||
"description": "The information describing an instance of a container. A container is a prepackaged, portable system image that runs isolated on an existing system using a container runtime like containerd.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Container",
|
||||
"object_type": "container",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"object_name": "Container"
|
||||
},
|
||||
"mac": {
|
||||
"type": "mac_t",
|
||||
"description": "The Media Access Control (MAC) address of the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Address",
|
||||
"type_name": "MAC Address"
|
||||
},
|
||||
"hostname": {
|
||||
"type": "hostname_t",
|
||||
"description": "The fully qualified name of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hostname",
|
||||
"type_name": "Hostname"
|
||||
},
|
||||
"interface_name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the network interface (e.g. eth2).",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"zone": {
|
||||
"type": "string_t",
|
||||
"description": "The network zone or LAN segment.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Zone",
|
||||
"type_name": "String"
|
||||
},
|
||||
"svc_name": {
|
||||
"type": "string_t",
|
||||
"description": "The service name in service-to-service connections. For example, AWS VPC logs the pkt-src-aws-service and pkt-dst-aws-service fields identify the connection is coming from or going to an AWS service.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Service Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String",
|
||||
"observable": 48
|
||||
},
|
||||
"isp_org": {
|
||||
"type": "string_t",
|
||||
"description": "The organization name of the Internet Service Provider (ISP). This represents the parent organization or company that owns/operates the ISP. For example, Comcast Corporation would be the ISP org for Xfinity internet service. This attribute helps identify the ultimate provider when ISPs operate under different brand names.",
|
||||
"requirement": "optional",
|
||||
"caption": "ISP Org",
|
||||
"type_name": "String"
|
||||
},
|
||||
"hw_info": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint hardware information.",
|
||||
"requirement": "optional",
|
||||
"caption": "Hardware Info",
|
||||
"object_type": "device_hw_info",
|
||||
"object_name": "Device Hardware Info"
|
||||
},
|
||||
"ip": {
|
||||
"type": "ip_t",
|
||||
"description": "The IP address of the endpoint, in either IPv4 or IPv6 format.",
|
||||
"requirement": "recommended",
|
||||
"caption": "IP Address",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"fingerprints": {
|
||||
"type": "object_t",
|
||||
"description": "Fingerprints that identify the specific application implementation on this endpoint, such as Cisco NPF or HASSH.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Fingerprints",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"agent_list": {
|
||||
"type": "object_t",
|
||||
"description": "A list of <code>agent</code> objects associated with a device, endpoint, or resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Agent List",
|
||||
"object_type": "agent",
|
||||
"object_name": "Agent"
|
||||
}
|
||||
},
|
||||
"name": "network_endpoint",
|
||||
"description": "The Network Endpoint object describes characteristics of a network endpoint. These can be a source or destination of a network connection.",
|
||||
"extends": "endpoint",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"ip",
|
||||
"uid",
|
||||
"name",
|
||||
"hostname",
|
||||
"svc_name",
|
||||
"instance_uid",
|
||||
"interface_uid",
|
||||
"interface_name",
|
||||
"domain"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:ComputerNetworkNode.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:ComputerNetworkNode/"
|
||||
}
|
||||
],
|
||||
"caption": "Network Endpoint",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"observable": 20
|
||||
}
|
||||
@@ -1,387 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"vpc_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the Virtual Private Cloud (VPC).",
|
||||
"requirement": "optional",
|
||||
"caption": "VPC UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"os": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS",
|
||||
"object_type": "os",
|
||||
"object_name": "Operating System (OS)"
|
||||
},
|
||||
"type_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:LaptopComputer/'>laptop computer</a>.",
|
||||
"caption": "Laptop"
|
||||
},
|
||||
"6": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:VirtualizationSoftware/'>virtual machine</a>.",
|
||||
"caption": "Virtual"
|
||||
},
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Server/'>server</a>.",
|
||||
"caption": "Server"
|
||||
},
|
||||
"2": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:DesktopComputer/'>desktop computer</a>.",
|
||||
"caption": "Desktop"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:TabletComputer/'>tablet computer</a>.",
|
||||
"caption": "Tablet"
|
||||
},
|
||||
"5": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:MobilePhone/'>mobile phone</a>.",
|
||||
"caption": "Mobile"
|
||||
},
|
||||
"7": {
|
||||
"description": "An <a target='_blank' href='https://www.techtarget.com/iotagenda/definition/IoT-device'>IOT (Internet of Things) device</a>.",
|
||||
"caption": "IOT"
|
||||
},
|
||||
"8": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Browser/'>web browser</a>.",
|
||||
"caption": "Browser"
|
||||
},
|
||||
"9": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Firewall/'>networking firewall</a>.",
|
||||
"caption": "Firewall"
|
||||
},
|
||||
"10": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Switch/'>networking switch</a>.",
|
||||
"caption": "Switch"
|
||||
},
|
||||
"11": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Ethernet_hub'>networking hub</a>.",
|
||||
"caption": "Hub"
|
||||
},
|
||||
"12": {
|
||||
"description": "A <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:Router/'>networking router</a>.",
|
||||
"caption": "Router"
|
||||
},
|
||||
"14": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionPreventionSystem/'>intrusion prevention system</a>.",
|
||||
"caption": "IPS"
|
||||
},
|
||||
"15": {
|
||||
"description": "A <a target='_blank' href='https://en.wikipedia.org/wiki/Load_balancing_(computing)'>Load Balancer device.</a>",
|
||||
"caption": "Load Balancer"
|
||||
},
|
||||
"13": {
|
||||
"description": "An <a target='_blank' href='https://d3fend.mitre.org/dao/artifact/d3f:IntrusionDetectionSystem/'>intrusion detection system</a>.",
|
||||
"caption": "IDS"
|
||||
}
|
||||
},
|
||||
"description": "The network endpoint type ID.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Type ID",
|
||||
"sibling": "type",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"subnet_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a virtual subnet.",
|
||||
"requirement": "optional",
|
||||
"caption": "Subnet UID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"network_scope_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "Unknown whether this endpoint resides within the customer\u2019s network.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The endpoint resides inside the customer\u2019s network.",
|
||||
"caption": "Internal"
|
||||
},
|
||||
"2": {
|
||||
"description": "The endpoint is on the Internet or otherwise external to the customer\u2019s network.",
|
||||
"caption": "External"
|
||||
},
|
||||
"99": {
|
||||
"description": "The network scope is not mapped. See the <code>network_scope</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the endpoint\u2019s network scope. The normalized network scope identifier indicates whether the endpoint resides inside the customer\u2019s network, outside on the Internet, or if its location relative to the customer\u2019s network cannot be determined.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Scope ID",
|
||||
"sibling": "network_scope",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"port": {
|
||||
"type": "port_t",
|
||||
"description": "The port used for communication within the network connection.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Port",
|
||||
"type_name": "Port"
|
||||
},
|
||||
"mac_vendor": {
|
||||
"type": "string_t",
|
||||
"description": "The vendor or manufacturer of the endpoint's network interface controller (NIC), as identified from the MAC address.",
|
||||
"references": [
|
||||
{
|
||||
"description": "IEEE Registration Authority",
|
||||
"url": "https://standards.ieee.org/products-programs/regauth/"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Vendor",
|
||||
"type_name": "String"
|
||||
},
|
||||
"owner": {
|
||||
"type": "object_t",
|
||||
"description": "The identity of the service or user account that owns the endpoint or was last logged into it.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Owner",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"vlan_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The Virtual LAN identifier.",
|
||||
"requirement": "optional",
|
||||
"caption": "VLAN",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The network endpoint type. For example: <code>unknown</code>, <code>server</code>, <code>desktop</code>, <code>laptop</code>, <code>tablet</code>, <code>mobile</code>, <code>virtual</code>, <code>browser</code>, or <code>other</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the domain that the endpoint belongs to or that corresponds to the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "Domain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"pool": {
|
||||
"type": "object_t",
|
||||
"description": "The pool of desktops or virtual machines to which the endpoint belongs.",
|
||||
"requirement": "optional",
|
||||
"caption": "Pool",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"location": {
|
||||
"type": "object_t",
|
||||
"description": "The geographical location of the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "Geo Location",
|
||||
"object_type": "location",
|
||||
"object_name": "Geo Location"
|
||||
},
|
||||
"interface_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the network interface.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"network_scope": {
|
||||
"type": "string_t",
|
||||
"description": "Indicates whether the endpoint resides inside the customer\u2019s network, outside on the Internet, or if its location relative to the customer\u2019s network cannot be determined. The value is normalized to the caption of the <code>network_scope_id</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Scope",
|
||||
"type_name": "String"
|
||||
},
|
||||
"proxy_endpoint": {
|
||||
"type": "object_t",
|
||||
"description": "The network proxy information pertaining to a specific endpoint. This can be used to describe information pertaining to network address translation (NAT).",
|
||||
"requirement": "optional",
|
||||
"caption": "Proxy Endpoint",
|
||||
"object_type": "network_proxy",
|
||||
"object_name": "Network Proxy Endpoint"
|
||||
},
|
||||
"isp": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the Internet Service Provider (ISP).",
|
||||
"requirement": "optional",
|
||||
"caption": "ISP Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The short name of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"namespace_pid": {
|
||||
"type": "integer_t",
|
||||
"description": "If running under a process namespace (such as in a container), the process identifier within that process namespace.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Namespace PID",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"autonomous_system": {
|
||||
"type": "object_t",
|
||||
"description": "The Autonomous System details associated with an IP address.",
|
||||
"requirement": "optional",
|
||||
"caption": "Autonomous System",
|
||||
"object_type": "autonomous_system",
|
||||
"object_name": "Autonomous System"
|
||||
},
|
||||
"intermediate_ips": {
|
||||
"type": "ip_t",
|
||||
"description": "The intermediate IP Addresses. For example, the IP addresses in the HTTP X-Forwarded-For header.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Intermediate IP Addresses",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"instance_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of a VM instance.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Instance ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"container": {
|
||||
"type": "object_t",
|
||||
"description": "The information describing an instance of a container. A container is a prepackaged, portable system image that runs isolated on an existing system using a container runtime like containerd.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Container",
|
||||
"object_type": "container",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"object_name": "Container"
|
||||
},
|
||||
"mac": {
|
||||
"type": "mac_t",
|
||||
"description": "The Media Access Control (MAC) address of the endpoint.",
|
||||
"requirement": "optional",
|
||||
"caption": "MAC Address",
|
||||
"type_name": "MAC Address"
|
||||
},
|
||||
"hostname": {
|
||||
"type": "hostname_t",
|
||||
"description": "The fully qualified name of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hostname",
|
||||
"type_name": "Hostname"
|
||||
},
|
||||
"interface_name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the network interface (e.g. eth2).",
|
||||
"requirement": "recommended",
|
||||
"caption": "Network Interface Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"zone": {
|
||||
"type": "string_t",
|
||||
"description": "The network zone or LAN segment.",
|
||||
"requirement": "optional",
|
||||
"caption": "Network Zone",
|
||||
"type_name": "String"
|
||||
},
|
||||
"svc_name": {
|
||||
"type": "string_t",
|
||||
"description": "The service name in service-to-service connections. For example, AWS VPC logs the pkt-src-aws-service and pkt-dst-aws-service fields identify the connection is coming from or going to an AWS service.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Service Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the endpoint.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String",
|
||||
"observable": 48
|
||||
},
|
||||
"isp_org": {
|
||||
"type": "string_t",
|
||||
"description": "The organization name of the Internet Service Provider (ISP). This represents the parent organization or company that owns/operates the ISP. For example, Comcast Corporation would be the ISP org for Xfinity internet service. This attribute helps identify the ultimate provider when ISPs operate under different brand names.",
|
||||
"requirement": "optional",
|
||||
"caption": "ISP Org",
|
||||
"type_name": "String"
|
||||
},
|
||||
"hw_info": {
|
||||
"type": "object_t",
|
||||
"description": "The endpoint hardware information.",
|
||||
"requirement": "optional",
|
||||
"caption": "Hardware Info",
|
||||
"object_type": "device_hw_info",
|
||||
"object_name": "Device Hardware Info"
|
||||
},
|
||||
"ip": {
|
||||
"type": "ip_t",
|
||||
"description": "The IP address of the endpoint, in either IPv4 or IPv6 format.",
|
||||
"requirement": "recommended",
|
||||
"caption": "IP Address",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"fingerprints": {
|
||||
"type": "object_t",
|
||||
"description": "Fingerprints that identify the specific application implementation on this endpoint, such as Cisco NPF or HASSH.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Fingerprints",
|
||||
"object_type": "fingerprint",
|
||||
"object_name": "Fingerprint"
|
||||
},
|
||||
"agent_list": {
|
||||
"type": "object_t",
|
||||
"description": "A list of <code>agent</code> objects associated with a device, endpoint, or resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Agent List",
|
||||
"object_type": "agent",
|
||||
"object_name": "Agent"
|
||||
}
|
||||
},
|
||||
"name": "network_proxy",
|
||||
"description": "The network proxy endpoint object describes a proxy server, which acts as an intermediary between a client requesting a resource and the server providing that resource.",
|
||||
"extends": "network_endpoint",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"ip",
|
||||
"uid",
|
||||
"name",
|
||||
"hostname",
|
||||
"svc_name",
|
||||
"instance_uid",
|
||||
"interface_uid",
|
||||
"interface_name",
|
||||
"domain"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:ProxyServer",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:ProxyServer/"
|
||||
}
|
||||
],
|
||||
"caption": "Network Proxy Endpoint",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"observable": 20
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The operating system name.",
|
||||
"requirement": "required",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The type of the operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the OS running on the device that originated the event. For example: \"Windows 10\", \"OS X 10.7\", or \"iOS 9\".",
|
||||
"requirement": "optional",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"build": {
|
||||
"type": "string_t",
|
||||
"description": "The operating system build number.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS Build",
|
||||
"type_name": "String"
|
||||
},
|
||||
"country": {
|
||||
"type": "string_t",
|
||||
"description": "The operating system country code, as defined by the ISO 3166-1 standard (Alpha-2 code).<p><b>Note:</b> The two letter country code should be capitalized. For example: <code>US</code> or <code>CA</code>.</p>",
|
||||
"references": [
|
||||
{
|
||||
"description": "ISO 3166-1 alpha-2 codes",
|
||||
"url": "https://www.iso.org/obp/ui/#iso:pub:PUB500001:en"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "Country",
|
||||
"type_name": "String",
|
||||
"observable": 14
|
||||
},
|
||||
"lang": {
|
||||
"type": "string_t",
|
||||
"description": "The two letter lower case language codes, as defined by <a target='_blank' href='https://en.wikipedia.org/wiki/ISO_639-1'>ISO 639-1</a>. For example: <code>en</code> (English), <code>de</code> (German), or <code>fr</code> (French).",
|
||||
"requirement": "optional",
|
||||
"caption": "Language",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"101": {
|
||||
"caption": "Windows Mobile"
|
||||
},
|
||||
"100": {
|
||||
"caption": "Windows"
|
||||
},
|
||||
"200": {
|
||||
"caption": "Linux"
|
||||
},
|
||||
"201": {
|
||||
"caption": "Android"
|
||||
},
|
||||
"300": {
|
||||
"caption": "macOS"
|
||||
},
|
||||
"301": {
|
||||
"caption": "iOS"
|
||||
},
|
||||
"302": {
|
||||
"caption": "iPadOS"
|
||||
},
|
||||
"400": {
|
||||
"caption": "Solaris"
|
||||
},
|
||||
"401": {
|
||||
"caption": "AIX"
|
||||
},
|
||||
"402": {
|
||||
"caption": "HP-UX"
|
||||
}
|
||||
},
|
||||
"description": "The type identifier of the operating system.",
|
||||
"requirement": "required",
|
||||
"sibling": "type",
|
||||
"caption": "Type ID",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cpe_name": {
|
||||
"type": "string_t",
|
||||
"description": "The Common Platform Enumeration (CPE) name as described by (<a target='_blank' href='https://nvd.nist.gov/products/cpe'>NIST</a>) For example: <code>cpe:/a:apple:safari:16.2</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "The product CPE identifier",
|
||||
"type_name": "String"
|
||||
},
|
||||
"cpu_bits": {
|
||||
"type": "integer_t",
|
||||
"description": "The cpu architecture, the number of bits used for addressing in memory. For example: <code>32</code> or <code>64</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "CPU Bits",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"edition": {
|
||||
"type": "string_t",
|
||||
"description": "The operating system edition. For example: <code>Professional</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS Edition",
|
||||
"type_name": "String"
|
||||
},
|
||||
"kernel_release": {
|
||||
"type": "string_t",
|
||||
"description": "The kernel release of the operating system. On Unix-based systems, this is determined from the <code>uname -r</code> command output, for example \"5.15.0-122-generic\".",
|
||||
"requirement": "optional",
|
||||
"caption": "Kernel Release",
|
||||
"type_name": "String"
|
||||
},
|
||||
"sp_name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the latest Service Pack.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS Service Pack",
|
||||
"type_name": "String"
|
||||
},
|
||||
"sp_ver": {
|
||||
"type": "integer_t",
|
||||
"description": "The version number of the latest Service Pack.",
|
||||
"requirement": "optional",
|
||||
"caption": "OS Service Pack Version",
|
||||
"type_name": "Integer"
|
||||
}
|
||||
},
|
||||
"name": "os",
|
||||
"description": "The Operating System (OS) object describes characteristics of an OS, such as Linux or Windows.",
|
||||
"extends": "object",
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:OperatingSystem",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:OperatingSystem/"
|
||||
}
|
||||
],
|
||||
"caption": "Operating System (OS)"
|
||||
}
|
||||
@@ -1,357 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "process_name_t",
|
||||
"description": "The friendly name of the process, for example: <code>Notepad++</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "Process Name"
|
||||
},
|
||||
"pid": {
|
||||
"type": "integer_t",
|
||||
"description": "The process identifier, as reported by the operating system. Process ID (PID) is a number used by the operating system to uniquely identify an active process.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Process ID",
|
||||
"type_name": "Integer",
|
||||
"observable": 15
|
||||
},
|
||||
"session": {
|
||||
"type": "object_t",
|
||||
"description": "The user session under which this process is running.",
|
||||
"requirement": "optional",
|
||||
"caption": "Session",
|
||||
"object_type": "session",
|
||||
"object_name": "Session"
|
||||
},
|
||||
"file": {
|
||||
"type": "object_t",
|
||||
"description": "The process file object.",
|
||||
"requirement": "recommended",
|
||||
"caption": "File",
|
||||
"object_type": "file",
|
||||
"object_name": "File"
|
||||
},
|
||||
"user": {
|
||||
"type": "object_t",
|
||||
"description": "The user under which this process is running.",
|
||||
"requirement": "recommended",
|
||||
"caption": "User",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"path": {
|
||||
"type": "string_t",
|
||||
"description": "The process file path.",
|
||||
"requirement": "optional",
|
||||
"caption": "Path",
|
||||
"type_name": "String"
|
||||
},
|
||||
"group": {
|
||||
"type": "object_t",
|
||||
"description": "The group under which this process is running.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Group",
|
||||
"object_type": "group",
|
||||
"profiles": [
|
||||
"linux/linux_users"
|
||||
],
|
||||
"object_name": "Group"
|
||||
},
|
||||
"tid": {
|
||||
"type": "integer_t",
|
||||
"description": "The identifier of the thread associated with the event, as returned by the operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "Thread ID",
|
||||
"type_name": "Integer",
|
||||
"@deprecated": {
|
||||
"message": "<code>tid</code> is deprecated in favor of <code>ptid</code>. <code>ptid</code> has type <code>long_t</code> which can accommodate the thread identifiers returned by all platforms (e.g. 64-bit on MacOS).",
|
||||
"since": "1.6.0"
|
||||
}
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "A unique identifier for this process assigned by the producer (tool). Facilitates correlation of a process event with other events for that process.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String",
|
||||
"observable": 39
|
||||
},
|
||||
"loaded_modules": {
|
||||
"type": "string_t",
|
||||
"description": "The list of loaded module names.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Loaded Modules",
|
||||
"type_name": "String"
|
||||
},
|
||||
"ancestry": {
|
||||
"type": "object_t",
|
||||
"description": "An array of Process Entities describing the extended parentage of this process object. Direct parent information should be expressed through the <code>parent_process</code> attribute. The first array element is the direct parent of this process object. Subsequent list elements go up the process parentage hierarchy. That is, the array is sorted from newest to oldest process. It is recommended to only populate this field for the top-level process object.",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "Guidance on Representing Process Parentage",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/representing-process-parentage.md"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "Ancestry",
|
||||
"object_type": "process_entity",
|
||||
"object_name": "Process Entity"
|
||||
},
|
||||
"auid": {
|
||||
"type": "integer_t",
|
||||
"description": "The audit user assigned at login by the audit subsystem.",
|
||||
"requirement": "optional",
|
||||
"caption": "Audit User ID",
|
||||
"profiles": [
|
||||
"linux/linux_users"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"cmd_line": {
|
||||
"type": "string_t",
|
||||
"description": "The full command line used to launch an application, service, process, or job. For example: <code>ssh user@10.0.0.10</code>. If the command line is unavailable or missing, the empty string <code>''</code> is to be used.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Command Line",
|
||||
"type_name": "String",
|
||||
"observable": 13
|
||||
},
|
||||
"container": {
|
||||
"type": "object_t",
|
||||
"description": "The information describing an instance of a container. A container is a prepackaged, portable system image that runs isolated on an existing system using a container runtime like containerd.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Container",
|
||||
"object_type": "container",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"object_name": "Container"
|
||||
},
|
||||
"cpid": {
|
||||
"type": "uuid_t",
|
||||
"description": "A unique process identifier that can be assigned deterministically by multiple system data producers.",
|
||||
"source": "cpid",
|
||||
"references": [
|
||||
{
|
||||
"description": "OCSF Common Process Identifier (CPID) Specification",
|
||||
"url": "https://github.com/ocsf/common-process-id"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Common Process Identifier",
|
||||
"type_name": "UUID"
|
||||
},
|
||||
"created_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the process was created/started.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Created Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"egid": {
|
||||
"type": "integer_t",
|
||||
"description": "The effective group under which this process is running.",
|
||||
"requirement": "optional",
|
||||
"caption": "Effective Group ID",
|
||||
"profiles": [
|
||||
"linux/linux_users",
|
||||
"macos/macos_users"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"environment_variables": {
|
||||
"type": "object_t",
|
||||
"description": "Environment variables associated with the process.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Environment Variables",
|
||||
"object_type": "environment_variable",
|
||||
"object_name": "Environment Variable"
|
||||
},
|
||||
"euid": {
|
||||
"type": "integer_t",
|
||||
"description": "The effective user under which this process is running.",
|
||||
"requirement": "optional",
|
||||
"caption": "Effective User ID",
|
||||
"profiles": [
|
||||
"linux/linux_users",
|
||||
"macos/macos_users"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"integrity": {
|
||||
"type": "string_t",
|
||||
"description": "The process integrity level, normalized to the caption of the integrity_id value. In the case of 'Other', it is defined by the event source (Windows only).",
|
||||
"requirement": "optional",
|
||||
"caption": "Integrity",
|
||||
"type_name": "String"
|
||||
},
|
||||
"integrity_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"6": {
|
||||
"caption": "Protected"
|
||||
},
|
||||
"0": {
|
||||
"description": "The integrity level is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Untrusted"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"99": {
|
||||
"description": "The integrity level is not mapped. See the <code>integrity</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "High"
|
||||
},
|
||||
"5": {
|
||||
"caption": "System"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the process integrity level (Windows only).",
|
||||
"requirement": "optional",
|
||||
"caption": "Integrity Level",
|
||||
"sibling": "integrity",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"lineage": {
|
||||
"type": "file_path_t",
|
||||
"description": "The lineage of the process, represented by a list of paths for each ancestor process. For example: <code>['/usr/sbin/sshd', '/usr/bin/bash', '/usr/bin/whoami']</code>.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Lineage",
|
||||
"type_name": "File Path",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>ancestry</code> attribute.",
|
||||
"since": "1.4.0"
|
||||
}
|
||||
},
|
||||
"namespace_pid": {
|
||||
"type": "integer_t",
|
||||
"description": "If running under a process namespace (such as in a container), the process identifier within that process namespace.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Namespace PID",
|
||||
"profiles": [
|
||||
"container"
|
||||
],
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"parent_process": {
|
||||
"type": "object_t",
|
||||
"description": "The parent process of this process object. It is recommended to only populate this field for the top-level process object, to prevent deep nesting. Additional ancestry information can be supplied in the <code>ancestry</code> attribute.",
|
||||
"references": [
|
||||
{
|
||||
"description": "Guidance on Representing Process Parentage",
|
||||
"url": "https://github.com/ocsf/ocsf-docs/blob/main/articles/representing-process-parentage.md"
|
||||
}
|
||||
],
|
||||
"requirement": "recommended",
|
||||
"caption": "Parent Process",
|
||||
"object_type": "process",
|
||||
"object_name": "Process"
|
||||
},
|
||||
"ptid": {
|
||||
"type": "long_t",
|
||||
"description": "The identifier of the process thread associated with the event, as returned by the operating system.",
|
||||
"requirement": "optional",
|
||||
"caption": "Process Thread ID",
|
||||
"type_name": "Long"
|
||||
},
|
||||
"sandbox": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the containment jail (i.e., sandbox). For example, hardened_ps, high_security_ps, oracle_ps, netsvcs_ps, or default_ps.",
|
||||
"requirement": "optional",
|
||||
"caption": "Sandbox",
|
||||
"type_name": "String"
|
||||
},
|
||||
"terminated_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the process was terminated.",
|
||||
"requirement": "optional",
|
||||
"caption": "Terminated Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"working_directory": {
|
||||
"type": "string_t",
|
||||
"description": "The working directory of a process.",
|
||||
"requirement": "optional",
|
||||
"caption": "Working Directory",
|
||||
"type_name": "String"
|
||||
},
|
||||
"xattributes": {
|
||||
"type": "object_t",
|
||||
"description": "An unordered collection of zero or more name/value pairs that represent a process extended attribute.",
|
||||
"requirement": "optional",
|
||||
"caption": "Extended Attributes",
|
||||
"object_type": "object",
|
||||
"object_name": "Object"
|
||||
},
|
||||
"created_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the process was created/started.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"terminated_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the process was terminated.",
|
||||
"requirement": "optional",
|
||||
"caption": "Terminated Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"hosted_services": {
|
||||
"type": "object_t",
|
||||
"description": "The Windows services that this process is hosting.",
|
||||
"extension": "win",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"extension_id": 2,
|
||||
"caption": "Hosted Services",
|
||||
"object_type": "win/win_service",
|
||||
"object_name": "Windows Service"
|
||||
}
|
||||
},
|
||||
"name": "process",
|
||||
"description": "The Process object describes a running instance of a launched program.",
|
||||
"extends": "process_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"pid",
|
||||
"uid",
|
||||
"cpid"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:Process",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:Process/"
|
||||
}
|
||||
],
|
||||
"caption": "Process",
|
||||
"profiles": [
|
||||
"container",
|
||||
"data_classification",
|
||||
"datetime",
|
||||
"linux/linux_users",
|
||||
"macos/macos_users"
|
||||
],
|
||||
"observable": 25
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the product.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the product, as defined by the event source. For example: <code>2013.1.3-beta</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"path": {
|
||||
"type": "string_t",
|
||||
"description": "The installation path of the product.",
|
||||
"requirement": "optional",
|
||||
"caption": "Path",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the product.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"feature": {
|
||||
"type": "object_t",
|
||||
"description": "The feature that reported the event.",
|
||||
"requirement": "optional",
|
||||
"caption": "Feature",
|
||||
"object_type": "feature",
|
||||
"object_name": "Feature"
|
||||
},
|
||||
"lang": {
|
||||
"type": "string_t",
|
||||
"description": "The two letter lower case language codes, as defined by <a target='_blank' href='https://en.wikipedia.org/wiki/ISO_639-1'>ISO 639-1</a>. For example: <code>en</code> (English), <code>de</code> (German), or <code>fr</code> (French).",
|
||||
"requirement": "optional",
|
||||
"caption": "Language",
|
||||
"type_name": "String"
|
||||
},
|
||||
"cpe_name": {
|
||||
"type": "string_t",
|
||||
"description": "The Common Platform Enumeration (CPE) name as described by (<a target='_blank' href='https://nvd.nist.gov/products/cpe'>NIST</a>) For example: <code>cpe:/a:apple:safari:16.2</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "The product CPE identifier",
|
||||
"type_name": "String"
|
||||
},
|
||||
"data_classification": {
|
||||
"type": "object_t",
|
||||
"description": "The Data Classification object includes information about data classification levels and data category types.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"@deprecated": {
|
||||
"message": "Use the attribute <code>data_classifications</code> instead",
|
||||
"since": "1.4.0"
|
||||
},
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"data_classifications": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Data Classification objects, that include information about data classification levels and data category types, identified by a classifier.",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"url_string": {
|
||||
"type": "url_t",
|
||||
"description": "The URL pointing towards the product.",
|
||||
"requirement": "optional",
|
||||
"caption": "URL String",
|
||||
"type_name": "URL String"
|
||||
},
|
||||
"vendor_name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the vendor of the product.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Vendor Name",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "product",
|
||||
"description": "The Product object describes characteristics of a software product.",
|
||||
"extends": "_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"caption": "Product",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
]
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"desc": {
|
||||
"type": "string_t",
|
||||
"description": "The description of the remediation strategy.",
|
||||
"requirement": "required",
|
||||
"caption": "Description",
|
||||
"type_name": "String"
|
||||
},
|
||||
"references": {
|
||||
"type": "string_t",
|
||||
"description": "A list of supporting URL/s, references that help describe the remediation strategy.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "References",
|
||||
"type_name": "String"
|
||||
},
|
||||
"cis_controls": {
|
||||
"type": "object_t",
|
||||
"description": "An array of Center for Internet Security (CIS) Controls that can be optionally mapped to provide additional remediation details.",
|
||||
"is_array": true,
|
||||
"references": [
|
||||
{
|
||||
"description": "Center For Internet Security Controls",
|
||||
"url": "https://www.cisecurity.org/controls/"
|
||||
}
|
||||
],
|
||||
"requirement": "optional",
|
||||
"caption": "CIS Controls",
|
||||
"object_type": "cis_control",
|
||||
"object_name": "CIS Control"
|
||||
},
|
||||
"kb_article_list": {
|
||||
"type": "object_t",
|
||||
"description": "A list of KB articles or patches related to an endpoint. A KB Article contains metadata that describes the patch or an update.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Knowledgebase Articles",
|
||||
"object_type": "kb_article",
|
||||
"object_name": "KB Article"
|
||||
},
|
||||
"kb_articles": {
|
||||
"type": "string_t",
|
||||
"description": "The KB article/s related to the entity. A KB Article contains metadata that describes the patch or an update.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Knowledgebase Articles",
|
||||
"type_name": "String",
|
||||
"@deprecated": {
|
||||
"message": "Use the <code>kb_article_list</code> attribute instead.",
|
||||
"since": "1.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "remediation",
|
||||
"description": "The Remediation object describes the recommended remediation steps to address identified issue(s).",
|
||||
"extends": "object",
|
||||
"caption": "Remediation",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
]
|
||||
}
|
||||
@@ -1,291 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"data": {
|
||||
"type": "json_t",
|
||||
"description": "Additional data describing the resource.",
|
||||
"requirement": "optional",
|
||||
"caption": "Data",
|
||||
"type_name": "JSON"
|
||||
},
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the resource.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String",
|
||||
"observable": 38
|
||||
},
|
||||
"owner": {
|
||||
"type": "object_t",
|
||||
"description": "The details of the entity that owns the resource. This object includes properties such as the owner's name, unique identifier, type, domain, and other relevant attributes that help identify the resource owner within the environment.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Owner",
|
||||
"object_type": "user",
|
||||
"object_name": "User"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The resource type as defined by the event source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the resource. For example <code>1.2.3</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"ip": {
|
||||
"type": "ip_t",
|
||||
"description": "The IP address of the resource, in either IPv4 or IPv6 format.",
|
||||
"requirement": "recommended",
|
||||
"caption": "IP Address",
|
||||
"type_name": "IP Address"
|
||||
},
|
||||
"group": {
|
||||
"type": "object_t",
|
||||
"description": "The name of the related resource group.",
|
||||
"requirement": "optional",
|
||||
"caption": "Group",
|
||||
"object_type": "group",
|
||||
"object_name": "Group"
|
||||
},
|
||||
"uid": {
|
||||
"type": "resource_uid_t",
|
||||
"description": "The unique identifier of the resource.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "Resource UID"
|
||||
},
|
||||
"hostname": {
|
||||
"type": "hostname_t",
|
||||
"description": "The fully qualified name of the resource.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hostname",
|
||||
"type_name": "Hostname"
|
||||
},
|
||||
"labels": {
|
||||
"type": "string_t",
|
||||
"description": "The list of labels associated to the resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Labels",
|
||||
"type_name": "String"
|
||||
},
|
||||
"namespace": {
|
||||
"type": "string_t",
|
||||
"description": "The namespace is useful when similar entities exist that you need to keep separate.",
|
||||
"requirement": "optional",
|
||||
"caption": "Namespace",
|
||||
"type_name": "String"
|
||||
},
|
||||
"role": {
|
||||
"type": "string_t",
|
||||
"description": "The role of the resource in the context of the event or finding, normalized to the caption of the role_id value. In the case of 'Other', it is defined by the event source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Role",
|
||||
"type_name": "String"
|
||||
},
|
||||
"tags": {
|
||||
"type": "object_t",
|
||||
"description": "The list of tags; <code>{key:value}</code> pairs associated to the resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Tags",
|
||||
"object_type": "key_value_object",
|
||||
"object_name": "Key:Value object"
|
||||
},
|
||||
"agent_list": {
|
||||
"type": "object_t",
|
||||
"description": "A list of <code>agent</code> objects associated with a device, endpoint, or resource.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Agent List",
|
||||
"object_type": "agent",
|
||||
"object_name": "Agent"
|
||||
},
|
||||
"cloud_partition": {
|
||||
"type": "string_t",
|
||||
"description": "The logical grouping or isolated segment within a cloud provider's infrastructure where the resource is located. Examples include AWS partitions (aws, aws-cn, aws-us-gov), Azure cloud environments (AzureCloud, AzureUSGovernment, AzureChinaCloud), or similar logical divisions in other cloud providers.",
|
||||
"requirement": "optional",
|
||||
"caption": "Cloud Partition",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"created_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the resource was created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"criticality": {
|
||||
"type": "string_t",
|
||||
"description": "The criticality of the resource as defined by the event source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Criticality",
|
||||
"type_name": "String"
|
||||
},
|
||||
"data_classification": {
|
||||
"type": "object_t",
|
||||
"description": "The Data Classification object includes information about data classification levels and data category types.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"@deprecated": {
|
||||
"message": "Use the attribute <code>data_classifications</code> instead",
|
||||
"since": "1.4.0"
|
||||
},
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"data_classifications": {
|
||||
"type": "object_t",
|
||||
"description": "A list of Data Classification objects, that include information about data classification levels and data category types, identified by a classifier.",
|
||||
"group": "context",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Data Classification",
|
||||
"object_type": "data_classification",
|
||||
"profiles": [
|
||||
"data_classification"
|
||||
],
|
||||
"object_name": "Data Classification"
|
||||
},
|
||||
"is_backed_up": {
|
||||
"type": "boolean_t",
|
||||
"description": "Indicates whether the device or resource has a backup enabled, such as an automated snapshot or a cloud backup. For example, this is indicated by the <code>cloudBackupEnabled</code> value within JAMF Pro mobile devices or the registration of an AWS ARN with the AWS Backup service.",
|
||||
"requirement": "optional",
|
||||
"caption": "Back Ups Configured",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"modified_time": {
|
||||
"type": "timestamp_t",
|
||||
"description": "The time when the resource was last modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"type_name": "Timestamp"
|
||||
},
|
||||
"provider": {
|
||||
"type": "string_t",
|
||||
"description": "The cloud service provider that hosts or manages the resource. This field is typically used when the resource is managed by a different provider than the one generating the event or finding. Examples include AWS, Azure, GCP (Google Cloud Platform), Oracle Cloud, IBM Cloud, Alibaba Cloud, or other public, private, or hybrid cloud providers.",
|
||||
"requirement": "optional",
|
||||
"caption": "Cloud Provider",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"region": {
|
||||
"type": "string_t",
|
||||
"description": "The cloud region where the resource is hosted, as defined by the cloud provider. This represents the physical or logical geographic area containing the infrastructure supporting the resource. Examples include AWS regions (us-east-1, eu-west-1), Azure regions (East US, West Europe), GCP regions (us-central1, europe-west1), or Oracle Cloud regions (us-ashburn-1, uk-london-1).",
|
||||
"requirement": "optional",
|
||||
"caption": "Region",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"resource_relationship": {
|
||||
"type": "object_t",
|
||||
"description": "A graph representation showing how this resource relates to and interacts with other entities in the environment. This can include parent/child relationships, dependencies, or other connections.",
|
||||
"requirement": "optional",
|
||||
"caption": "Resource Relationship",
|
||||
"object_type": "graph",
|
||||
"object_name": "Graph"
|
||||
},
|
||||
"role_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "The resource was impacted or affected by the event/finding.",
|
||||
"caption": "Affected"
|
||||
},
|
||||
"0": {
|
||||
"description": "The role is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "The resource is the primary target or subject of the event/finding.",
|
||||
"caption": "Target"
|
||||
},
|
||||
"2": {
|
||||
"description": "The resource is acting as the initiator or performer in the context of the event/finding.",
|
||||
"caption": "Actor"
|
||||
},
|
||||
"99": {
|
||||
"description": "The role is not mapped. See the role attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "The resource is related to or associated with the event/finding.",
|
||||
"caption": "Related"
|
||||
}
|
||||
},
|
||||
"description": "The normalized identifier of the resource's role in the context of the event or finding.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Role ID",
|
||||
"sibling": "role",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"uid_alt": {
|
||||
"type": "resource_uid_t",
|
||||
"description": "The alternative unique identifier of the resource.",
|
||||
"requirement": "optional",
|
||||
"caption": "Alternate ID",
|
||||
"type_name": "Resource UID"
|
||||
},
|
||||
"zone": {
|
||||
"type": "string_t",
|
||||
"description": "The availability zone within a cloud region where the resource is located. Examples include AWS availability zones (us-east-1a, us-east-1b), Azure availability zones (1, 2, 3 within a region), GCP zones (us-central1-a, us-central1-b), or Oracle Cloud availability domains (AD-1, AD-2, AD-3).",
|
||||
"requirement": "optional",
|
||||
"caption": "Cloud Availability Zone",
|
||||
"profiles": [
|
||||
"cloud"
|
||||
],
|
||||
"type_name": "String"
|
||||
},
|
||||
"created_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the resource was created.",
|
||||
"requirement": "optional",
|
||||
"caption": "Created Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
},
|
||||
"modified_time_dt": {
|
||||
"type": "datetime_t",
|
||||
"description": "The time when the resource was last modified.",
|
||||
"requirement": "optional",
|
||||
"caption": "Modified Time",
|
||||
"profiles": [
|
||||
"datetime"
|
||||
],
|
||||
"type_name": "Datetime"
|
||||
}
|
||||
},
|
||||
"name": "resource_details",
|
||||
"description": "The Resource Details object describes details about resources that were affected by the activity/event.",
|
||||
"extends": "_resource",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"caption": "Resource Details",
|
||||
"profiles": [
|
||||
"cloud",
|
||||
"data_classification",
|
||||
"datetime"
|
||||
]
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "string_t",
|
||||
"description": "The name of the service.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"version": {
|
||||
"type": "string_t",
|
||||
"description": "The version of the service.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Version",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the service.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String"
|
||||
},
|
||||
"labels": {
|
||||
"type": "string_t",
|
||||
"description": "The list of labels associated with the service.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Labels",
|
||||
"type_name": "String"
|
||||
},
|
||||
"tags": {
|
||||
"type": "object_t",
|
||||
"description": "The list of tags; <code>{key:value}</code> pairs associated to the service.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"object_type": "key_value_object",
|
||||
"object_name": "Key:Value object",
|
||||
"caption": "Tags"
|
||||
}
|
||||
},
|
||||
"name": "service",
|
||||
"description": "The Service object describes characteristics of a service, <code> e.g. AWS EC2. </code>",
|
||||
"extends": "_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:ServiceApplication.",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:ServiceApplication/"
|
||||
}
|
||||
],
|
||||
"caption": "Service"
|
||||
}
|
||||
@@ -1,370 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"port": {
|
||||
"type": "port_t",
|
||||
"description": "The URL port. For example: <code>80</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Port",
|
||||
"type_name": "Port"
|
||||
},
|
||||
"scheme": {
|
||||
"type": "string_t",
|
||||
"description": "The scheme portion of the URL. For example: <code>http</code>, <code>https</code>, <code>ftp</code>, or <code>sftp</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Scheme",
|
||||
"type_name": "String"
|
||||
},
|
||||
"path": {
|
||||
"type": "string_t",
|
||||
"description": "The URL path as extracted from the URL. For example: <code>/download/trouble</code> from <code>www.example.com/download/trouble</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Path",
|
||||
"type_name": "String"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string_t",
|
||||
"description": "The domain portion of the URL. For example: <code>example.com</code> in <code>https://sub.example.com</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Domain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"hostname": {
|
||||
"type": "hostname_t",
|
||||
"description": "The URL host as extracted from the URL. For example: <code>www.example.com</code> from <code>www.example.com/download/trouble</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Hostname",
|
||||
"type_name": "Hostname"
|
||||
},
|
||||
"query_string": {
|
||||
"type": "string_t",
|
||||
"description": "The query portion of the URL. For example: the query portion of the URL <code>http://www.example.com/search?q=bad&sort=date</code> is <code>q=bad&sort=date</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "HTTP Query String",
|
||||
"type_name": "String"
|
||||
},
|
||||
"categories": {
|
||||
"type": "string_t",
|
||||
"description": "The Website categorization names, as defined by <code>category_ids</code> enum values.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"caption": "Website Categorization",
|
||||
"type_name": "String"
|
||||
},
|
||||
"category_ids": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"60": {
|
||||
"caption": "Real Estate"
|
||||
},
|
||||
"93": {
|
||||
"caption": "Sexual Expression"
|
||||
},
|
||||
"32": {
|
||||
"caption": "Brokerage/Trading"
|
||||
},
|
||||
"15": {
|
||||
"caption": "Weapons"
|
||||
},
|
||||
"37": {
|
||||
"caption": "Health"
|
||||
},
|
||||
"5": {
|
||||
"caption": "Intimate Apparel/Swimsuit"
|
||||
},
|
||||
"102": {
|
||||
"caption": "Potentially Unwanted Software"
|
||||
},
|
||||
"47": {
|
||||
"caption": "Personals/Dating"
|
||||
},
|
||||
"20": {
|
||||
"caption": "Entertainment"
|
||||
},
|
||||
"16": {
|
||||
"caption": "Abortion"
|
||||
},
|
||||
"101": {
|
||||
"caption": "Spam"
|
||||
},
|
||||
"109": {
|
||||
"caption": "Internet Connected Devices"
|
||||
},
|
||||
"85": {
|
||||
"caption": "Office/Business Applications"
|
||||
},
|
||||
"31": {
|
||||
"caption": "Financial Services"
|
||||
},
|
||||
"25": {
|
||||
"caption": "Controlled Substances"
|
||||
},
|
||||
"114": {
|
||||
"caption": "TV/Video Streams"
|
||||
},
|
||||
"36": {
|
||||
"caption": "Political/Social Advocacy"
|
||||
},
|
||||
"63": {
|
||||
"caption": "Personal Sites"
|
||||
},
|
||||
"22": {
|
||||
"caption": "Alternative Spirituality/Belief"
|
||||
},
|
||||
"59": {
|
||||
"caption": "Auctions"
|
||||
},
|
||||
"34": {
|
||||
"caption": "Government/Legal"
|
||||
},
|
||||
"27": {
|
||||
"caption": "Education"
|
||||
},
|
||||
"99": {
|
||||
"description": "The Domain/URL category is not mapped. See the <code>categories</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"118": {
|
||||
"caption": "Piracy/Copyright Concerns"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Sex Education"
|
||||
},
|
||||
"45": {
|
||||
"caption": "Job Search/Careers"
|
||||
},
|
||||
"90": {
|
||||
"caption": "Uncategorized"
|
||||
},
|
||||
"56": {
|
||||
"caption": "File Storage/Sharing"
|
||||
},
|
||||
"29": {
|
||||
"caption": "Charitable Organizations"
|
||||
},
|
||||
"67": {
|
||||
"caption": "Vehicles"
|
||||
},
|
||||
"65": {
|
||||
"caption": "Sports/Recreation"
|
||||
},
|
||||
"24": {
|
||||
"caption": "Tobacco"
|
||||
},
|
||||
"83": {
|
||||
"caption": "Peer-to-Peer (P2P)"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Adult/Mature Content"
|
||||
},
|
||||
"66": {
|
||||
"caption": "Travel"
|
||||
},
|
||||
"57": {
|
||||
"caption": "Remote Access Tools"
|
||||
},
|
||||
"97": {
|
||||
"caption": "Content Servers"
|
||||
},
|
||||
"92": {
|
||||
"caption": "Suspicious"
|
||||
},
|
||||
"38": {
|
||||
"caption": "Technology/Internet"
|
||||
},
|
||||
"111": {
|
||||
"caption": "Online Meetings"
|
||||
},
|
||||
"51": {
|
||||
"caption": "Chat (IM)/SMS"
|
||||
},
|
||||
"52": {
|
||||
"caption": "Email"
|
||||
},
|
||||
"46": {
|
||||
"caption": "News/Media"
|
||||
},
|
||||
"23": {
|
||||
"caption": "Alcohol"
|
||||
},
|
||||
"14": {
|
||||
"caption": "Violence/Hate/Racism"
|
||||
},
|
||||
"87": {
|
||||
"caption": "For Kids"
|
||||
},
|
||||
"89": {
|
||||
"caption": "Web Hosting"
|
||||
},
|
||||
"88": {
|
||||
"caption": "Web Ads/Analytics"
|
||||
},
|
||||
"107": {
|
||||
"caption": "Informational"
|
||||
},
|
||||
"61": {
|
||||
"caption": "Society/Daily Living"
|
||||
},
|
||||
"113": {
|
||||
"caption": "Radio/Audio Streams"
|
||||
},
|
||||
"103": {
|
||||
"caption": "Dynamic DNS Host"
|
||||
},
|
||||
"121": {
|
||||
"caption": "Marijuana"
|
||||
},
|
||||
"86": {
|
||||
"caption": "Proxy Avoidance"
|
||||
},
|
||||
"55": {
|
||||
"caption": "Social Networking"
|
||||
},
|
||||
"49": {
|
||||
"caption": "Reference"
|
||||
},
|
||||
"106": {
|
||||
"caption": "E-Card/Invitations"
|
||||
},
|
||||
"7": {
|
||||
"caption": "Extreme"
|
||||
},
|
||||
"98": {
|
||||
"caption": "Placeholders"
|
||||
},
|
||||
"112": {
|
||||
"caption": "Media Sharing"
|
||||
},
|
||||
"40": {
|
||||
"caption": "Search Engines/Portals"
|
||||
},
|
||||
"58": {
|
||||
"caption": "Shopping"
|
||||
},
|
||||
"17": {
|
||||
"caption": "Hacking"
|
||||
},
|
||||
"6": {
|
||||
"caption": "Nudity"
|
||||
},
|
||||
"44": {
|
||||
"caption": "Malicious Outbound Data/Botnets"
|
||||
},
|
||||
"3": {
|
||||
"caption": "Pornography"
|
||||
},
|
||||
"110": {
|
||||
"caption": "Internet Telephony"
|
||||
},
|
||||
"26": {
|
||||
"caption": "Child Pornography"
|
||||
},
|
||||
"50": {
|
||||
"caption": "Mixed Content/Potentially Adult"
|
||||
},
|
||||
"30": {
|
||||
"caption": "Art/Culture"
|
||||
},
|
||||
"95": {
|
||||
"caption": "Translation"
|
||||
},
|
||||
"18": {
|
||||
"caption": "Phishing"
|
||||
},
|
||||
"0": {
|
||||
"description": "The Domain/URL category is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"71": {
|
||||
"caption": "Software Downloads"
|
||||
},
|
||||
"53": {
|
||||
"caption": "Newsgroups/Forums"
|
||||
},
|
||||
"35": {
|
||||
"caption": "Military"
|
||||
},
|
||||
"54": {
|
||||
"caption": "Religion"
|
||||
},
|
||||
"43": {
|
||||
"caption": "Malicious Sources/Malnets"
|
||||
},
|
||||
"84": {
|
||||
"caption": "Audio/Video Clips"
|
||||
},
|
||||
"64": {
|
||||
"caption": "Restaurants/Dining/Food"
|
||||
},
|
||||
"21": {
|
||||
"caption": "Business/Economy"
|
||||
},
|
||||
"11": {
|
||||
"caption": "Gambling"
|
||||
},
|
||||
"68": {
|
||||
"caption": "Humor/Jokes"
|
||||
},
|
||||
"108": {
|
||||
"caption": "Computer/Information Security"
|
||||
},
|
||||
"9": {
|
||||
"caption": "Scam/Questionable/Illegal"
|
||||
},
|
||||
"96": {
|
||||
"caption": "Non-Viewable/Infrastructure"
|
||||
},
|
||||
"33": {
|
||||
"caption": "Games"
|
||||
}
|
||||
},
|
||||
"description": "The Website categorization identifiers.",
|
||||
"is_array": true,
|
||||
"requirement": "recommended",
|
||||
"caption": "Website Categorization IDs",
|
||||
"sibling": "categories",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"resource_type": {
|
||||
"type": "string_t",
|
||||
"description": "The context in which a resource was retrieved in a web request.",
|
||||
"requirement": "optional",
|
||||
"caption": "Resource Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"subdomain": {
|
||||
"type": "string_t",
|
||||
"description": "The subdomain portion of the URL. For example: <code>sub</code> in <code>https://sub.example.com</code> or <code>sub2.sub1</code> in <code>https://sub2.sub1.example.com</code>.",
|
||||
"requirement": "optional",
|
||||
"caption": "Subdomain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"url_string": {
|
||||
"type": "url_t",
|
||||
"description": "The URL string. See RFC 1738. For example: <code>http://www.example.com/download/trouble.exe</code>. Note: The URL path should not populate the URL string.",
|
||||
"requirement": "recommended",
|
||||
"caption": "URL String",
|
||||
"type_name": "URL String"
|
||||
}
|
||||
},
|
||||
"name": "url",
|
||||
"description": "The Uniform Resource Locator (URL) object describes the characteristics of a URL.",
|
||||
"extends": "object",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"url_string",
|
||||
"path"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "Defined in RFC 1738",
|
||||
"url": "https://datatracker.ietf.org/doc/html/rfc1738"
|
||||
},
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:URL",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:URL/"
|
||||
}
|
||||
],
|
||||
"caption": "Uniform Resource Locator",
|
||||
"observable": 23
|
||||
}
|
||||
@@ -1,234 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"name": {
|
||||
"type": "username_t",
|
||||
"description": "The username. For example, <code>janedoe1</code>.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Name",
|
||||
"type_name": "User Name"
|
||||
},
|
||||
"type": {
|
||||
"type": "string_t",
|
||||
"description": "The type of the user. For example, System, AWS IAM User, etc.",
|
||||
"requirement": "optional",
|
||||
"caption": "Type",
|
||||
"type_name": "String"
|
||||
},
|
||||
"domain": {
|
||||
"type": "string_t",
|
||||
"description": "The domain where the user is defined. For example: the LDAP or Active Directory domain.",
|
||||
"requirement": "optional",
|
||||
"caption": "Domain",
|
||||
"type_name": "String"
|
||||
},
|
||||
"uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique user identifier. For example, the Windows user SID, ActiveDirectory DN or AWS user ARN.",
|
||||
"requirement": "recommended",
|
||||
"caption": "Unique ID",
|
||||
"type_name": "String",
|
||||
"observable": 31
|
||||
},
|
||||
"groups": {
|
||||
"type": "object_t",
|
||||
"description": "The administrative groups to which the user belongs.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"object_type": "group",
|
||||
"object_name": "Group",
|
||||
"caption": "Groups"
|
||||
},
|
||||
"org": {
|
||||
"type": "object_t",
|
||||
"description": "Organization and org unit related to the user.",
|
||||
"requirement": "optional",
|
||||
"object_type": "organization",
|
||||
"object_name": "Organization",
|
||||
"caption": "Organization"
|
||||
},
|
||||
"full_name": {
|
||||
"type": "string_t",
|
||||
"description": "The full name of the user, as reported by the product.",
|
||||
"requirement": "optional",
|
||||
"caption": "Full Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"type_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"description": "System account. For example, Windows computer accounts with a trailing dollar sign ($).",
|
||||
"caption": "System"
|
||||
},
|
||||
"0": {
|
||||
"description": "The type is unknown.",
|
||||
"caption": "Unknown"
|
||||
},
|
||||
"1": {
|
||||
"description": "Regular user account.",
|
||||
"caption": "User"
|
||||
},
|
||||
"2": {
|
||||
"description": "Admin/root user account.",
|
||||
"caption": "Admin"
|
||||
},
|
||||
"99": {
|
||||
"description": "The type is not mapped. See the <code>type</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"description": "Service account. For example, Windows service account.",
|
||||
"caption": "Service"
|
||||
}
|
||||
},
|
||||
"description": "The account type identifier.",
|
||||
"requirement": "recommended",
|
||||
"sibling": "type",
|
||||
"caption": "Type ID",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"account": {
|
||||
"type": "object_t",
|
||||
"description": "The user's account or the account associated with the user.",
|
||||
"requirement": "optional",
|
||||
"object_type": "account",
|
||||
"object_name": "Account",
|
||||
"caption": "Account"
|
||||
},
|
||||
"credential_uid": {
|
||||
"type": "string_t",
|
||||
"description": "The unique identifier of the user's credential. For example, AWS Access Key ID.",
|
||||
"requirement": "optional",
|
||||
"@deprecated": {
|
||||
"message": "Use <code>programmatic_credentials</code> instead.",
|
||||
"since": "1.6.0"
|
||||
},
|
||||
"caption": "User Credential ID",
|
||||
"type_name": "String",
|
||||
"observable": 19
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string_t",
|
||||
"description": "The display name of the user, as reported by the product.",
|
||||
"requirement": "optional",
|
||||
"caption": "Display Name",
|
||||
"type_name": "String"
|
||||
},
|
||||
"email_addr": {
|
||||
"type": "email_t",
|
||||
"description": "The user's primary email address.",
|
||||
"requirement": "optional",
|
||||
"caption": "Email Address",
|
||||
"type_name": "Email Address"
|
||||
},
|
||||
"forward_addr": {
|
||||
"type": "email_t",
|
||||
"description": "The user's forwarding email address.",
|
||||
"requirement": "optional",
|
||||
"caption": "Forwarding Address",
|
||||
"type_name": "Email Address"
|
||||
},
|
||||
"has_mfa": {
|
||||
"type": "boolean_t",
|
||||
"description": "The user has a multi-factor or secondary-factor device assigned.",
|
||||
"requirement": "recommended",
|
||||
"caption": "MFA Assigned",
|
||||
"type_name": "Boolean"
|
||||
},
|
||||
"ldap_person": {
|
||||
"type": "object_t",
|
||||
"description": "The additional LDAP attributes that describe a person.",
|
||||
"requirement": "optional",
|
||||
"object_type": "ldap_person",
|
||||
"object_name": "LDAP Person",
|
||||
"caption": "LDAP Person"
|
||||
},
|
||||
"phone_number": {
|
||||
"type": "string_t",
|
||||
"description": "The telephone number of the user.",
|
||||
"requirement": "optional",
|
||||
"caption": "Telephone Number",
|
||||
"type_name": "String"
|
||||
},
|
||||
"programmatic_credentials": {
|
||||
"type": "object_t",
|
||||
"description": "Details about the programmatic credential (API keys, access tokens, certificates, etc) associated to the user.",
|
||||
"is_array": true,
|
||||
"requirement": "optional",
|
||||
"object_type": "programmatic_credential",
|
||||
"object_name": "Programmatic Credential",
|
||||
"caption": "Programmatic Credentials"
|
||||
},
|
||||
"risk_level": {
|
||||
"type": "string_t",
|
||||
"description": "The risk level, normalized to the caption of the risk_level_id value.",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Level",
|
||||
"type_name": "String"
|
||||
},
|
||||
"risk_level_id": {
|
||||
"type": "integer_t",
|
||||
"enum": {
|
||||
"3": {
|
||||
"caption": "High"
|
||||
},
|
||||
"0": {
|
||||
"caption": "Info"
|
||||
},
|
||||
"1": {
|
||||
"caption": "Low"
|
||||
},
|
||||
"2": {
|
||||
"caption": "Medium"
|
||||
},
|
||||
"99": {
|
||||
"description": "The risk level is not mapped. See the <code>risk_level</code> attribute, which contains a data source specific value.",
|
||||
"caption": "Other"
|
||||
},
|
||||
"4": {
|
||||
"caption": "Critical"
|
||||
}
|
||||
},
|
||||
"description": "The normalized risk level id.",
|
||||
"requirement": "optional",
|
||||
"sibling": "risk_level",
|
||||
"caption": "Risk Level ID",
|
||||
"type_name": "Integer",
|
||||
"suppress_checks": [
|
||||
"enum_convention"
|
||||
]
|
||||
},
|
||||
"risk_score": {
|
||||
"type": "integer_t",
|
||||
"description": "The risk score as reported by the event source.",
|
||||
"requirement": "optional",
|
||||
"caption": "Risk Score",
|
||||
"type_name": "Integer"
|
||||
},
|
||||
"uid_alt": {
|
||||
"type": "string_t",
|
||||
"description": "The alternate user identifier. For example, the Active Directory user GUID or AWS user Principal ID.",
|
||||
"requirement": "optional",
|
||||
"caption": "Alternate ID",
|
||||
"type_name": "String"
|
||||
}
|
||||
},
|
||||
"name": "user",
|
||||
"description": "The User object describes the characteristics of a user/person or a security principal.",
|
||||
"extends": "_entity",
|
||||
"constraints": {
|
||||
"at_least_one": [
|
||||
"account",
|
||||
"name",
|
||||
"uid"
|
||||
]
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
"description": "D3FEND\u2122 Ontology d3f:UserAccount",
|
||||
"url": "https://d3fend.mitre.org/dao/artifact/d3f:UserAccount/"
|
||||
}
|
||||
],
|
||||
"caption": "User",
|
||||
"observable": 21
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"attributes": {
|
||||
"ai_model": {
|
||||
"type": "object_t",
|
||||
"description": "The AI Model object describes the characteristics of an AI/ML model. Examples include language models like GPT-4, embedding models like text-embedding-ada-002, and computer vision models like CLIP.",
|
||||
"group": "context",
|
||||
"requirement": "recommended",
|
||||
"caption": "AI Model",
|
||||
"object_type": "ai_model",
|
||||
"object_name": "AI Model"
|
||||
},
|
||||
"message_context": {
|
||||
"type": "object_t",
|
||||
"description": "Communication context for AI system interactions including protocols, roles, clients, and session information for MCP and other AI communication systems.",
|
||||
"group": "context",
|
||||
"requirement": "optional",
|
||||
"caption": "Message Context",
|
||||
"object_type": "message_context",
|
||||
"object_name": "Message Context"
|
||||
}
|
||||
},
|
||||
"meta": "profile",
|
||||
"name": "ai_operation",
|
||||
"description": "AI-specific attributes for model operations, retrieval systems, and agent activities. e.g. model_name, total_token_counts etc.",
|
||||
"caption": "AI Operation"
|
||||
}
|
||||
@@ -231,10 +231,6 @@ mod tests {
|
||||
use crate::builders::{test_gateway_context, test_sandbox_context};
|
||||
use crate::enums::{HttpMethod, UserTypeId};
|
||||
use crate::objects::Url;
|
||||
use crate::validation::schema::{
|
||||
load_class_schema, load_object_schema, validate_enum_value, validate_known_fields,
|
||||
validate_required_fields,
|
||||
};
|
||||
|
||||
fn gateway_denial() -> serde_json::Value {
|
||||
let ctx = test_gateway_context();
|
||||
@@ -261,41 +257,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn gateway_denial_matches_vendored_schema() {
|
||||
let json = gateway_denial();
|
||||
|
||||
let class = load_class_schema("api_activity");
|
||||
validate_required_fields(&json, &class);
|
||||
validate_known_fields(&json, &class);
|
||||
for field in [
|
||||
"activity_id",
|
||||
"action_id",
|
||||
"disposition_id",
|
||||
"severity_id",
|
||||
"status_id",
|
||||
] {
|
||||
validate_enum_value(&json, field, &class);
|
||||
}
|
||||
|
||||
let actor = load_object_schema("actor");
|
||||
validate_required_fields(&json["actor"], &actor);
|
||||
validate_known_fields(&json["actor"], &actor);
|
||||
let user = load_object_schema("user");
|
||||
validate_required_fields(&json["actor"]["user"], &user);
|
||||
validate_known_fields(&json["actor"]["user"], &user);
|
||||
|
||||
let api = load_object_schema("api");
|
||||
validate_required_fields(&json["api"], &api);
|
||||
validate_known_fields(&json["api"], &api);
|
||||
let service = load_object_schema("service");
|
||||
validate_required_fields(&json["api"]["service"], &service);
|
||||
|
||||
let resource = load_object_schema("resource_details");
|
||||
validate_required_fields(&json["resources"][0], &resource);
|
||||
validate_known_fields(&json["resources"][0], &resource);
|
||||
|
||||
let metadata = load_object_schema("metadata");
|
||||
validate_required_fields(&json["metadata"], &metadata);
|
||||
validate_known_fields(&json["metadata"], &metadata);
|
||||
openshell_ocsf_validate::validate_event(&gateway_denial())
|
||||
.unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -140,10 +140,7 @@ mod tests {
|
||||
use crate::builders::test_sandbox_context;
|
||||
use crate::enums::{HttpMethod, UserTypeId};
|
||||
use crate::objects::Url;
|
||||
use crate::validation::schema::{
|
||||
load_class_schema, load_object_schema, validate_enum_value, validate_known_fields,
|
||||
validate_required_fields,
|
||||
};
|
||||
use openshell_ocsf_validate::validate_event;
|
||||
|
||||
fn gateway_failure() -> serde_json::Value {
|
||||
let ctx = test_sandbox_context();
|
||||
@@ -171,37 +168,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn failure_event_matches_vendored_schema() {
|
||||
let json = gateway_failure();
|
||||
|
||||
let class = load_class_schema("authentication");
|
||||
validate_required_fields(&json, &class);
|
||||
validate_known_fields(&json, &class);
|
||||
for field in [
|
||||
"activity_id",
|
||||
"action_id",
|
||||
"auth_protocol_id",
|
||||
"disposition_id",
|
||||
"severity_id",
|
||||
"status_id",
|
||||
] {
|
||||
validate_enum_value(&json, field, &class);
|
||||
}
|
||||
|
||||
let user = load_object_schema("user");
|
||||
validate_required_fields(&json["user"], &user);
|
||||
validate_known_fields(&json["user"], &user);
|
||||
validate_enum_value(&json["user"], "type_id", &user);
|
||||
|
||||
let service = load_object_schema("service");
|
||||
validate_required_fields(&json["service"], &service);
|
||||
validate_known_fields(&json["service"], &service);
|
||||
|
||||
let endpoint = load_object_schema("network_endpoint");
|
||||
validate_required_fields(&json["src_endpoint"], &endpoint);
|
||||
|
||||
let url = load_object_schema("url");
|
||||
validate_required_fields(&json["http_request"]["url"], &url);
|
||||
validate_known_fields(&json["http_request"]["url"], &url);
|
||||
validate_event(&gateway_failure()).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -252,11 +219,7 @@ mod tests {
|
||||
.to_json()
|
||||
.unwrap();
|
||||
|
||||
let endpoint = load_object_schema("network_endpoint");
|
||||
validate_known_fields(&json["src_endpoint"], &endpoint);
|
||||
let metadata = load_object_schema("metadata");
|
||||
validate_required_fields(&json["metadata"], &metadata);
|
||||
validate_known_fields(&json["metadata"], &metadata);
|
||||
validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
assert_eq!(
|
||||
json["src_endpoint"],
|
||||
serde_json::json!({"name": "edge-tunnel"})
|
||||
|
||||
@@ -422,29 +422,16 @@ mod tests {
|
||||
assert_ne!(uid, "sandbox-abc123");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_emitted_device_matches_vendored_schema() {
|
||||
use crate::validation::schema::{
|
||||
load_object_schema, validate_enum_value, validate_required_fields,
|
||||
};
|
||||
|
||||
let device = serde_json::to_value(test_sandbox_context().device()).unwrap();
|
||||
let schema = load_object_schema("device");
|
||||
validate_required_fields(&device, &schema);
|
||||
validate_enum_value(&device, "type_id", &schema);
|
||||
}
|
||||
|
||||
/// One event per builder, built with a production-like sandbox context
|
||||
/// (container image set), must validate against the vendored 1.8.0 schemas.
|
||||
#[test]
|
||||
fn every_builder_emits_schema_conformant_events() {
|
||||
use crate::validation::schema::{load_class_schema, validate_required_fields};
|
||||
|
||||
let ctx = test_sandbox_context();
|
||||
let events = sample_events(&ctx);
|
||||
for (class, event) in &events {
|
||||
let json = event.to_json().unwrap();
|
||||
validate_required_fields(&json, &load_class_schema(class));
|
||||
openshell_ocsf_validate::validate_event(&json)
|
||||
.unwrap_or_else(|e| panic!("{class}: {e}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,9 +33,6 @@ pub mod objects;
|
||||
pub mod sanitize;
|
||||
pub mod tracing_layers;
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
pub mod validation;
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
pub mod test_support;
|
||||
|
||||
|
||||
@@ -217,22 +217,19 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn device_os_matches_vendored_schema() {
|
||||
use crate::validation::schema::{
|
||||
load_object_schema, validate_enum_value, validate_known_fields,
|
||||
validate_required_fields,
|
||||
};
|
||||
|
||||
let schema = load_object_schema("os");
|
||||
let mut event = crate::BaseEventBuilder::new(crate::ctx::ctx())
|
||||
.build()
|
||||
.to_json()
|
||||
.unwrap();
|
||||
for device in [
|
||||
Device::linux("sandbox"),
|
||||
Device::windows("sandbox"),
|
||||
Device::for_current_os("sandbox"),
|
||||
Device::gateway("gateway-0", "production"),
|
||||
] {
|
||||
let os = serde_json::to_value(device.os).unwrap();
|
||||
validate_required_fields(&os, &schema);
|
||||
validate_known_fields(&os, &schema);
|
||||
validate_enum_value(&os, "type_id", &schema);
|
||||
event["device"] = serde_json::to_value(&device).unwrap();
|
||||
openshell_ocsf_validate::validate_event(&event)
|
||||
.unwrap_or_else(|e| panic!("{device:?}: {e}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
//! Schema validation utilities for testing OCSF events against vendored schemas.
|
||||
//!
|
||||
//! Available in this crate's tests or through the `test-support` feature for
|
||||
//! producer regression tests.
|
||||
|
||||
mod embedded;
|
||||
pub mod schema;
|
||||
|
||||
pub use schema::{
|
||||
load_class_schema, validate_enum_value, validate_known_fields, validate_required_fields,
|
||||
};
|
||||
@@ -1,539 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
//! Schema loading and validation helpers.
|
||||
|
||||
use serde_json::Value;
|
||||
|
||||
/// Load a vendored OCSF class schema by name.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if the schema file is missing or contains invalid JSON.
|
||||
#[must_use]
|
||||
pub fn load_class_schema(class: &str) -> Value {
|
||||
load_schema(crate::OCSF_VERSION, "classes", class)
|
||||
}
|
||||
|
||||
/// Load a vendored OCSF object schema by name.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if the schema file is missing or contains invalid JSON.
|
||||
#[must_use]
|
||||
pub fn load_object_schema(object: &str) -> Value {
|
||||
load_schema(crate::OCSF_VERSION, "objects", object)
|
||||
}
|
||||
|
||||
/// Schemas are compiled into the binary so that relocated test binaries, such
|
||||
/// as a nextest archive run on another machine, need no files at run time.
|
||||
fn load_schema(version: &str, kind: &str, name: &str) -> Value {
|
||||
let key = format!("v{version}/{kind}/{name}");
|
||||
let Some((_, data)) = super::embedded::SCHEMAS
|
||||
.iter()
|
||||
.find(|(path, _)| *path == key)
|
||||
else {
|
||||
panic!("Missing vendored schema: schemas/ocsf/{key}.json");
|
||||
};
|
||||
serde_json::from_str(data).unwrap_or_else(|e| panic!("Invalid JSON in {key}: {e}"))
|
||||
}
|
||||
|
||||
/// Attribute definitions keyed by name; the schema server emits them as an
|
||||
/// object or as an array of single-entry objects.
|
||||
fn attribute_map(schema: &Value) -> serde_json::Map<String, Value> {
|
||||
match schema.get("attributes") {
|
||||
Some(Value::Object(map)) => map.clone(),
|
||||
Some(Value::Array(arr)) => arr
|
||||
.iter()
|
||||
.filter_map(Value::as_object)
|
||||
.flat_map(|obj| obj.iter().map(|(k, v)| (k.clone(), v.clone())))
|
||||
.collect(),
|
||||
_ => serde_json::Map::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Profiles that add an attribute, or `None` when the attribute is part of the
|
||||
/// base class or object.
|
||||
fn attribute_profiles(def: &Value) -> Option<Vec<&str>> {
|
||||
match def.get("profiles").or_else(|| def.get("profile")) {
|
||||
Some(Value::Array(names)) => Some(names.iter().filter_map(Value::as_str).collect()),
|
||||
Some(Value::String(name)) => Some(vec![name.as_str()]),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn declared_profiles(event: &Value) -> Vec<&str> {
|
||||
event
|
||||
.pointer("/metadata/profiles")
|
||||
.and_then(Value::as_array)
|
||||
.map(|p| p.iter().filter_map(Value::as_str).collect())
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
/// Validate an OCSF event or object against a vendored schema.
|
||||
///
|
||||
/// Checks, recursively through nested objects: every required attribute is
|
||||
/// present, `at_least_one` constraints hold, and no attribute is undefined.
|
||||
/// For an event class schema the event must also be labelled with
|
||||
/// [`crate::OCSF_VERSION`], profile attributes are required only when the event
|
||||
/// declares that profile, and every profile attribute present must belong to a
|
||||
/// declared profile. An object schema carries no profile declarations, so
|
||||
/// profile membership is checked only from an event.
|
||||
pub fn validate_required_fields(value: &Value, schema: &Value) {
|
||||
validate(value, schema, true);
|
||||
}
|
||||
|
||||
/// Validate that every attribute is defined by the schema, recursively.
|
||||
///
|
||||
/// For an event class schema, profile attributes must also belong to a profile
|
||||
/// the event declares in `metadata.profiles` (none when absent).
|
||||
pub fn validate_known_fields(value: &Value, schema: &Value) {
|
||||
validate(value, schema, false);
|
||||
}
|
||||
|
||||
fn validate(value: &Value, schema: &Value, check_required: bool) {
|
||||
let is_event = schema.get("uid").is_some();
|
||||
if is_event && let Some(version) = value.pointer("/metadata/version") {
|
||||
assert!(
|
||||
version == crate::OCSF_VERSION,
|
||||
"OCSF records must be labelled {}, found {version}",
|
||||
crate::OCSF_VERSION
|
||||
);
|
||||
}
|
||||
let declared = is_event.then(|| declared_profiles(value));
|
||||
let root = if is_event {
|
||||
"event"
|
||||
} else {
|
||||
schema["name"].as_str().unwrap_or("object")
|
||||
};
|
||||
validate_attributes(
|
||||
value,
|
||||
schema,
|
||||
declared.as_deref(),
|
||||
root,
|
||||
is_event,
|
||||
check_required,
|
||||
);
|
||||
}
|
||||
|
||||
/// Top-level attributes `OpenShell` emits that no OCSF version defines, pending a
|
||||
/// design decision. Remove an entry once the emitters stop producing it.
|
||||
/// - `container`: identifies the affected sandbox (NVIDIA/OpenShell#4915).
|
||||
const KNOWN_UNDEFINED_EVENT_ATTRIBUTES: &[&str] = &["container"];
|
||||
|
||||
fn validate_attributes(
|
||||
value: &Value,
|
||||
schema: &Value,
|
||||
declared: Option<&[&str]>,
|
||||
path: &str,
|
||||
event_root: bool,
|
||||
check_required: bool,
|
||||
) {
|
||||
let attrs = attribute_map(schema);
|
||||
let Some(obj) = value.as_object() else {
|
||||
return;
|
||||
};
|
||||
|
||||
if check_required
|
||||
&& let Some(fields) = schema
|
||||
.get("constraints")
|
||||
.and_then(|constraints| constraints.get("at_least_one"))
|
||||
.and_then(Value::as_array)
|
||||
{
|
||||
assert!(
|
||||
fields
|
||||
.iter()
|
||||
.filter_map(Value::as_str)
|
||||
.any(|field| { obj.get(field).is_some_and(|value| !value.is_null()) }),
|
||||
"Missing at_least_one field from {fields:?} in '{path}'"
|
||||
);
|
||||
}
|
||||
|
||||
for name in obj.keys() {
|
||||
if event_root && KNOWN_UNDEFINED_EVENT_ATTRIBUTES.contains(&name.as_str()) {
|
||||
continue;
|
||||
}
|
||||
let Some(def) = attrs.get(name) else {
|
||||
panic!("Undefined attribute '{path}.{name}'");
|
||||
};
|
||||
if let (Some(declared), Some(profiles)) = (declared, attribute_profiles(def)) {
|
||||
assert!(
|
||||
profiles.iter().any(|profile| declared.contains(profile)),
|
||||
"Attribute '{path}.{name}' requires one of the profiles {profiles:?}, declared {declared:?}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for (name, def) in &attrs {
|
||||
let is_required = def.get("requirement").and_then(|r| r.as_str()) == Some("required");
|
||||
// An attribute added by profiles applies only when the event declares one of them.
|
||||
let applies = attribute_profiles(def).is_none_or(|profiles| {
|
||||
declared.is_some_and(|declared| profiles.iter().any(|p| declared.contains(p)))
|
||||
});
|
||||
if check_required && is_required && applies {
|
||||
assert!(
|
||||
obj.get(name).is_some_and(|value| !value.is_null()),
|
||||
"Missing required field '{path}.{name}'. Keys: {:?}",
|
||||
obj.keys().collect::<Vec<_>>()
|
||||
);
|
||||
}
|
||||
|
||||
let Some(object_type) = def.get("object_type").and_then(Value::as_str) else {
|
||||
continue;
|
||||
};
|
||||
let Some(child) = obj.get(name) else {
|
||||
continue;
|
||||
};
|
||||
if object_type == "object" {
|
||||
continue;
|
||||
}
|
||||
let child_schema = load_schema(crate::OCSF_VERSION, "objects", object_type);
|
||||
let child_path = format!("{path}.{name}");
|
||||
match child {
|
||||
Value::Array(items) => {
|
||||
for item in items {
|
||||
validate_attributes(
|
||||
item,
|
||||
&child_schema,
|
||||
declared,
|
||||
&child_path,
|
||||
false,
|
||||
check_required,
|
||||
);
|
||||
}
|
||||
}
|
||||
other => validate_attributes(
|
||||
other,
|
||||
&child_schema,
|
||||
declared,
|
||||
&child_path,
|
||||
false,
|
||||
check_required,
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Validate that an enum field in the event has a valid value per the schema.
|
||||
///
|
||||
/// Checks the `enum` map in the schema attribute definition.
|
||||
pub fn validate_enum_value(event: &Value, field: &str, schema: &Value) {
|
||||
if let Some(val) = event.get(field)
|
||||
&& let Some(attrs) = schema.get("attributes").and_then(|a| a.as_object())
|
||||
&& let Some(def) = attrs.get(field)
|
||||
&& let Some(enum_map) = def.get("enum").and_then(|e| e.as_object())
|
||||
{
|
||||
let key = val.to_string();
|
||||
let key = key.trim_matches('"');
|
||||
assert!(
|
||||
enum_map.contains_key(key),
|
||||
"Invalid enum value {val} for field '{field}'. Valid: {:?}",
|
||||
enum_map.keys().collect::<Vec<_>>()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn network_and_http_require_at_least_one_non_null_field() {
|
||||
for (class, fields) in [
|
||||
("network_activity", ["src_endpoint", "dst_endpoint"]),
|
||||
("http_activity", ["http_request", "http_response"]),
|
||||
] {
|
||||
let schema = load_class_schema(class);
|
||||
let mut event = serde_json::json!({
|
||||
"class_uid": schema["uid"], "severity_id": 1,
|
||||
"metadata": {"version": "1.8.0", "product": {"name": "OpenShell", "vendor_name": "NVIDIA"}},
|
||||
"time": 12345, "type_uid": 0, "activity_id": 0, "category_uid": 4
|
||||
});
|
||||
assert!(
|
||||
std::panic::catch_unwind(|| validate_required_fields(&event, &schema)).is_err()
|
||||
);
|
||||
for field in fields {
|
||||
event[field] = Value::Null;
|
||||
assert!(
|
||||
std::panic::catch_unwind(|| validate_required_fields(&event, &schema)).is_err()
|
||||
);
|
||||
event[field] = match field {
|
||||
"http_request" => serde_json::json!({"http_method": "GET"}),
|
||||
"http_response" => serde_json::json!({"code": 200}),
|
||||
_ => serde_json::json!({"ip": "10.0.0.1"}),
|
||||
};
|
||||
validate_required_fields(&event, &schema);
|
||||
event.as_object_mut().unwrap().remove(field);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn minimal_base_event() -> Value {
|
||||
serde_json::json!({
|
||||
"class_uid": 0, "severity_id": 1, "metadata": {"version": "1.8.0", "product": {"name": "OpenShell", "vendor_name": "NVIDIA"}},
|
||||
"time": 12345, "type_uid": 99, "activity_id": 99, "category_uid": 0
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_missing_required_attributes_in_nested_objects() {
|
||||
let schema = load_class_schema("base_event");
|
||||
let mut event = minimal_base_event();
|
||||
event["metadata"]["profiles"] = serde_json::json!(["host"]);
|
||||
event["device"] = serde_json::json!({
|
||||
"hostname": "h", "type_id": 99, "os": {"name": "Linux", "type_id": 200}
|
||||
});
|
||||
validate_required_fields(&event, &schema);
|
||||
event["device"]["os"]
|
||||
.as_object_mut()
|
||||
.unwrap()
|
||||
.remove("type_id");
|
||||
assert!(std::panic::catch_unwind(|| validate_required_fields(&event, &schema)).is_err());
|
||||
}
|
||||
|
||||
fn panic_message(result: std::thread::Result<()>) -> String {
|
||||
let panic = result.expect_err("validation should fail");
|
||||
panic
|
||||
.downcast_ref::<String>()
|
||||
.cloned()
|
||||
.or_else(|| panic.downcast_ref::<&str>().map(ToString::to_string))
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_nested_attributes_of_undeclared_profiles() {
|
||||
let schema = load_class_schema("base_event");
|
||||
let mut event = minimal_base_event();
|
||||
event["device"] = serde_json::json!({
|
||||
"hostname": "h", "type_id": 99, "os": {"name": "Linux", "type_id": 200},
|
||||
"container": {"name": "sandbox"}
|
||||
});
|
||||
event["metadata"]["profiles"] = serde_json::json!(["host", "container"]);
|
||||
validate_required_fields(&event, &schema);
|
||||
|
||||
event["metadata"]["profiles"] = serde_json::json!(["host"]);
|
||||
let message = panic_message(std::panic::catch_unwind(|| {
|
||||
validate_required_fields(&event, &schema);
|
||||
}));
|
||||
assert!(message.contains("event.device.container"), "{message}");
|
||||
assert!(message.contains("container"), "{message}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_schemas_are_validated_as_objects_not_events() {
|
||||
let device = load_object_schema("device");
|
||||
// An object carries no `metadata.profiles`, so profile membership is
|
||||
// not checked: only the event that contains it knows its profiles.
|
||||
let value = serde_json::json!({
|
||||
"hostname": "h", "type_id": 99, "os": {"name": "Linux", "type_id": 200},
|
||||
"namespace_pid": 7
|
||||
});
|
||||
validate_required_fields(&value, &device);
|
||||
|
||||
// The top-level `container` exemption applies to events only, so an
|
||||
// object whose schema does not define `container` rejects it.
|
||||
let user = load_object_schema("user");
|
||||
let value = serde_json::json!({"name": "u", "container": {"name": "sandbox"}});
|
||||
let message = panic_message(std::panic::catch_unwind(|| {
|
||||
validate_required_fields(&value, &user);
|
||||
}));
|
||||
assert!(message.contains("user.container"), "{message}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_records_labelled_with_another_version() {
|
||||
let schema = load_class_schema("base_event");
|
||||
let mut event = minimal_base_event();
|
||||
event["metadata"]["version"] = Value::from("1.1.0");
|
||||
let message = panic_message(std::panic::catch_unwind(|| {
|
||||
validate_required_fields(&event, &schema);
|
||||
}));
|
||||
assert!(message.contains("must be labelled 1.8.0"), "{message}");
|
||||
assert!(message.contains("1.1.0"), "{message}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn known_fields_rejects_undefined_attributes_in_nested_objects() {
|
||||
let schema = load_class_schema("authentication");
|
||||
let mut event = serde_json::json!({
|
||||
"class_uid": 3002,
|
||||
"metadata": {"profiles": []},
|
||||
"user": {"name": "operator"}
|
||||
});
|
||||
validate_known_fields(&event, &schema);
|
||||
|
||||
event["user"]["bogus"] = Value::from(1);
|
||||
let message = panic_message(std::panic::catch_unwind(|| {
|
||||
validate_known_fields(&event, &schema);
|
||||
}));
|
||||
assert!(message.contains("user.bogus"), "{message}");
|
||||
}
|
||||
|
||||
/// Table key for a schema path relative to `schemas/ocsf`, joined with `/` on
|
||||
/// every platform so the generated table is the same on Windows and Unix.
|
||||
fn embedded_schema_key(relative: &std::path::Path) -> String {
|
||||
let joined = relative
|
||||
.components()
|
||||
.map(|component| component.as_os_str().to_string_lossy())
|
||||
.collect::<Vec<_>>()
|
||||
.join("/");
|
||||
joined.trim_end_matches(".json").to_string()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn embedded_schema_keys_use_forward_slashes_on_every_platform() {
|
||||
// `join` uses the native separator, so on Windows this path has backslashes.
|
||||
let relative = std::path::Path::new("v1.8.0")
|
||||
.join("classes")
|
||||
.join("api_activity.json");
|
||||
assert_eq!(
|
||||
embedded_schema_key(&relative),
|
||||
"v1.8.0/classes/api_activity"
|
||||
);
|
||||
}
|
||||
|
||||
/// Regenerate with `UPDATE_OCSF_EMBEDDED_SCHEMAS=1 cargo test -p openshell-ocsf embedded_schemas`.
|
||||
#[test]
|
||||
fn embedded_schemas_match_vendored_files() {
|
||||
let root = concat!(env!("CARGO_MANIFEST_DIR"), "/schemas/ocsf");
|
||||
// This compares source files, so it needs the build checkout. Relocated
|
||||
// test binaries (such as a nextest archive) skip it; validation itself
|
||||
// uses the embedded table and needs no source files.
|
||||
if !std::path::Path::new(root).is_dir() {
|
||||
eprintln!("skipping: source checkout not found at {root}");
|
||||
return;
|
||||
}
|
||||
let mut files = Vec::new();
|
||||
let mut dirs = vec![std::path::PathBuf::from(root)];
|
||||
while let Some(dir) = dirs.pop() {
|
||||
for entry in std::fs::read_dir(&dir).unwrap().flatten() {
|
||||
let path = entry.path();
|
||||
if path.is_dir() {
|
||||
dirs.push(path);
|
||||
} else if path.extension().is_some_and(|ext| ext == "json") {
|
||||
files.push(embedded_schema_key(path.strip_prefix(root).unwrap()));
|
||||
}
|
||||
}
|
||||
}
|
||||
files.sort();
|
||||
|
||||
let mut expected = String::from(
|
||||
"// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n\
|
||||
// SPDX-License-Identifier: Apache-2.0\n\n\
|
||||
//! Vendored OCSF schemas compiled into the binary.\n//!\n\
|
||||
//! @generated from `schemas/ocsf/`. Do not edit; regenerate with\n\
|
||||
//! `UPDATE_OCSF_EMBEDDED_SCHEMAS=1 cargo test -p openshell-ocsf embedded_schemas`.\n\n\
|
||||
#[rustfmt::skip]\npub(super) static SCHEMAS: &[(&str, &str)] = &[\n",
|
||||
);
|
||||
for file in &files {
|
||||
use std::fmt::Write as _;
|
||||
writeln!(
|
||||
expected,
|
||||
" (\"{file}\", include_str!(\"../../schemas/ocsf/{file}.json\")),"
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
expected.push_str("];\n");
|
||||
|
||||
let path = concat!(env!("CARGO_MANIFEST_DIR"), "/src/validation/embedded.rs");
|
||||
if std::env::var_os("UPDATE_OCSF_EMBEDDED_SCHEMAS").is_some() {
|
||||
std::fs::write(path, &expected).unwrap();
|
||||
}
|
||||
// Windows checkouts can convert the generated file to CRLF.
|
||||
let actual = std::fs::read_to_string(path)
|
||||
.unwrap_or_default()
|
||||
.replace("\r\n", "\n");
|
||||
assert!(
|
||||
actual == expected,
|
||||
"embedded.rs is out of date; rerun with UPDATE_OCSF_EMBEDDED_SCHEMAS=1"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn known_fields_rejects_attributes_outside_the_schema() {
|
||||
let schema = load_class_schema("base_event");
|
||||
let mut event = serde_json::json!({"class_uid": 0, "severity_id": 1});
|
||||
validate_known_fields(&event, &schema);
|
||||
|
||||
event["not_an_ocsf_attribute"] = Value::Bool(true);
|
||||
assert!(std::panic::catch_unwind(|| validate_known_fields(&event, &schema)).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn known_fields_rejects_attributes_of_undeclared_profiles() {
|
||||
let schema = load_class_schema("authentication");
|
||||
let mut event = serde_json::json!({
|
||||
"class_uid": 3002,
|
||||
"metadata": {"profiles": ["host"]},
|
||||
"device": {}
|
||||
});
|
||||
validate_known_fields(&event, &schema);
|
||||
|
||||
event["api"] = serde_json::json!({"operation": "Op"});
|
||||
assert!(std::panic::catch_unwind(|| validate_known_fields(&event, &schema)).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn known_fields_treats_missing_profile_declarations_as_none() {
|
||||
let schema = load_class_schema("authentication");
|
||||
let event = serde_json::json!({
|
||||
"class_uid": 3002,
|
||||
"metadata": {},
|
||||
"api": {"operation": "Op"}
|
||||
});
|
||||
assert!(std::panic::catch_unwind(|| validate_known_fields(&event, &schema)).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_load_class_schemas() {
|
||||
// These tests only pass when the vendored schemas are present
|
||||
let classes = [
|
||||
"network_activity",
|
||||
"http_activity",
|
||||
"ssh_activity",
|
||||
"process_activity",
|
||||
"detection_finding",
|
||||
"application_lifecycle",
|
||||
"device_config_state_change",
|
||||
"api_activity",
|
||||
"authentication",
|
||||
"base_event",
|
||||
];
|
||||
|
||||
for class in &classes {
|
||||
let schema = load_class_schema(class);
|
||||
// Every class schema should have a caption and attributes
|
||||
assert!(
|
||||
schema.get("caption").is_some(),
|
||||
"Schema '{class}' missing 'caption'"
|
||||
);
|
||||
assert!(
|
||||
schema.get("attributes").is_some(),
|
||||
"Schema '{class}' missing 'attributes'"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_required_fields_passes() {
|
||||
let event = serde_json::json!({
|
||||
"class_uid": 0,
|
||||
"severity_id": 1,
|
||||
"metadata": {"version": "1.8.0", "product": {"name": "OpenShell", "vendor_name": "NVIDIA"}},
|
||||
"time": 12345,
|
||||
"type_uid": 99,
|
||||
"activity_id": 99,
|
||||
"category_uid": 0
|
||||
});
|
||||
let schema = load_class_schema("base_event");
|
||||
// This should not panic — base_event has few required fields
|
||||
validate_required_fields(&event, &schema);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_enum_value_valid() {
|
||||
let event = serde_json::json!({ "severity_id": 1 });
|
||||
let schema = load_class_schema("base_event");
|
||||
validate_enum_value(&event, "severity_id", &schema);
|
||||
}
|
||||
}
|
||||
@@ -139,6 +139,7 @@ tokio = { workspace = true, features = ["test-util"] }
|
||||
# would; the feature is test-only and never reaches a release binary.
|
||||
openshell-providers = { path = "../openshell-providers", features = ["example-profiles"] }
|
||||
openshell-ocsf = { path = "../openshell-ocsf", features = ["test-support"] }
|
||||
openshell-ocsf-validate = { path = "../openshell-ocsf-validate" }
|
||||
base64 = { workspace = true }
|
||||
hyper-rustls = { version = "0.27", default-features = false, features = ["native-tokio", "http1", "tls12", "logging"] }
|
||||
rcgen = { workspace = true }
|
||||
|
||||
@@ -5,9 +5,6 @@
|
||||
|
||||
use super::{ConnectionSource, RequestOrigin};
|
||||
use openshell_ocsf::test_support::OcsfCapture;
|
||||
use openshell_ocsf::validation::schema::{
|
||||
load_class_schema, validate_known_fields, validate_required_fields,
|
||||
};
|
||||
use serde_json::Value;
|
||||
use std::future::Future;
|
||||
|
||||
@@ -57,16 +54,14 @@ pub fn assert_redacted(event: &Value, secret: &str) {
|
||||
);
|
||||
}
|
||||
|
||||
fn assert_conforms(event: &Value, class: &str) {
|
||||
let schema = load_class_schema(class);
|
||||
validate_required_fields(event, &schema);
|
||||
validate_known_fields(event, &schema);
|
||||
fn assert_conforms(event: &Value) {
|
||||
openshell_ocsf_validate::validate_event(event).unwrap_or_else(|e| panic!("{e}\n{event}"));
|
||||
}
|
||||
|
||||
/// Assert that `event` is an Authentication failure for `reason` on a
|
||||
/// request to `path`.
|
||||
pub fn assert_authentication_failure(event: &Value, path: &str, reason: &str) {
|
||||
assert_conforms(event, "authentication");
|
||||
assert_conforms(event);
|
||||
assert_eq!(event["class_uid"], 3002, "{event}");
|
||||
assert_eq!(event["activity_id"], 1, "{event}");
|
||||
assert_eq!(event["status_id"], 2, "{event}");
|
||||
@@ -79,7 +74,7 @@ pub fn assert_authentication_failure(event: &Value, path: &str, reason: &str) {
|
||||
|
||||
/// Assert that `event` is an Authentication logon for a request to `path`.
|
||||
pub fn assert_logon(event: &Value, path: &str) {
|
||||
assert_conforms(event, "authentication");
|
||||
assert_conforms(event);
|
||||
assert_eq!(event["class_uid"], 3002, "{event}");
|
||||
assert_eq!(event["activity_id"], 1, "{event}");
|
||||
assert_eq!(event["status_id"], 1, "{event}");
|
||||
@@ -93,7 +88,7 @@ pub fn assert_logon(event: &Value, path: &str) {
|
||||
/// Assert that `event` is an API Activity denial for `reason` on a request
|
||||
/// to `path`.
|
||||
pub fn assert_denial(event: &Value, path: &str, reason: &str) {
|
||||
assert_conforms(event, "api_activity");
|
||||
assert_conforms(event);
|
||||
assert_eq!(event["class_uid"], 6003, "{event}");
|
||||
assert_eq!(event["action_id"], 2, "{event}");
|
||||
assert_eq!(event["disposition_id"], 2, "{event}");
|
||||
@@ -105,7 +100,7 @@ pub fn assert_denial(event: &Value, path: &str, reason: &str) {
|
||||
/// Assert that `finding` is the sandbox boundary finding paired with
|
||||
/// `denial`.
|
||||
pub fn assert_boundary_finding(denial: &Value, finding: &Value) {
|
||||
assert_conforms(finding, "detection_finding");
|
||||
assert_conforms(finding);
|
||||
assert_eq!(finding["class_uid"], 2004, "{finding}");
|
||||
assert_eq!(
|
||||
finding["finding_info"]["uid"], "sandbox-authorization-boundary",
|
||||
|
||||
@@ -69,6 +69,7 @@ openshell-sandbox-backend = { path = "../openshell-sandbox-backend", features =
|
||||
|
||||
openshell-driver-vm = { path = "../openshell-driver-vm", default-features = false, features = ["allocation-tracking"] }
|
||||
openshell-ocsf = { path = "../openshell-ocsf", features = ["test-support"] }
|
||||
openshell-ocsf-validate = { path = "../openshell-ocsf-validate" }
|
||||
openshell-otel = { path = "../openshell-otel" }
|
||||
openshell-supervisor-middleware-builtins = { path = "../openshell-supervisor-middleware-builtins" }
|
||||
opentelemetry_sdk = { workspace = true, features = ["testing"] }
|
||||
|
||||
@@ -397,9 +397,6 @@ mod tests {
|
||||
#[test]
|
||||
fn metadata_events_include_response_for_ocsf18() {
|
||||
use openshell_ocsf::tracing_layers::OcsfJsonlLayer;
|
||||
use openshell_ocsf::validation::{
|
||||
load_class_schema, validate_enum_value, validate_required_fields,
|
||||
};
|
||||
use tracing_subscriber::prelude::*;
|
||||
|
||||
const CHILD: &str = "OPENSHELL_TEST_GCP_METADATA_OCSF_CHILD";
|
||||
@@ -425,7 +422,6 @@ mod tests {
|
||||
return;
|
||||
}
|
||||
|
||||
let schema = load_class_schema("http_activity");
|
||||
for (method, path, headers, expected_code, expected_activity_id) in [
|
||||
("GET", PATH_TOKEN, flavor_headers(), 200, 3),
|
||||
("GET", "/?token=secret-query", Vec::new(), 403, 3),
|
||||
@@ -457,8 +453,7 @@ mod tests {
|
||||
);
|
||||
assert_eq!(json["http_request"]["http_method"], method);
|
||||
assert!(json["http_request"].get("url").is_none());
|
||||
validate_required_fields(&json, &schema);
|
||||
validate_enum_value(&json, "activity_id", &schema);
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4000,15 +4000,11 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn early_http_rejections_include_method_and_response() {
|
||||
use openshell_ocsf::validation::{
|
||||
load_class_schema, validate_enum_value, validate_required_fields,
|
||||
};
|
||||
let ctx = L7EvalContext {
|
||||
host: "example.com".into(),
|
||||
port: 443,
|
||||
..Default::default()
|
||||
};
|
||||
let schema = load_class_schema("http_activity");
|
||||
for (event, method, response_code) in [
|
||||
(
|
||||
build_request_authority_mismatch_event(&ctx, "GET"),
|
||||
@@ -4033,8 +4029,7 @@ mod tests {
|
||||
assert_eq!(json["http_request"]["http_method"], method);
|
||||
assert!(json["http_request"].get("url").is_none());
|
||||
assert_eq!(json["http_response"]["code"], response_code);
|
||||
validate_required_fields(&json, &schema);
|
||||
validate_enum_value(&json, "activity_id", &schema);
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10331,8 +10331,6 @@ network_policies:
|
||||
|
||||
#[test]
|
||||
fn accept_errors_include_the_listening_endpoint() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
let addr = "127.0.0.1:3128".parse().unwrap();
|
||||
let error = std::io::Error::other("accept failed");
|
||||
for action in [
|
||||
@@ -10344,7 +10342,7 @@ network_policies:
|
||||
] {
|
||||
let event = build_accept_error_event(addr, &error, &action);
|
||||
let json = event.to_json().unwrap();
|
||||
validate_required_fields(&json, &load_class_schema("network_activity"));
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
assert_eq!(json["dst_endpoint"]["ip"], "127.0.0.1");
|
||||
assert_eq!(json["dst_endpoint"]["port"], 3128);
|
||||
assert!(json["message"].as_str().unwrap().contains("accept failed"));
|
||||
@@ -10353,23 +10351,18 @@ network_policies:
|
||||
|
||||
#[test]
|
||||
fn connection_errors_include_the_known_peer() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
let peer: SocketAddr = "127.0.0.1:54321".parse().unwrap();
|
||||
let schema = load_class_schema("network_activity");
|
||||
let json = build_connection_error_event(peer, "Proxy connection error".to_string())
|
||||
.to_json()
|
||||
.unwrap();
|
||||
assert_eq!(json["class_uid"], 4001);
|
||||
assert_eq!(json["src_endpoint"]["ip"], "127.0.0.1");
|
||||
assert_eq!(json["src_endpoint"]["port"], 54321);
|
||||
validate_required_fields(&json, &schema);
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn forward_parse_errors_include_http_context_and_peer() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
let peer: SocketAddr = "127.0.0.1:54321".parse().unwrap();
|
||||
let json =
|
||||
build_forward_parse_error_ocsf_event(Some(peer), "GET", "/[INVALID_REQUEST_TARGET]")
|
||||
@@ -10383,7 +10376,7 @@ network_policies:
|
||||
assert_eq!(json["http_response"]["code"], 400);
|
||||
assert_eq!(json["src_endpoint"]["ip"], "127.0.0.1");
|
||||
assert_eq!(json["src_endpoint"]["port"], 54321);
|
||||
validate_required_fields(&json, &load_class_schema("http_activity"));
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -13558,8 +13551,6 @@ network_policies:
|
||||
|
||||
#[test]
|
||||
fn unsupported_forward_scheme_event_omits_request_url() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
let event =
|
||||
build_forward_unsupported_scheme_ocsf_event("GET", "https", "api.example.com", 443);
|
||||
let json = event.to_json().unwrap();
|
||||
@@ -13567,13 +13558,11 @@ network_policies:
|
||||
assert_eq!(json["http_request"]["http_method"], "GET");
|
||||
assert!(json["http_request"].get("url").is_none());
|
||||
assert_eq!(json["http_response"]["code"], 400);
|
||||
validate_required_fields(&json, &load_class_schema("http_activity"));
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn credential_endpoint_mismatch_event_includes_method_and_response() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
let event =
|
||||
build_credential_endpoint_mismatch_event("POST", "api.example.com", 443, "bound");
|
||||
let json = event.to_json().unwrap();
|
||||
@@ -13583,7 +13572,7 @@ network_policies:
|
||||
assert_eq!(json["http_request"]["http_method"], "POST");
|
||||
assert!(json["http_request"].get("url").is_none());
|
||||
assert_eq!(json["http_response"]["code"], 403);
|
||||
validate_required_fields(&json, &load_class_schema("http_activity"));
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -41,6 +41,7 @@ rustix = { workspace = true, features = ["termios"] }
|
||||
openshell-sandbox-backend = { path = "../openshell-sandbox-backend", features = ["test-support"] }
|
||||
|
||||
openshell-ocsf = { path = "../openshell-ocsf", features = ["test-support"] }
|
||||
openshell-ocsf-validate = { path = "../openshell-ocsf-validate" }
|
||||
tempfile = "3"
|
||||
tokio = { workspace = true, features = ["test-util"] }
|
||||
|
||||
|
||||
@@ -1566,8 +1566,6 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn ssh_events_name_their_own_server_socket_and_conform_to_ocsf() {
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
|
||||
// A shared supervisor runs one SSH server per sandbox; each server's
|
||||
// events must name its own socket.
|
||||
for socket in ["/run/openshell/a/ssh.sock", "/run/openshell/b/ssh.sock"] {
|
||||
@@ -1582,7 +1580,7 @@ mod tests {
|
||||
json["dst_endpoint"],
|
||||
serde_json::json!({"name": socket, "svc_name": "ssh"})
|
||||
);
|
||||
validate_required_fields(&json, &load_class_schema("ssh_activity"));
|
||||
openshell_ocsf_validate::validate_event(&json).unwrap_or_else(|e| panic!("{e}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Generated
+282
-2
@@ -17,6 +17,7 @@ dependencies = [
|
||||
"cfg-if",
|
||||
"getrandom 0.3.4",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
]
|
||||
@@ -246,6 +247,21 @@ version = "0.23.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
|
||||
|
||||
[[package]]
|
||||
name = "bit-set"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
|
||||
dependencies = [
|
||||
"bit-vec 0.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bit-vec"
|
||||
version = "0.9.1"
|
||||
@@ -325,12 +341,24 @@ dependencies = [
|
||||
"serde_repr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
||||
|
||||
[[package]]
|
||||
name = "bytecount"
|
||||
version = "0.6.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
@@ -640,6 +668,15 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "email_address"
|
||||
version = "0.2.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "enum-ordinalize"
|
||||
version = "4.4.2"
|
||||
@@ -706,6 +743,17 @@ dependencies = [
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d301f5bf187b3c295fce6468d3875037a0bccc5f6b151c63cac2f85babf21912"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.5.0"
|
||||
@@ -729,6 +777,17 @@ dependencies = [
|
||||
"zlib-rs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fluent-uri"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e"
|
||||
dependencies = [
|
||||
"borrow-or-share",
|
||||
"ref-cast",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flume"
|
||||
version = "0.12.0"
|
||||
@@ -767,6 +826,16 @@ dependencies = [
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fraction"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e246562084dde8ebbcc943b261c406ce4f68e5032ec28029a251a47d6a295500"
|
||||
dependencies = [
|
||||
"num",
|
||||
"num-bigint",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs_extra"
|
||||
version = "1.3.0"
|
||||
@@ -900,9 +969,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"libc",
|
||||
"r-efi 5.3.0",
|
||||
"wasip2",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -975,6 +1046,11 @@ name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashlink"
|
||||
@@ -1449,6 +1525,59 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f622c574a29fb3034a0a90645afee194dfedc75fc124228801b6e77041075bd1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
"data-encoding",
|
||||
"email_address",
|
||||
"fancy-regex",
|
||||
"fraction",
|
||||
"getrandom 0.3.4",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"jsonschema-value",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"strum",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a968fffd387b2ab005bf00c1851f5d26e90df05b6f7ad609ed0d620033cca5e7"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-value"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39b7670345e5ce87371339d13705dbb9276b7e3e934bbe1efa2c6734a1f65a96"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
"fraction",
|
||||
"getrandom 0.3.4",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"serde_json",
|
||||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonwebtoken"
|
||||
version = "10.4.0"
|
||||
@@ -1687,6 +1816,12 @@ dependencies = [
|
||||
"rapidhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74"
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
@@ -1766,6 +1901,20 @@ dependencies = [
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.8"
|
||||
@@ -1776,6 +1925,21 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-cmp"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa"
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-conv"
|
||||
version = "0.2.2"
|
||||
@@ -1791,6 +1955,27 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
@@ -1848,7 +2033,7 @@ dependencies = [
|
||||
"nix",
|
||||
"noyalib",
|
||||
"openshell-crypto",
|
||||
"openshell-ocsf",
|
||||
"openshell-ocsf-validate",
|
||||
"openshell-otel-test-support",
|
||||
"opentelemetry-proto",
|
||||
"prost",
|
||||
@@ -1883,6 +2068,15 @@ dependencies = [
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openshell-ocsf-validate"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"jsonschema",
|
||||
"serde_json",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openshell-otel"
|
||||
version = "0.0.0"
|
||||
@@ -1995,6 +2189,12 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "outref"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
|
||||
|
||||
[[package]]
|
||||
name = "parking"
|
||||
version = "2.2.1"
|
||||
@@ -2303,6 +2503,43 @@ dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ref-cast"
|
||||
version = "1.0.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3"
|
||||
dependencies = [
|
||||
"ref-cast-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ref-cast-impl"
|
||||
version = "1.0.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 3.0.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.58.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "558f3855529c0a7e78a48e409fa653456e55f1b167eab4109c16a255b7727e3f"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.17.1",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.13.1"
|
||||
@@ -2964,6 +3201,27 @@ version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "strum"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd"
|
||||
dependencies = [
|
||||
"strum_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strum_macros"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "subtle"
|
||||
version = "2.6.1"
|
||||
@@ -3379,6 +3637,12 @@ version = "0.3.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-general-category"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.24"
|
||||
@@ -3447,6 +3711,16 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "uuid-simd"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
|
||||
dependencies = [
|
||||
"outref",
|
||||
"vsimd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "valuable"
|
||||
version = "0.1.1"
|
||||
@@ -3465,6 +3739,12 @@ version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||
|
||||
[[package]]
|
||||
name = "vsimd"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
||||
|
||||
[[package]]
|
||||
name = "want"
|
||||
version = "0.3.1"
|
||||
@@ -3758,7 +4038,7 @@ version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282"
|
||||
dependencies = [
|
||||
"bit-vec",
|
||||
"bit-vec 0.9.1",
|
||||
"time",
|
||||
]
|
||||
|
||||
|
||||
+1
-1
@@ -302,7 +302,7 @@ url = "2"
|
||||
nix = { version = "0.29", features = ["process", "signal", "term", "user"] }
|
||||
|
||||
[dev-dependencies]
|
||||
openshell-ocsf = { path = "../../crates/openshell-ocsf", features = ["test-support"] }
|
||||
openshell-ocsf-validate = { path = "../../crates/openshell-ocsf-validate" }
|
||||
serial_test = "3"
|
||||
|
||||
[lints.rust]
|
||||
|
||||
@@ -15,7 +15,6 @@ use std::time::Duration;
|
||||
use openshell_e2e::harness::cli::run_cli;
|
||||
use openshell_e2e::harness::container::{ContainerEngine, ContainerHttpServer};
|
||||
use openshell_e2e::harness::sandbox::SandboxGuard;
|
||||
use openshell_ocsf::validation::{load_class_schema, validate_required_fields};
|
||||
use serde_json::Value;
|
||||
use tempfile::NamedTempFile;
|
||||
|
||||
@@ -101,22 +100,6 @@ network_policies:
|
||||
/// SSH session that runs the traffic).
|
||||
const REQUIRED_CLASSES: [u64; 3] = [4001, 4002, 4007];
|
||||
|
||||
fn class_schema_name(class_uid: u64) -> Option<&'static str> {
|
||||
Some(match class_uid {
|
||||
0 => "base_event",
|
||||
1007 => "process_activity",
|
||||
2004 => "detection_finding",
|
||||
3002 => "authentication",
|
||||
4001 => "network_activity",
|
||||
4002 => "http_activity",
|
||||
4007 => "ssh_activity",
|
||||
5019 => "device_config_state_change",
|
||||
6002 => "application_lifecycle",
|
||||
6003 => "api_activity",
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
async fn set_sandbox_setting(sandbox: &str, key: &str, value: &str) {
|
||||
let (output, code) =
|
||||
run_cli(&["settings", "set", sandbox, "--key", key, "--value", value]).await;
|
||||
@@ -246,28 +229,17 @@ async fn supervisor_jsonl_conforms_to_the_native_schema() {
|
||||
);
|
||||
let mut failures = Vec::new();
|
||||
for record in &records {
|
||||
assert_eq!(
|
||||
record["metadata"]["version"],
|
||||
openshell_ocsf::OCSF_VERSION,
|
||||
"record labelled {}; native validation needs ocsf_schema_version unset \
|
||||
for this sandbox and the gateway",
|
||||
record["metadata"]["version"]
|
||||
);
|
||||
let class_uid = record["class_uid"].as_u64().expect("class_uid");
|
||||
let Some(class) = class_schema_name(class_uid) else {
|
||||
failures.push(format!(
|
||||
"class_uid {class_uid} has no schema mapping in this test"
|
||||
));
|
||||
continue;
|
||||
};
|
||||
let schema = load_class_schema(class);
|
||||
if let Err(panic) = std::panic::catch_unwind(|| validate_required_fields(record, &schema)) {
|
||||
let reason = panic.downcast_ref::<String>().cloned().unwrap_or_default();
|
||||
failures.push(format!(
|
||||
match openshell_ocsf_validate::validate_event(record) {
|
||||
Ok(()) => {}
|
||||
Err(openshell_ocsf_validate::Error::UnsupportedVersion(version)) => panic!(
|
||||
"record labelled {version}; native validation needs ocsf_schema_version unset \
|
||||
for this sandbox and the gateway"
|
||||
),
|
||||
Err(reason) => failures.push(format!(
|
||||
"{} \"{}\": {reason}",
|
||||
record["class_name"],
|
||||
record["message"].as_str().unwrap_or_default()
|
||||
));
|
||||
)),
|
||||
}
|
||||
}
|
||||
assert!(
|
||||
|
||||
Generated
+6
-6
@@ -1787,9 +1787,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -2501,9 +2501,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -4290,6 +4290,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
Generated
+6
-6
@@ -1787,9 +1787,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -2482,9 +2482,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -4264,6 +4264,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
Reference in New Issue
Block a user