Assure 0.7.2 · evidence across hostsAn independent software company

Nimstead Assure

Fixed. Proven.

Nimstead Assure finds what's exposed, fixes it safely, and gives your auditor proof they can check themselves.

Previewv0.7.2Source available · FSLSelf-hostedLinux and Windows

Get it on GitHub See how Assure worksTalk to us

Nimstead AssureSample data

Fix first

Recommended upgrades, most important first.

  • Upgrade opensslFixes 12 vulnerabilities on 3 hostsExploited in the wild (CISA KEV)
    Fix nowRisk score 94
  • Upgrade perl-baseFixes 3 vulnerabilities on 5 hostsCritical severity (CVSS 9.8)
    NextRisk score 72
  • Upgrade glibcFixes 6 vulnerabilities on 5 hosts4.2% chance of exploitation in 30 days (EPSS)
    RoutineRisk score 46
  • Upgrade sqlite32 vulnerabilities on 2 hostsNo fix yet — mitigate or accept
    LowRisk score 18
Sample of the Assure home screen: upgrade actions ranked by risk, not a list of CVEs.
New in v0.7.27 November 2026 · Preview · Agent 0.6.3

A route across your estate.
Evidence at every step.

A weakness matters more when it opens the next machine. Assure now distinguishes a confirmed sign-in route from a connection it cannot prove.

A confirmed cross-host route was proven in a real domain lab. The unverified case has unit tests; its real-host proof is still outstanding. Assure observes these connections. It does not probe them.

Read the release and its evidence
How a sign-in route is confirmed Illustrative hosts
WorkstationServer
  • A domain account is signed in on the first host.
  • That account is an administrator on the second.
  • The first host was observed connected to the second.

Confirmed routeAll three pieces of evidence present

No matching signed-in account? Unverified. A possible route stays a possible route.

Patch a cluster, one node at a time.

Two failover-cluster nodes patched in sequence, with the role online throughout. Two domain controllers patched one at a time, both healthy afterwards.

See machines before enrolling them.

Agentless Windows scans over PowerShell remoting, proven across hosts. Active Directory discovery finds machines without an agent. Fixes still need one.

Read the installed version.

SharePoint binaries and Exchange management tools checked against real installs. Windows coverage now includes 105 curated third-party apps; other apps remain inventory only.

Already running Assure? Use deploy/update.sh. No database migration from v0.7.1. Changes since v0.6

01 — Detect

It reads what's installed. It never guesses.

An agent on each machine reports the installed packages every 6 hours. Assure matches them against advisories using each distro's own version rules and source-package names, so backported fixes aren't flagged. If a version can't be read exactly, there's no finding. Never a fuzzy match.

Every check gets a verdict and a confidence. The report says what it couldn't determine instead of calling a machine clean. Attack paths link weaknesses on a host and, where the evidence supports it, across hosts. Each chain names a fix that breaks it.

49real cases, exact agreement with the OSV API

10version comparators, from dpkg to NuGet

0fuzzy matches or banner guesses

Run the server · Docker Compose v2

$ git clone --branch v0.7.2 https://github.com/Nimstead/assure.git && cd assure
$ cp .env.example .env
# Set a long random POSTGRES_PASSWORD in .env.
# Set NIMSTEAD_UPDATE_CHANNEL=preview to receive preview updates.
$ docker compose up -d
Open http://localhost:8000 and add your first machine.

Early access: start on test machines. There is no stable release yet. HTTPS, enrolment, upgrades and running without Docker: the install guide.

Install the agent · Linux

$ export NIMSTEAD_TOKEN=<TOKEN>
$ curl -fsSL --proto '=https' https://<server>/install.sh \
    | sudo --preserve-env=NIMSTEAD_TOKEN sh
$ unset NIMSTEAD_TOKEN
Nimstead agent installed;
reporting every 6 hours.

The token goes in an environment variable because other users and sudo's log can read anything on the command line.

Windows · Administrator PowerShell

> $env:NIMSTEAD_TOKEN = "<TOKEN>"
> irm https://<server>/install.ps1 | iex
Advisories
OSV, NVD, Microsoft MSRC, CISA KEV, FIRST EPSS, pulled by an hourly feed update that re-matches every asset
Linux
Debian, Ubuntu, Alpine, Rocky, AlmaLinux, openSUSE, SLES
Windows
Cumulative updates by KB, Microsoft's own products, 105 curated apps (Chrome, Firefox, 7-Zip, Zoom, the JetBrains IDEs and more), settings that leave a patched machine exposed, and vulnerable drivers by file hash
Applications
CycloneDX and SPDX SBOMs uploaded from CI: PyPI, npm, Maven, NuGet, Go, crates.io and more

02 — Prioritise

Fix first. Not everything at once.

Assure ranks by what's being exploited, not by how scary a score looks. The home screen shows upgrades, not a wall of CVEs, and every ranking comes with its reasons in plain words.

  1. Known exploitedOn the CISA KEV list? It goes to the top, every time.Exploited in the wild (CISA KEV)
  2. Likely to be exploitedFIRST EPSS: the chance of exploitation in the next 30 days.4.2% chance of exploitation in 30 days (EPSS)
  3. SeverityCVSS, weighed with the two above rather than on its own.Critical severity (CVSS 9.8)
  4. Your contextHow critical the machine is, and whether it faces the internet.Internet-facing asset
  5. Can it be fixedIf no fix exists yet, it says so instead of nagging.No fix yet — mitigate or accept

03 — Fix safely

You choose how far it goes.

Three levels of trust. Approve is the default. Switching back to Suggest cancels every approved job, which makes it your kill switch. Each machine must also opt in locally before anything can change on it. The agent checks for eligible jobs every 15 minutes. Set a maintenance window to control when approved changes run; Windows workstations can defer a restart until a deadline.

Trust level

Nimstead recommends upgrades. It never changes a machine; you apply fixes yourself.

You plan a fix and a person approves each one before anything runs. Every approval is recorded.

Fixes are applied without asking, canary machines first. Broad machines wait until a canary has stayed healthy for the soak period; any failure halts the rollout. Switching to Auto asks you to confirm first.

  1. Rollback first. Reversible package fixes save a rollback copy before they start. Forward-only winget updates and servicing-stack steps require a person’s explicit approval; they never enter Auto.
  2. Dry run. A simulated upgrade refuses any change that would touch packages outside the plan.
  3. Canaries first. Changes go to canary machines and soak for 24 hours. The broad ring is pinned to the versions the canaries proved.
  4. Health checks. Services are checked after the change. For reversible jobs, a failure triggers an automatic rollback and halts the rollout.
  5. Confirmed by the next inventory. Success is never taken on the agent's say-so.

Real run — Debian 13

A fix broke a service. Here's what happened next.

Assure upgraded perl in a Debian 13 sandbox. The upgrade itself worked. The canary service didn't. Assure saw the failed health check, put the old package back from the copy it saved first, and checked the service again.

Unedited job steps from the sandbox run. The same run went on to produce an evidence pack that met all six controls Assure mapped at the time (nine today): RESULT: PASS.

job · upgrade perl-basesandbox/last_run_debian.json
  1. okjob validated
  2. okapt-get available
  3. okinstalled versions match plan
  4. oknimstead-canary.service active before change
  5. okrefresh package index
  6. oksimulate upgrade
  7. okchange limited to planned packages
  8. okarchive copy of perl-base=5.40.1-6 not available (superseded); rebuilding
  9. okrollback package saved perl-base_5.40.1-6_amd64.deb
  10. okupgrade
  11. okpackage database check
  12. FAILnimstead-canary.service active after change
  13. okrollback artefact intact perl-base_5.40.1-6_amd64.deb
  14. okrollback install
  15. okversions restored
  16. oknimstead-canary.service active after rollback

✓ Versions restoredrolled_back · trigger: service health check

Job log: the upgrade made the canary service fail its health check, and Assure rolled back automatically.

04 — Prove

Proof your auditor can check without us.

Every detection, fix and decision goes into a hash-chained ledger, with signed checkpoints kept outside the database. Export a pack for the last 30, 90 or 365 days. It's signed with Ed25519, and your auditor checks it offline, with no access to Nimstead. The verifier isn't in the pack, because whoever hands over a pack could have changed anything in it. Your auditor gets it from your server.

In the pack

  • pack.json controls, timings, the ledger
  • pack.sig Ed25519 signature
  • public_key.pem to check it with
  • README.txt how to check it

Your auditor, offline

# get verify.py from /api/evidence/verify.py and
# check its SHA-256 at /api/evidence/public-key
$ pip install cryptography
$ python verify.py pack.json pack.sig public_key.pem \
    --expect-fingerprint <FINGERPRINT>
OK: signature valid, ledger chain intact

Time to fix, measured from the ledger

  • Fix now14 days
  • Next30 days
  • Routine90 days
  • Low180 days

These are defaults, and you can change each one in Settings. A finding keeps the deadline in force when it was detected, so relaxing a deadline later can't turn an old miss into a pass.

Controls each evidence pack reports on
FrameworkControlWhat the pack shows
UK Cyber EssentialsSecurity update managementHigh and critical updates (CVSS 7 or above, or known exploited) applied within 14 days
ISO/IEC 27001:2022A.8.8Management of technical vulnerabilities
NIST SP 800-53 Rev. 5RA-5Vulnerability monitoring and scanning
NIST SP 800-53 Rev. 5SI-2Flaw remediation within organisation-defined time periods
PCI DSS v4.0.16.3.3Critical security patches installed within one month of release
SOC 2 (TSC 2017)CC7.1Detection and monitoring identify newly discovered vulnerabilities
SOC 2 (TSC 2017)CC8.1Changes are authorised, tested and approved before implementation
NIS2 DirectiveArt. 21(2)(e)Vulnerability handling in network and information systems maintenance
CIS Controls v8.17.3 / 7.4Automated OS and application patch management

Each control is reported as met, not met or no activity. A deadline control reports no activity when nothing was fixed and nothing was overdue in the period.

05 — Where it runs

Tested on real machines. Here are the limits.

The verified rows have run on real or virtual machines. Partial rows separate what was observed from what remains unproven. Read the full evidence and known gaps.

Platforms and what has been proven on each
PlatformFixes withWhat's been provenStatus
Debian 13apt164 packages, 274 findings. A fix that broke a service rolled back on its own.✓ Verified
Ubuntu 24.04apt523 packages, 369 findings, end-to-end pass.✓ Verified
AlmaLinux 9dnf207 packages, 50 findings, end-to-end pass.✓ Verified
Alpine 3.21apk32 packages, 45 findings, end-to-end pass.✓ Verified
openSUSE Leap 16.0zypper + snapperA broken fix undone with snapper, including a file the install scripts rewrote.✓ Verified
Windows Server 2025Windows Update by KB, DISM rollbackFix and rollback proven end to end, across reboots.✓ Verified
Windows 11Windows Update by KB, DISM rollbackFix and rollback proven end to end, across reboots and a power cut mid-rollback. Every package the update brings is checked before install.✓ Verified
Windows 10 LTSC 2021Windows Update by KB, DISM rollbackDetected in English and German; rollback proven. Applying a fix there isn't proven yet.Partial proof
Windows Server 2016Servicing stack, then cumulative updateBoth steps installed on a real host. The evaluation install was offered no newer cumulative, so the latest build was not reached.Partial proof
Windows Server 2019Windows Update by KBSupported update path; applying it has not been proven on a real host.Partial proof
Windows Server 2022Windows Update by KBDetected. An old install is stepped through the update Windows Update offers; the fix itself isn't proven yet.Partial proof

Know the limits

  • Early access, not a certification: benchmark references are not full CIS or STIG conformance, and a commercial-scanner comparison remains unproven.
  • Kernel and install-only packages are refused, not patched.
  • Rollback restores package files and the package database. Only zypper with snapper also reverts what install scripts changed.
  • Windows apps are fixed only where winget can install the new version, and a person always approves it, since it can't be rolled back.
  • Cross-host paths depend on reported sign-ins, administrator membership and observed connections. Missing evidence stays unverified. The unverified sign-in case is unit-tested, not yet proven on real hosts.
  • An SBOM finding means a component is present, not that the vulnerable code is reachable.
  • External checks cover risky open ports and TLS on 443, only for domains you prove you own. No UDP, no fingerprinting.
  • Distro derivatives such as Mint and Pop!_OS aren't mapped yet.

06 — Security

Your servers. Your keys.

Self-hosted
You run the server: Python 3.14 and PostgreSQL 17, at a URL you choose. Your inventory, findings and evidence live there.
Bounded agent actions
One Python file, standard library only; on Windows it brings its own signed Python runtime. It accepts defined job types, not arbitrary shell commands from the server. Local opt-in and job validation constrain what can change. Don't take our word for it: read the source.
Keys you hold
Signing keys can stay in HashiCorp Vault transit, and ledger checkpoints can go to S3 object lock, outside the database.
Updates only we can sign
Agents and the server install a release only if it's signed by the Nimstead release key. That key never touches your server, so a compromised server can't push code to your machines. If a server update isn't healthy within 5 minutes, it rolls back and restores the database.
Sign-in your way
SSO over OIDC with PKCE, domains verified by DNS. Require SSO and keep an admin break-glass account. Admins who sign in with a password must use two-step sign-in. Scripts get read-only API tokens.

Found a vulnerability? Email security@nimstead.systems. Read the disclosure policy.

Nimstead

Talk to us.

Running it, or thinking about it? Tell us about your estate and what you need: help deploying, support, or a licence question.

Get it on GitHub

Bugs and feature requests go in GitHub issues. What we'll do with this form: reply from hello@nimstead.systems. What we won't: add you to a newsletter or share your details. Privacy

What they run