Skip to content

[Feature] BloodHound attack-path risk scoring — the attack-path risk plugin (external data) #940

Description

@WimvandenHeijkant

Summary

Consume BloodHound's attack-path analytics — distance to Tier Zero, node exposure, reachable high-value targets, ADCS ESC findings, choke points — and surface them as risk findings on principals/identities. This is the attack-path plugin already named as "framework-ready, not built here" in docs/architecture/risk-scoring-plugins.mdFuture plugins, flagged needsExternalData).

This is 2 of 3 companion feature requests from a feasibility study (docs/architecture/bloodhound-integration-feasibility.md).`` The three are related but independently buildable.

Plugs into #672

This belongs to the risk-scoring plugin tier being introduced in #672 ("[Refactor] Re-architect risk scoring into a plugin tier — findings + explainability + override"). It's a concrete needsExternalData plugin that fits that framework's finding + reason-context shape. Build order isn't strict, but this plugin lands cleanest on top of #672's plugin substrate.

This was the original motivation

Worth recording: the earlier BloodHound exploration was specifically about pulling risk metrics (attack paths) — not data-source ingestion. That instinct was right; this issue is the clean home for it. The two other companion issues (data ingestion #939, reverse feed) grew out of realizing BloodHound could be more than a risk source — but this remains the place where BloodHound is irreplaceable.

Why BloodHound is irreplaceable here (unlike #939)

The feasibility study sorts BloodHound's graph into three buckets:

  • (A) Authorization facts — memberships, roles, ownership, and control edges (GenericAll, AdminTo, WriteDacl, …). These are data → companion issue [Feature] BloodHound collector file ingestion — one crawler, three dialects (AD / Entra / GitHub / AWS) #939 ingests them.
  • (B) Runtime session telemetry — dropped.
  • (C) Derived attack computations — ESC classifications, shortest-path-to-Tier-Zero, choke-point scores. This is bucket C, and it is BloodHound's unique layer — analytics computed over the graph, not raw data. This issue consumes bucket C as findings.

Bucket C is exactly what a governance product cannot easily compute itself and what makes BloodHound worth talking to.

How

Relationship to the other two issues

Acceptance criteria

  • An attack-path risk plugin registered in the risk-plugin tier ([Refactor] Re-architect risk scoring into a plugin tier (findings + explainability + override) #672), needsExternalData.
  • Configurable BloodHound CE connection (base URL + JWT/HMAC credentials, vaulted).
  • Pulls attack-path metrics via /api/v2 / Cypher / SDK and emits findings on principals/identities with rationale + evidence.
  • Findings only — nothing written to ResourceAssignments.
  • Graceful handling of Cypher endpoint limits / large graphs.
  • Tests per repo conventions (coverage ratchet respected); external dependency mocked.

References

Related feature requests (BloodHound integration set — independent, not interdependent)

  1. Collector file ingestion (data in, no BloodHound needed) — [Feature] BloodHound collector file ingestion — one crawler, three dialects (AD / Entra / GitHub / AWS) #939.
  2. This issue — attack-path risk scoring (plugs into [Refactor] Re-architect risk scoring into a plugin tier (findings + explainability + override) #672).
  3. Reverse feed — export our correlated graph to BloodHound via OpenGraph (data out).

Cross-links in a comment below.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requeststate:awaiting-designIntent clear; needs an architecture/design/UX decision (architect or designer, not requestor)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions