Roadmap

Where pisentry goes next.

Built from GitHub milestones and issues each time they change. Nothing here is a promise until it ships in a release.

5 milestones5 of 25 issues closedLatest release v0.1.0Updated 2026-10-26 13:16 UTC
v0.1.0 shipped

Released 2026-10-15

  • Ten detection categories, PS01 to PS10
  • Detectors for journald and classic syslog files, /proc polling, /proc/1/net listeners, file integrity...
  • Learning period, persistent baselines, alert-once-then-adopt, per-key cooldown, and one sanitizer for every...
  • Outputs: ranked Top 10 terminal report, JSON events on stdout or to a file, Prometheus metrics on :9817, a...
  • Commands: run, report, audit, baseline reset, test-alert, categories
  • Hardened systemd unit and an installer for Raspberry Pi OS, Ubuntu, Debian and RHEL-family hosts
  • Distroless multi-arch image (arm64, armv7, amd64) with provenance and SBOM
  • Flux-ready Kubernetes manifests
main unreleased

On main, in the next release

  • Rule Schema v1 and a strict JSON rule loader (internal/rules, docs/rule-schema.md). Rules use...
  • Built-in rules in deploy/rules/default.json, embedded in the binary
  • rules.dir (default /etc/pisentry/rules.d, env PISENTRY_RULES_DIR) loads operator bundles over the...
  • pisentry check [-rules PATH] validates bundles and exits 1 naming the file, rule and field
  • Process rules outside PS06 (for example from a rule pack) are reported under their own category, and rules...
  • Per-rule positive and negative fixtures under internal/rules/testdata/rules/<rule-id>/, replayed by `go...
  • FuzzLoadBytes fuzz target for the rule loader
  • Event Schema v1 (docs/event-schema.json, docs/event-schema.md)
v0.2.0 open

Rule engine and detection foundations

Event schema v1, strict JSON rules in /etc/pisentry/rules.d with per-rule tests, SIGHUP reload, signed rule bundles, the first rule packs, fuzzing, and shipped Prometheus alerts.

5 of 11 done45%
Milestone on GitHub
  • #13FEATAdd atomic hot-reloading of attack patterns via SIGHUP and file watchingP1rule-engine

    Reload rules without restarting pisentry and without losing state.

    Open #13 on GitHub

  • #14FEAT'pisentry update-patterns' with Ed25519 signatures, version and expiry checksP1rule-engine

    Fetch rule bundles over HTTPS and install them only if signed. A signature alone does not stop a rollback: anyone who can serve an old, validly signed bundle can remove a newer rule. The bundle needs a version and an expiry the agent enforces.

    Open #14 on GitHub

  • #15RULESCurate initial v0.2.0 Attack Pattern Library (IoT Botnets, GTFOBins, Reverse Shells, Miners)P1detect

    Ship default rule packs mapped to MITRE ATT&CK for real Linux and ARM threats.

    Open #15 on GitHub

  • #26K8SShip native PrometheusRule CRD manifests and updated Grafana dashboardP1k3s

    Ship alert rules with the manifests, including the ones that matter most for a host agent: the agent going quiet. "Root wins" is only survivable if a missing agent pages someone.

    Open #26 on GitHub

  • #32TESTFuzz every parser that reads attacker inputP1detect

    Log lines, /proc fields, file names and rule files are attacker-controlled, and a root process parses them. Go's native fuzzing is standard library. OpenSSF Scorecard also scores fuzzing.

    Open #32 on GitHub

  • #33PERFBenchmarks and a performance budget for the event path in CIP2

    Decide #12 with data, catch regressions on every PR, and feed the hardware numbers in #28.

    Open #33 on GitHub

  • #11ARCHRule schema v1 and strict JSON loader for /etc/pisentry/rules.d (internal/rules)P0rule-engine

    Detection data for PS01-PS10 is hardcoded in internal/detect/. Loading patterns without a rebuild needs a rule format. The agent runs as root and reads these files, so the loader is attack surface. A hand-written YAML-subset parser in the root daemon adds that surface, and it will drift from real YAML in ways rule...

    Open #11 on GitHub

  • #30ARCHEvent schema v1: stable entity fields and event IDsP0rule-enginestate-correlation

    Events carry fields as a free map of strings. Rules (#11), correlation (#21) and response (#23) need fixed names and types, and anyone parsing the JSON needs a contract that will not shift under them.

    Open #30 on GitHub

  • #31TESTPer-rule positive and negative fixtures, enforced in CIP0rule-engine

    "75 tested patterns" needs a definition of tested. Every rule should prove it fires on the attack and stays quiet on normal activity.

    Open #31 on GitHub

  • #35DOCSRestore CHANGELOG entries for cosign signing, Scorecard and CodeQLP1

    The ## [Unreleased] entries from PRs #7, #8 and #9 were lost while resolving merge conflicts. The release workflow builds release notes from CHANGELOG.md, so the next release notes would leave out release signing.

    Open #35 on GitHub

v0.3.0 open

Real-time telemetry and fileless detection

A decision record on exec telemetry privileges, real-time exec events (audit on Pi kernels, proc connector elsewhere, polling fallback), inotify FIM, and PS11 fileless execution.

0 of 4 done0%
Milestone on GitHub
  • #16FEATReal-time exec events: audit on Pi kernels, proc connector elsewhere, polling fallback (internal/execsrc)P0telemetry

    /proc polling every 15 seconds misses short-lived processes. The first plan used the Netlink Process Connector. That does not work on stock Raspberry Pi OS: - Pi kernels (6.12 rpi-v8 and rpi-2712) build CONFIG_CONNECTOR=m. PROC_EVENTS depends on CONNECTOR=y, so proc events are not compiled in. - Where it...

    Open #16 on GitHub

  • #34ADRReal-time exec telemetry: source, privileges and deployment costP0telemetry

    Real-time exec events need a kernel feed. On stock Pi kernels only audit is built in; proc events are not (CONFIG_CONNECTOR=m). Both netlink feeds deliver only to sockets in the initial network namespace. Audit also needs CAP_AUDIT_READ, and CAP_AUDIT_CONTROL to add rules. Today the DaemonSet has no hostNetwork...

    Open #34 on GitHub

  • #17FEATAdd real-time File Integrity Monitoring (FIM) using pure-Go Linux inotifyP1telemetrydetect

    Move PS03 (FIM) and PS10 (persistence) from hashing on an interval to event-driven checks with syscall.InotifyInit1 and syscall.InotifyAddWatch. This closes the README limitation where a file changed and restored inside 60 seconds is missed.

    Open #17 on GitHub

  • #18FEATImplement PS11 Dedicated Fileless & Shared-Memory Execution Detector (memfd_create & /dev/shm)P1detect

    Split fileless execution out of PS06 into a dedicated detector, PS11, for reflective ELF loaders (memfd_create) and execution from tmpfs (/dev/shm, /run/shm).

    Open #18 on GitHub

v0.4.0 open

Persistent windows and correlation

Detector windows persisted in state.json, low-and-slow and spray SSH analytics, multi-stage correlation (PS99), and CIDR threat feeds.

0 of 4 done0%
Milestone on GitHub
  • #19ARCHPersist detector windows and add an integrity check to state.json (internal/state)P1state-correlation

    internal/state already persists baselines and history. It writes JSON to a temp file, fsyncs it, renames it and fsyncs the directory, every 30 seconds when dirty and on SIGTERM. Because baselines persist, an offline edit to a watched file is already caught on the first FIM scan after start. What is missing: the SSH...

    Open #19 on GitHub

  • #20FEATUpgrade PS01 with 24-hour Low-and-Slow & Distributed SSH Brute-Force AnalyticsP1detectstate-correlation

    Catch attackers who space SSH attempts over hours, or spread one username across many source IPs.

    Open #20 on GitHub

  • #21FEATImplement Multi-Stage Attack Chain Correlator in Event Bus (internal/engine)P1state-correlation

    Link detections on one host inside a time window and raise one incident, PS99_MULTI_STAGE_COMPROMISE.

    Open #21 on GitHub

  • #22FEATAdd IP & CIDR Threat Intelligence Blocklist Matcher for PS02/PS05/PS09P2rule-enginedetect

    Check active sockets against IP and CIDR feeds.

    Open #22 on GitHub

v0.5.0 open

k3s edge, ARM benchmarks and admission policy

PS12 k3s posture and container escape, an admission policy for signed images, and benchmarks on real ARM boards.

0 of 4 done0%
Milestone on GitHub
  • #25FEATImplement PS12 k3s / Kubernetes Edge Security & Container Escape DetectorP1detectk3s

    Detector PS12 checks k3s node posture and catches container breakout attempts on edge clusters.

    Open #25 on GitHub

  • #28DOCS/TESTARM Hardware Benchmark Suite & v0.2.0 Documentation OverhaulP1ARM verified

    Benchmark v0.5.0 under load on real ARM boards and publish the rule authoring guide.

    Open #28 on GitHub

  • #12PERFLiteral prefilter for rule matching (Aho-Corasick), only if benchmarks need itP2rule-engine

    With 75 to 500 rules, RE2 regexps plus strings.Contains may already be fast enough: 100 execs a second at 50 microseconds each is half a percent of one core. Build an automaton when the benchmarks (#33) show the matcher is the bottleneck, not before.

    Open #12 on GitHub

  • #27K8SAdmission policy that verifies the pisentry image signatureP2k3s

    Release signing is done (PR #7). The release workflow signs the image and SHA256SUMS keyless with cosign. What remains is enforcing it in the cluster. The first signed release will be the first tag after v0.1.0.

    Open #27 on GitHub

v0.6.0 open

Active response, opt-in

Process tree stop and kill, and firewall quarantine with TTL. Off by default. Triggered only from trusted sources.

0 of 2 done0%
Milestone on GitHub
  • #23FEATBuild Active Response Engine with Process Tree Termination (internal/response)P1response

    Optional automated response that stops malicious process trees for high-confidence rules. A wrong kill on a cluster node is an outage, and anyone who can forge a triggering input owns that outage. The guardrails are the feature.

    Open #23 on GitHub

  • #24FEATFirewall quarantine in a dedicated nftables table with TTL and a safe ignore listP2response

    Quarantine attacking source IPs with automatic expiry. Three things make this harder on these nodes than it looks: - k3s, flannel and kube-proxy own iptables and nftables rules. pisentry must never touch them. - Traffic through Cloudflare Tunnel arrives from cloudflared, so banning by source IP does nothing for it. -...

    Open #24 on GitHub

Want to help? Rules and detection gaps make the best first contributions. Read the contributing guide.