Skip to content

security(misp): require affirmative to_ids evidence #168

Description

@seonghobae

Defect

src/misp_import.rs::materialize_attribute historically converted MISP attributes into enforcement material when to_ids was explicitly malformed, and inherited unwrap_or(true) promoted an omitted to_ids member to affirmative IDS evidence. Follow-up primary-source review exposed two lifecycle variants: to_ids=true could still authorize an attribute MISP marked deleted, and a nested actionable attribute could survive deletion or structural ambiguity of its enclosing MISP Object because Wardnet flattened Object attributes without carrying parent lifecycle state.

Primary-source verification defines the boundary. MISP publishes to_ids as boolean, MISP-STIX uses to_ids=True for detection-ready indicator material, MISP REST can return attributes independent of that filter, and MISP separately exposes deletion state for attributes and Objects. Wardnet therefore cannot infer enforcement authorization merely because an attribute arrived, because to_ids remains affirmative after withdrawal, or because a nested attribute appears active while its producer Object is withdrawn.

Acceptance

  • explicit boolean to_ids=true remains admitted and boolean false remains skipped;
  • missing, object, array and null to_ids values fail closed and do not create ThreatIndicator/DnsblEntry rows;
  • existing explicit scalar compatibility ("1", case-insensitive "true", numeric 1) remains unless a separately reviewed contract removes it;
  • attribute-level deleted=true, deleted="1", numeric 1, and structurally unrecognized present deletion state fail closed even when to_ids is affirmative;
  • enclosing Object deleted/ambiguous states cause every nested attribute to fail closed even when the child itself is actionable;
  • recognized active deletion states (false, "0", numeric 0) and omitted deletion state remain active for compatibility;
  • skipped non-affirmative/withdrawn/ambiguous attributes contribute to skipped_attributes;
  • the security decision remains traceable to primary MISP contracts and the repository's accepted fail-safe-default/testing evidence;
  • the exact protected-main-derived candidate obtains current repository and central security/review evidence without weakening policy.

TDD lineage and live owning lane — 2026-09-06 KST

PR #167 remains the owning repair lane. Protected/default main is now a52ccd0a24a727d9349bb32def7713882d8cad1e, and #167 is Draft/mergeable at exact 0c83cd5956f512d79c6600e823fcfa6d6f32af4e with that exact protected base.

The MISP-specific admission/lifecycle repair remains retained in the branch:

  • RED 588102b972e8ccd591a2081ad12aad1c9a028370 introduced malformed structured to_ids cases before the production wildcard repair;
  • RED 8f9c85491adf02c542508920c82dc231ae38033c added omitted to_ids; GREEN 966e8cc1c340d0c1d66c419a95ea1203a36aa76b changed absence to fail closed;
  • RED bdd5f5bae43421f6d306ca8cb1e77af122ccef3a added deleted/malformed attribute lifecycle cases; GREEN 33a8d542b1f71754a521bd599e0351be5cb175ef added the attribute-level lifecycle gate;
  • RED 84c16a2d649833f855f31893df6787007d33c503 captured deleted/ambiguous enclosing Objects; GREEN d67d4cc6e2c73d65d7fbc6515269060d66adbdcc carries parent lifecycle state alongside nested attributes and reuses one fail-closed deletion parser.

The later shared DNSBL snapshot-ownership finding remains correctly outside MISP parser authority and is tracked separately by #172. Its causal shared-boundary repair is now implemented at 7042aa19267886e3af9c378dddd879929837877b; run 34000662730 passed the locked workspace tests, including DNSBL ownership/persistence hostile cases, plus strict workspace Clippy, and the valid review thread has been resolved. #172 remains open until the complete repair reaches protected truth, because source GREEN is not protected integration.

Exact-current execution

Current exact #167 head 0c83cd5956f512d79c6600e823fcfa6d6f32af4e remains non-passing at the merge-evidence layer. CI run 34000987921 is queued; sole rust job 101399700528 has steps=[], labels=[ubuntu-24.04], runner_id=0, and no assigned runner/group. Fuzz 34000988028 and current security/SAST/CodeQL/required-workflow lanes are also non-passing. The exact runner/materialization specimen has been handed to .github#712; no source/no-op redispatch churn or predecessor-evidence promotion is authorized.

Completion gate

Keep #168 open until the retained MISP admission/lifecycle delta reaches protected truth through #167 or a verified successor with exact-current repository/security/review/governance evidence. Keep #172 open independently until its shared DNSBL ownership repair is likewise present in protected truth. Do not close either issue merely because the source defects have causal GREEN commits. No self/model approval, routine bypass, force push, destructive rebase, gate weakening, no-op redispatch churn, or predecessor-evidence reuse.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions