Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@mitre/hdf-extension-graph

Package Overview
Dependencies
Maintainers
2
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mitre/hdf-extension-graph

Bidirectional extension graph processing for HDF profile/baseline hierarchies

latest
Source
npmnpm
Version
3.2.0
Version published
Maintainers
2
Created
Source

@mitre/hdf-extension-graph

Bidirectional extension graph processing for HDF baseline hierarchies.

Why this exists

HDF baseline documents can represent 'overlay' structures that form extension chains of parent baselines and their children. For example, a DISA STIG baseline defines hundreds of requirements; an organizational overlay on that DISA baseline can modify a subset for organization-specific policies; a project overlay can further tighten thresholds for a specific system. When an HDF results file contains multiple baselines linked via parentBaseline, understanding what each layer changed requires walking these chains bidirectionally.

Without this library, answering "did this overlay change the impact of SV-238196, or inherit it unchanged?" requires manually cross-referencing requirements across baselines by ID. The extension graph provides:

  • root — jump from any overlay requirement to the original base definition
  • modifications — which fields (impact, title, severity, effectiveImpact, disposition) an overlay changed relative to its parent
  • isRedundant — whether an overlay re-declares a control without actually changing it
  • fullCode — the complete code from all layers in one string
  • extensionChain — the ordered list of baselines from root to leaf

This is the same graph algorithm that powers Heimdall's control detail panel, extracted as a standalone library.

Installation

pnpm add @mitre/hdf-extension-graph

Requires @mitre/hdf-schema as a peer dependency.

Usage

Build the graph

import { buildExtensionGraph } from '@mitre/hdf-extension-graph';
import type { HdfResults } from '@mitre/hdf-schema';

const hdfResults: HdfResults = JSON.parse(fileContents);
const graph = buildExtensionGraph(hdfResults);

Navigate baselines

// Find root baselines (no parent)
const roots = graph.rootBaselines;

// Find a specific baseline
const stig = graph.findBaseline('rhel9-stig-baseline');

// See what extends it
for (const overlay of stig.extendedBy) {
  console.log(`${overlay.data.name} extends ${stig.data.name}`);
}

Navigate requirements

// Find all instances of a control across all baselines
const controls = graph.findRequirements('SV-238196');

// Get the root (base) control
const root = controls[1].root; // walks up the chain

// Get the full code with all layers
console.log(controls[1].fullCode);
// # my-overlay
// describe sshd_config do
//   its("ClientAliveInterval") { should cmp <= 300 }
// end
//
// # rhel9-stig-baseline
// describe sshd_config do
//   its("ClientAliveInterval") { should cmp <= 600 }
// end

Detect changes

const overlay = graph.baselines[1].requirements[0];

// Is this overlay just inheriting, or did it change something?
if (!overlay.isRedundant) {
  console.log('This overlay modifies the base control');
}

// What specifically changed?
for (const mod of overlay.modifications) {
  console.log(`${mod.field}: ${mod.originalValue}${mod.newValue}`);
}
// impact: 0.5 → 0.9
// title: SSH timeout → SSH timeout (project)

Walk the chain

// Ordered list of baselines from root to current
const chain = overlay.extensionChain;
console.log(chain.map(b => b.data.name));
// ['disa-rhel7-stig', 'cms-rhel7-overlay', 'project-overlay']

API

buildExtensionGraph(results: HdfResults): ExtensionGraph

Builds a bidirectional extension graph from an HDF Results file. Links baselines via parentBaseline and requirements by matching id across linked baselines.

ExtensionGraph

Property / MethodTypeDescription
baselinesContextualizedBaseline[]All baselines in the graph
requirementsContextualizedRequirement[]All requirements across all baselines
rootBaselinesContextualizedBaseline[]Baselines with no parent
findBaseline(name)ContextualizedBaseline | undefinedFind baseline by name
findRequirements(id)ContextualizedRequirement[]Find all requirements with given id

ContextualizedBaseline

PropertyTypeDescription
dataEvaluatedBaselineOriginal baseline data
sourcedFromHdfResultsThe results file this came from
extendsFromContextualizedBaseline[]Parent baselines
extendedByContextualizedBaseline[]Child baselines
requirementsContextualizedRequirement[]Wrapped requirements

ContextualizedRequirement

PropertyTypeDescription
dataEvaluatedRequirementOriginal requirement data
sourcedFromContextualizedBaselineOwning baseline
extendsFromContextualizedRequirement[]Parent requirements
extendedByContextualizedRequirement[]Child requirements
rootContextualizedRequirementBase requirement at bottom of chain
isRedundantbooleanTrue if code is empty or matches root
fullCodestringConcatenated code from all layers
extensionChainContextualizedBaseline[]Baselines from root to leaf
modificationsModification[]Fields changed vs immediate parent

Modification

interface Modification {
  field: string;        // 'impact', 'title', or 'severity'
  originalValue: unknown;
  newValue: unknown;
  inBaseline: string;   // Name of the baseline making the change
}

Notes

  • TypeScript only — there is no Go implementation of hdf-extension-graph.
  • The HDF schemas consumed by this package are documented at https://mitre.github.io/hdf-libs/schemas/.

License

Apache-2.0

Keywords

hdf

FAQs

Package last updated on 26 May 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts