Skip to main content

TIBET Bill Of Hack — dataset-driven operator-side attack inventory with local and SSH collectors, storage, and report export

Project description

tibet-bom — TIBET Bill Of Hack

Every adversarial action indexed. Every operator-side artefact anchored.

tibet-bom is a dataset-driven forensic CLI for turning attack windows into a repeatable Bill Of Hack:

  • what was hit
  • when it was hit
  • where the evidence came from
  • how the substrate classified it
  • which artefacts corroborate the claim

It started with the confirmed Humotica Phase 5 slice, but it now stores and switches between multiple datasets instead of pretending one hardcoded window is the current machine.

What It Is

tibet-bom is now:

  • an executable BOM renderer
  • a local dataset registry
  • an import/collection tool
  • a report export layer

It is not yet a full autodiscovery agent for every host and log source. The current architecture is adapter-driven: collect/import evidence into datasets, then render info, report, json, or markdown against the selected one.

Core Model

Every dataset contains:

  • window metadata
  • evidence host metadata
  • entries
  • artefact hashes
  • time-source disclosure
  • NIS2 context
  • canonical examples

The CLI always distinguishes:

  • Runtime: where you are running tibet-bom
  • Evidence host: the host the BOM dataset actually describes

That avoids the earlier failure mode where a laptop install looked like it was P520.

Installation

From this sandbox directory:

cd /srv/jtel-stack/sandbox/ai/codex/tibet-bom-unit
pip install -e .

Or run the module directly:

PYTHONPATH=src python -m tibet_bom info

Storage

Datasets are stored in:

  • $TIBET_BOM_HOME if set
  • otherwise $XDG_DATA_HOME/tibet-bom when writable
  • otherwise ~/.local/share/tibet-bom when writable
  • otherwise ./.tibet-bom

This fallback chain matters on restricted systems where $HOME is not writable.

Commands

Render commands:

tibet-bom info
tibet-bom table
tibet-bom timeline
tibet-bom report
tibet-bom artifacts
tibet-bom time-source
tibet-bom json
tibet-bom markdown

Dataset commands:

tibet-bom datasets
tibet-bom use phase5-confirmed
tibet-bom collect fixture-phase5 --set-active
tibet-bom collect json --file ./dataset.json --set-active
tibet-bom collect bundle --path ./evidence-bundle --set-active
tibet-bom collect nginx --name edge --log /var/log/nginx/access.log --set-active
tibet-bom collect journald --name mux --unit staging-brain-api.service --since "2026-05-04 12:00:00"
tibet-bom collect postgres --name phase5-db --dbname jtel_security --query-file ./phase5.sql
tibet-bom collect ssh-journald --name remote-mux --ssh-host p520 --unit staging-brain-api.service
tibet-bom collect ssh-nginx --name remote-nginx --ssh-host p520 --log /var/log/nginx/access.log
tibet-bom collect ssh-postgres --name remote-db --ssh-host p520 --dbname jtel_security --query-file ./phase5.sql

Runtime collection:

tibet-bom collect runtime \
  --name may8-lab \
  --set-active \
  --evidence-host "lab-host-01" \
  --actor "10.0.0.7" \
  --window-start "2026-05-08 12:00:00 UTC" \
  --window-end "2026-05-08 12:05:00 UTC" \
  --duration "~5 minutes" \
  --db-asc "10-17" \
  --db-desc "300-293" \
  --chain-route-status "typed views verified; public route unknown" \
  --surface-label "TIBET signing surface" \
  --surface-label "AINS lookup surface" \
  --entry-json ./entries.json \
  --artifact /var/log/nginx/access.log \
  --time-source-json ./time-source.json \
  --nis2-json ./nis2.json \
  --canonical-json ./canonical.json

Native collectors:

tibet-bom collect nginx \
  --name p520-nginx \
  --log /var/log/nginx/redbaron-nightfall.log.1 \
  --log /var/log/nginx/redbaron-nightfall.log.2.gz \
  --path-contains /api/ \
  --status-min 400 \
  --evidence-host "P520 staging (10.0.100.2)" \
  --set-active

tibet-bom collect journald \
  --name p520-mux \
  --unit staging-brain-api.service \
  --since "2026-05-04 12:00:00" \
  --until "2026-05-04 13:00:00" \
  --grep MUX \
  --evidence-host "P520 staging (10.0.100.2)"

tibet-bom collect postgres \
  --name p520-db \
  --dbname jtel_security \
  --query-file ./phase5.sql \
  --evidence-host "P520 staging (10.0.100.2)"

Remote collectors:

tibet-bom collect ssh-journald \
  --name p520-mux-remote \
  --ssh-host 10.0.100.2 \
  --ssh-user root \
  --unit staging-brain-api.service \
  --since "2026-05-04 12:00:00" \
  --grep MUX \
  --evidence-host "P520 staging (10.0.100.2)"

tibet-bom collect ssh-nginx \
  --name p520-nginx-remote \
  --ssh-host 10.0.100.2 \
  --ssh-user root \
  --log /var/log/nginx/redbaron-nightfall.log.1 \
  --log /var/log/nginx/redbaron-nightfall.log.2.gz \
  --path-contains /api/ \
  --status-min 400

tibet-bom collect ssh-postgres \
  --name p520-db-remote \
  --ssh-host 10.0.100.2 \
  --ssh-user root \
  --dbname jtel_security \
  --query-file ./phase5.sql

Evidence Bundle Convention

collect bundle --path DIR looks for:

  • metadata.json
  • entries.json or entries.jsonl
  • optional artifact_hashes.json
  • optional time_source.json
  • optional surface_labels.json
  • optional nis2_context.json
  • optional canonical_examples.json

This makes it easy to package incident exports per machine and per situation.

Built-In Dataset

The package still ships with one built-in confirmed dataset:

  • dataset: phase5-confirmed
  • evidence host: P520 staging (10.0.100.2)
  • actor: 10.0.100.11
  • window: 2026-05-04 12:27:24 UTC -> 2026-05-04 12:29:39 UTC
  • absolute DB positions: 407-423

This remains useful as:

  • a reference dataset
  • a regression fixture
  • a publishable example of a complete BOM

Time-Source Position

TIBET-BOM does not treat NTP as the source of truth for event order.

Primary truth:

  • TIBET causal / logical ordering
  • happened-before relationships
  • generation continuity
  • chain integrity

Secondary truth:

  • wall-clock alignment
  • drift disclosure
  • cross-host correlation

So time-source is an alignment layer, not the epistemic center of the tool.

Current Scope

What is implemented now:

  • dataset storage and selection
  • built-in Phase 5 fixture bootstrap
  • import from JSON
  • import from conventional evidence bundles
  • runtime dataset collection from supplied files
  • native nginx access-log collector
  • native journald collector
  • native Postgres/psql CSV collector
  • explicit SSH transport collectors for nginx, journald, and Postgres
  • artefact hashing
  • report/json/markdown export

What is still next:

  • typed-view to BOM auto-builders
  • host profiles such as --profile phase5
  • optional collector plugin API for third-party ingest adapters

Collector Notes

  • collect nginx parses classic nginx access-log lines, including .gz rotations.
  • collect journald shells out to journalctl -o json; permissions therefore depend on host policy.
  • collect postgres shells out to psql --csv; your query should return BOM-like columns such as created_at, token_type, pos_asc, path, client_ip, erin, or explicit bom_id / view / position.
  • collect ssh-* makes the transport explicit. That keeps “local evidence” and “remote evidence over SSH” separate instead of pretending every source is local.
  • These collectors are intentionally pragmatic. They turn operator evidence into a BOM dataset quickly; they are not yet a full schema-negotiated plugin framework.

Status

This release turns tibet-bom from a single packaged demo window into a multi-dataset Bill Of Hack tool with a real local registry and collection path.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tibet_bom-0.4.0.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tibet_bom-0.4.0-py3-none-any.whl (24.0 kB view details)

Uploaded Python 3

File details

Details for the file tibet_bom-0.4.0.tar.gz.

File metadata

  • Download URL: tibet_bom-0.4.0.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for tibet_bom-0.4.0.tar.gz
Algorithm Hash digest
SHA256 d0cd200cda18a64585cde690a4b771e482637eafab552d95dfc8f33e3ec7b384
MD5 5263736a6f1f153c3dcf369e74a78cbe
BLAKE2b-256 455015ef5192e329200752cb1f5b434f40c6cde5fe4f8da7eefbf67f5c60b0f8

See more details on using hashes here.

File details

Details for the file tibet_bom-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: tibet_bom-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 24.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for tibet_bom-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 754e11b20f76e21046826c8c90281667b52e6bf373ee46b8a3b784e5e5c025f3
MD5 3048bb669e03e0d409b6ad2282f6e6db
BLAKE2b-256 4b50e75a16fb6d5db8326261b3e3a4dabad83718f45113a45b363bd9eb8e3e85

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page