Cybersecurity investigation model
Project description
Cyvest – Cyber Investigation Model
Reusable investigation domain models, visitor helpers, and reporting utilities for incident responders. Cyvest provides a consistent data model for threat intelligence, observables, and result checks while keeping the visitor layer extensible for bespoke workflows.
Features
- Composition-friendly report builder that nests containers and checks.
- Observable graph with automatic score/level propagation across relationships.
- Visitor implementations for generating JSON/markdown reports or capturing follow-up actions.
- Tested patterns for merging external intel feeds (VirusTotal, sandbox runs, allow-lists).
Installation
Cyvest targets Python 3.10+ and is published on PyPI:
uv pip install cyvest
Quick start
Create a new report with nested containers and observables:
from cyvest import Level, ObsType, ReportBuilder, Scope
builder = ReportBuilder(graph=True)
with builder.container("body", scope=Scope.BODY) as body:
check = body.add_check("url_scan", description="Detected suspicious URL")
check.add_observable_chain(
[
{
"obs_type": ObsType.URL,
"value": "http://example.test",
"intel": {"name": "sandbox", "score": 4, "level": Level.SUSPICIOUS},
}
]
)
report = builder.build()
print(report.to_json())
Run the bundled example:
uv sync
uv run python examples/basic_report.py
Development workflow
Set up dependencies with uv:
uv sync
Execute the unit suite:
uv run pytest tests
Lint and format using Ruff:
uv run ruff check
uv run ruff format --check
Graph & model axioms
- Cyclic graphs on observables or containables are not supported.
- Every root containable model must be visited. (Observables may be skipped because parent links are tracked.)
- Child observables do not update result checks linked only to their parents.
- A
ResultCheckscore cannot be changed by an observable that is mutated elsewhere. - Adding an observable to a
ResultCheckpromotes the check to at leastLevel.INFO(aLevel.NONEcheck becomes INFO).
See examples/ and the tests under tests/ for more scenarios, including how to subclass the provided visitors to
integrate your own tooling.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cyvest-0.2.0.tar.gz.
File metadata
- Download URL: cyvest-0.2.0.tar.gz
- Upload date:
- Size: 24.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98b1377a45e9a486dd64dfe75b31019631350e0e6171edcc8e9965196626bcd6
|
|
| MD5 |
8fa4d685535a778d3ec2d36f1bb7456e
|
|
| BLAKE2b-256 |
da66916c1b795fe6596351056692d6664c92092ff31168a6da7ba34f98a862d5
|
Provenance
The following attestation bundles were made for cyvest-0.2.0.tar.gz:
Publisher:
ci.yml on PakitoSec/cyvest
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cyvest-0.2.0.tar.gz -
Subject digest:
98b1377a45e9a486dd64dfe75b31019631350e0e6171edcc8e9965196626bcd6 - Sigstore transparency entry: 684837281
- Sigstore integration time:
-
Permalink:
PakitoSec/cyvest@311384f37d79c50ea633fdfdef19e5d8045bcb97 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/PakitoSec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@311384f37d79c50ea633fdfdef19e5d8045bcb97 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cyvest-0.2.0-py3-none-any.whl.
File metadata
- Download URL: cyvest-0.2.0-py3-none-any.whl
- Upload date:
- Size: 23.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da6aa4123eafb64e0da55b3a5f8580e507fa706773eef0b6b0033e7020f7a22c
|
|
| MD5 |
2f862d4616b02a95a29f8ff104dbe9e9
|
|
| BLAKE2b-256 |
29459d666c091867daee88332592091eec7467a257a7a472f54613d082569c64
|
Provenance
The following attestation bundles were made for cyvest-0.2.0-py3-none-any.whl:
Publisher:
ci.yml on PakitoSec/cyvest
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cyvest-0.2.0-py3-none-any.whl -
Subject digest:
da6aa4123eafb64e0da55b3a5f8580e507fa706773eef0b6b0033e7020f7a22c - Sigstore transparency entry: 684837286
- Sigstore integration time:
-
Permalink:
PakitoSec/cyvest@311384f37d79c50ea633fdfdef19e5d8045bcb97 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/PakitoSec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@311384f37d79c50ea633fdfdef19e5d8045bcb97 -
Trigger Event:
push
-
Statement type: