| Version | Supported |
|---|---|
| latest | ✅ |
| < latest | ❌ |
Do not open a public issue for security vulnerabilities.
Instead, please report vulnerabilities privately:
- Go to the Security Advisories page
- Click Report a vulnerability
- Provide a clear description and reproduction steps
You will receive a response within 72 hours. If confirmed, a fix will be released as a patch version and credited in the changelog.
- CI runs
actionlintandshellcheckon every push and PR - All
${{ inputs.* }}and${{ secrets.* }}references in shell scripts are routed throughenv:blocks (masked by GitHub Actions) - never inlined inrun:commands. This prevents script injection from a malicious input value. - Input validation: numeric inputs (
retention-days,retention-count,max-keys) reject non-integer values - AWS CLI is invoked with explicit endpoint URL, region
auto, and credentials passed via env vars - never as CLI arguments
- Permissions are scoped to
contents: readfor all jobs except the release workflow, which hascontents: writeonly on the tagging step - For
sshmode, the workflow recommendsssh-known-hosts(strict host key checking). When omitted, the workflow emits a::warning::annotation explaining the TOFU fallback. - For
tunnel-sshmode, authentication is handled by Cloudflare Access service tokens viaNX1X/cloudflare-tunnel-ssh-action. Service tokens can be revoked instantly in the Cloudflare dashboard without rotating SSH keys. - DB template env-var prelude is generated with
printf '%q'so password values containing shell metacharacters ($, backticks, quotes, newlines) are safely escaped before reachingbash -son the source. - For
mysql/postgrestemplates, the password is exported as an env var (MYSQL_PWD/PGPASSWORD) - never as a CLI argument. So it doesn't appear inps//proc/*/cmdlineon the source. - For
mongodb,--passwordis a CLI flag (limitation ofmongodump); it can briefly appear inpslistings on the source whilemongodumpis running. See docs/architecture.md for the full traversal model and stricter alternatives. - The
NOTIFY_WEBHOOK_URLsecret (when set) carries the Slack/Discord/generic webhook token in the URL path - GitHub masks it in run logs. The notify job uses a 10scurl --max-timeand intentionally swallows non-2xx responses so a flaky chat endpoint cannot flip a successful backup to "failed".
- Releases are created manually via the
Releaseworkflow (workflow_dispatch) - The release workflow validates the version format, refuses duplicate tags, extracts release notes from
CHANGELOG.md, and updates the floating major version tag softprops/action-gh-releaseis pinned to a commit SHA in the release workflow to prevent supply chain attacksactionlintis pinned tov1.7.7in CI and release workflows- Dependabot is configured for weekly GitHub Actions version updates
Nothing. No telemetry, no analytics, no external calls. Network traffic from this action goes only to:
- The Cloudflare R2 endpoint (
https://<account-id>.r2.cloudflarestorage.comor your override) - For
tunnel-sshsource mode: Cloudflare Access endpoints, via the wrapped action
The source is fully open - read every line in action.yml, scripts/, and templates/.
| Date | Change |
|---|---|
| 2026-05-09 | v1.0.0 - Initial release with env:-block secret passing, printf %q env-prelude for templates, MYSQL_PWD/PGPASSWORD env-var injection (no CLI password leakage for MySQL/Postgres), explicit workflow permissions, pinned third-party actions |