Sharing

Share the record, not a rewrite. Each audience gets exactly its layers.

Today the same issue is retyped for the SOC, the CISO, the group CERT and the vendor, and every copy drifts. A CIR record is written once. Sharing it means filtering it, and the filter is the TLP each layer already carries.

01

The export rule

  1. CLEAR
  2. GREEN
  3. AMBER
  4. AMBER+STRICT
  5. RED
One TLP per layer
Every layer present in a record carries its own tlp. Typically core and threat_intel are CLEAR, posture AMBER, context RED.
Exporting
To send a record to an audience, drop every layer more restrictive than what that audience may receive. Nothing is redacted by hand.
A ceiling
meta.tlp, when set, applies to the whole record: no layer of its own may be less restrictive than it.
Public exports
internal identifiers (ticket, pentest report ID) are forbidden in public records and dropped by any export to a public audience.
02

One record, three exports

CIR-2021-GRP-0003 is a subsidiary's record on Log4Shell. It extends the public CIR-2021-00-0001 and adds its own posture and context.

Publicreceives up to CLEAR
  • coreinherited
  • threat_intelinherited
  • posturedropped
  • contextdropped

What remains is the public parent. Nothing says this subsidiary was ever involved.

Group CERTreceives up to AMBER
  • coreinherited
  • threat_intelinherited
  • posturekept
  • contextdropped

The CERT learns how the entity stands: mitigated, egress filtering blocks, detection partial. Not which asset, nor the incident.

The organizationreceives up to RED
  • coreinherited
  • threat_intelinherited
  • posturekept
  • contextkept

The full record: the customer portal, ticket SEC-3321, the CISO's decision, who was told and when.

03

What the CERT actually receives

  • meta identifies the record and its parent, so the CERT can group every entity's posture on the same issue.
  • entity is a pseudonymous ID the CERT assigned. Never the entity's name.
  • Every value is an enum, a boolean or a date. There is nowhere to write a hostname.
# CIR-2021-GRP-0003, exported for TLP:AMBER. context (RED) was dropped.
cir_version: "0.1"
meta:
  id: CIR-2021-GRP-0003
  based_on: CIR-2021-00-0001
  tlp: AMBER
posture:
  tlp: AMBER
  updated: 2021-12-14
  entity: GRP-ENT-07
  status: { state: mitigated }
  exposure: { reachability: internet, prevalence: common }
  controls:
    - { control: waf, effect: reduces, coverage: partial, validated: true }
    - { control: egress_filtering, effect: blocks, coverage: full, validated: true }
    - { control: edr, effect: detects, coverage: partial, validated: false }
  detection: { capability: partial, layers: [waf, network, endpoint], validated: true }
  impact: { enables: [code_execution, lateral_movement], blast_radius: segment }
  remediation: { feasibility: hard, constraints: [vendor_dependency, legacy] }
04

Why posture is safe to share

The hard rule: posture contains no free text, no numbers and no names. Unknown keys are rejected, so nothing sensitive can slip in by accident. If a need does not fit the enums, the enum is extended in the specification, not worked around in the record.

Valid
  • control: egress_filteringenum
  • prevalence: commonqualitative bucket
  • entity: GRP-ENT-07pseudonymous ID
  • validated: trueboolean
Rejected
  • note: "WAF rule 2231 on portail-clients"unknown key, free text
  • prevalence: 37a count, not a bucket
  • entity: "Filiale Sud"a name
  • control: "F5 ASM"a product, not an enum
05

What a CERT can do with it

Collect the posture of every entity on the same CIR and the picture appears, without a single asset name. For instance, Log4Shell across twelve subsidiaries illustrative figures:

status7 / 12

mitigated, 3 fixed, 2 still affected.

controls6 / 12

block egress, fully and validated: contained.

detection5 / 12

have tested their detection.

context0

assets, tickets or names learned.

The two entities still affected and internet-facing are where the CERT calls first. Their own score tells them the same thing: a KEV-listed issue with an open exposure is never below high.

06

Out to VEX

posture.status is aligned with VEX, so an entity's posture can be published as a VEX statement for its customers or its regulator.

CIR posture.status.stateVEX status
not_affectednot_affected, with the required justification
affectedaffected
mitigatedaffected, with the controls as action statement
fixedfixed
under_investigationunder_investigation