Security and privacy
A security tool runs on machines that may already be compromised and handles sensitive material. This page states what PushWarden does and does not do, so you can decide whether to trust it.
Privileges
| Part | Runs as | Notes |
|---|---|---|
| Every command and the background guard | your user | installs per user; no administrator password |
| The C2 block and its boot-time job | root or SYSTEM | installed once, with your consent, through the system’s own elevation dialog |
The privileged job never reads files under your home folder to decide what to block. It uses a root-owned copy of the indicators, refreshed only from the project repository, and a root-owned copy of the program. A process running as you therefore cannot make the job edit the hosts file or firewall. See Blocking C2 servers.
Data that leaves the machine
Nothing leaves the machine unless you opt in.
| Connection | Content | Default |
|---|---|---|
| Indicator download | an HTTPS GET of iocs.json from the project repository |
on; ioc_update=false turns it off |
| Program update | HTTPS GETs of the release list, checksums, signature and binary from GitHub | on; auto_update=false turns it off |
github-clean |
GitHub API calls and git over HTTPS with your token | only when you run it |
| Webhook alerts | each alert with host name, paths and reasons | off until webhook_url is set |
| Daily digest | counts only | off until feedback_url is set |
| Central event upload | redacted journal events | off until upload_url is set |
There is no built-in telemetry endpoint. No URL for the digest or the upload is compiled into the program.
Before turning the digest or the upload on you can see exactly what would be sent:
pushwarden feedback --digest
pushwarden feedback --preview
See Team reporting for the contents and the redaction rules.
Redaction
The feedback bundle and the central upload remove what identifies the person or opens their accounts: the home folder becomes ~, the user name and host name are removed, and token-shaped strings, private keys, credentials in URLs and secret-keyed values are masked. On the upload path this cannot be turned off.
Token handling in github-clean
- The token is read from
--token, standard input, an environment variable or theghCLI. - It is handed to git through an askpass helper built into the program and an environment variable of the child process.
- It is never written to disk, into a remote URL, into the JSON report, into the progress file or into kept clones.
- Git’s error output is scrubbed of the token before it is shown.
- While git runs, stored credential helpers, hooks and
core.fsmonitorare disabled, so a malicious global git configuration cannot run code or send the token elsewhere.
Use a fine-grained token limited to the repositories being cleaned, and rotate it afterwards.
What the guided screens read to sign in
pushwarden ui looks for GitHub logins that already exist on the machine. It reads the GITHUB_TOKEN and GH_TOKEN variables, asks gh for the tokens of its logged-in accounts, reads the host names in ~/.ssh/config, and runs ssh -T once per GitHub host to learn which account the key belongs to. It never reads SSH key files, and no token is written to disk. To mark local clones it reads the remote addresses in the .git/config of the repositories under your project folders; nothing in those repositories is run. See Guided screens.
Update integrity
- Release checksums are signed with the project’s ed25519 key. The public key is built into the program.
- A downloaded release must pass the signature check and the SHA-256 check before it replaces the running program.
- A release that does not start cleanly is rolled back and never retried.
- Indicator files are validated before use and cannot contain code: they are data only.
The install script verifies the SHA-256 of the download against checksums.txt. It does not check the signature; the program checks it on every self-update.
Handling of malicious files
- Detection reads files; it never executes them.
- A file is copied to quarantine before it is changed or removed, so every action can be undone.
- Quarantine is a folder under your data directory with user-only permissions. Files in it are inert copies.
- Automatic action requires strong evidence. Heuristic findings are reported only.
- A process is killed only on a strict marker that legitimate tools never use.
The central upload key
The key that every machine holds for the central upload is an insert-only key. The provided SQL enables row level security with a single insert policy, so the key cannot read, change or delete rows, and the triage views are closed to it. Extracting the key from a machine allows adding junk rows and nothing more. See Team reporting.
Local files and permissions
The data directory and the files in it are created with user-only permissions (0700 for directories, 0600 for files). config.json can contain a webhook URL and an upload key; treat it like any other credentials file.
What PushWarden does not do
- It does not collect analytics or usage statistics.
- It does not upload file contents. The central upload carries only the matched text and evidence lines of a finding, redacted.
- It does not rewrite git history or force-push.
- It does not need or request administrator rights except for the C2 block.
- It does not protect against malware families other than the one it targets. It complements a general antivirus; it does not replace one.
Reporting a vulnerability
Open an issue at https://github.com/FaheemRafiq/pushwarden/issues. For anything that should not be public, contact the maintainer through the GitHub profile first.
Source
The source code can be read at https://github.com/FaheemRafiq/pushwarden.