ubuntu-sys-audit checks an Ubuntu server for missing CVE fixes, signs of compromise and risky configuration in one read-only pass. A single static binary: no agent, no packages, and it never runs a program from the host.
It runs as root, so it was built like a forensic tool rather than an agent. It reads the host and leaves it as it found it: no files written unless you ask, and no program from the host ever executed, so a replaced ps or ss cannot feed it false output.
Packages and the running kernel are compared against Canonical’s Ubuntu Security Notices, ESM fixes included. Ubuntu backports fixes into older versions, so a version number alone says little.
ubuntu-sys-audit1.18.0-0ubuntu1.x vs Canonical OVAL Fix installed
Read-only
Versions are read from the contents of binaries instead of running nginx -v. The end-to-end tests check this with strace.
Nothing to install
One static binary for amd64 or arm64. No agent, no daemon, no compiler, no packages on the host.
Built for fleets
Without a TTY it writes JSON. Collect reports over SSH and act on the exit code.
Works offline
Point it at a local copy of Canonical’s OVAL file. It warns you when the data is over 14 days old.
Gentle on production
Low CPU priority, idle I/O, at most 2 CPUs. Most test scans finished in 5 to 60 seconds.
Verifiable releases
GitHub Actions builds both binaries and publishes build provenance attestations, so you can prove a binary came from this repository’s workflow, even on the host itself with the bundled Sigstore file.
SLSA provenanceOpenSSF ScorecardOpenSSF Best PracticesCodeQLgovulncheck gateFuzzed parsers
Terminal UI
Findings you can actually act on.
Every finding says what it means, how to fix it and what it saw. This is the real layout with a demo report: click into it and drive it with the same keys.
1/63↑↓ movetab switch panef filter/ searchs save JSONq quit
↑↓Move
tabSwitch pane
fFilter by severity
/Search
sSave JSON to the current directory
qQuit
Demo data from an illustrative Ubuntu 22.04 host. Without a TTY, the tool writes the same report as JSON.
Fleets
Every host. One loop.
With no TTY it writes JSON, so a plain SSH loop collects a report from every host. dpkg --print-architecture runs on each one, so the same loop covers amd64 and arm64 machines.
collect reports over SSH
for h in web-01 web-02 db-01;do ssh "$h"'sudo "./ubuntu-sys-audit-linux-$(dpkg --print-architecture)"'>"audit-$h.json" echo "$h exit=$?"done
Then let the exit code decide. Each host in the grid is coloured by its own.
0CleanNothing to act on.17 hosts
1MediumMedium findings.4 hosts
2Critical / HighCritical or high findings.2 hosts
3IncompleteSome items could not be checked, so do not treat the host as clean.1 host
130AbortedThe scan was aborted.
How it compares
A triage tool, not a replacement.
It complements the tools you already run. Use it when you need to know, quickly and without installing anything, where an Ubuntu host stands.
ToolMain focus
◆ ubuntu-sys-auditUbuntu CVE status, signs of compromise and risky configuration in one read-only run
LynisSystem hardening and compliance auditing on Linux and Unix
rkhunter, chkrootkitRootkit detection
TrivyVulnerabilities and misconfigurations in container images, filesystems and code repositories
Run it
Take your server for a lap.
Download, verify, run. Pick the binary that matches dpkg --print-architecture on the host.