aayudha docs Built from de79988 (2026-10-26)

Security policy

This file covers two things: how to report a vulnerability in aayudha, and what the maintainer does when the tool itself is compromised (the tool-incident plan, WP0.1). The threat model is docs/BUILD-PLAN.md §0.1, expanded in docs/threat-model.md.

Features marked "n/a until WPx.y" do not exist yet. Until then the manual step written next to them applies.

Supported versions

Version Supported
0.1.x (current, first released 2026-10-15) Supported: the current release, plus security patches for the previous two minor versions. Each minor version's end-of-life date is published in its GitHub release notes.
Before v0.1.0 Not supported.

Only tagged releases from main (v*) are supported. dev and rolling snapshots are not.

Reporting a vulnerability

Report privately through GitHub private vulnerability reporting: Security → Report a vulnerability, or directly at https://github.com/rahulnakmol/agentic-ayudha/security/advisories/new?utm_campaign=docs-site&utm_medium=docs&utm_source=agentic-ayudha.

Do not open a public issue, pull request, or discussion for a vulnerability.

Include:

Do not include real secrets or personal data. Use synthetic values.

Response targets

This is a one-person project. These are targets, not guarantees:

Step Target
Acknowledge the report 5 business days
Initial assessment (accepted / not a vulnerability / need more information) 10 business days
Fix or mitigation for a confirmed critical or high issue 30 days
Fix for a confirmed medium or low issue Next planned release

If a target slips, the maintainer says so in the advisory thread.

Coordinated disclosure

Release integrity

Releases are built by goreleaser in release.yml, only for an annotated v* tag whose commit is on main. Each release carries checksums.txt signed keylessly with cosign (checksums.txt.sigstore.json), an SPDX SBOM per archive, and SLSA build provenance. The signing certificate names https://github.com/rahulnakmol/agentic-ayudha/.github/workflows/release.yml@refs/tags/<tag>.

install.sh refuses to install unless that signature verifies for the exact tag requested and the archive matches its signed checksum; CI proves on every change that it refuses a flipped byte, a rewritten checksum, and a signature from any other workflow. aayu self-update will do the same (n/a until WP1.1). By hand:

cosign verify-blob --bundle checksums.txt.sigstore.json \
  --certificate-identity "https://github.com/rahulnakmol/agentic-ayudha/.github/workflows/release.yml@refs/tags/vX.Y.Z" \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --ignore-missing -c checksums.txt
gh attestation verify aayudha_X.Y.Z_linux_amd64.tar.gz --repo rahulnakmol/agentic-ayudha

No release has been published yet. Anything published under this repository's name that does not verify this way is not a release.

Tool-incident plan

Scope: aayudha itself is the threat. Examples: a malicious or compromised skill in skills/, a tampered or compromised release, a leaked credential used by an agent lane or CI, or prompt injection that made an agent act.

Detection signals

1. Contain

  1. Halt. Run aayu halt --reason "<why>". It sets the repository variable AAYUDHA_HALT: the first step of every aayudha workflow job fails while it is set, every verb refuses to start (exit 4), a running verb stops within one poll (30 s), and the host pre-tool hook blocks agent tool calls. It does not cancel workflow runs already past their first step and cannot stop a compromised binary that ignores it, so also:
    • cancel in-progress runs (gh run cancel <id>) and, if the binary itself is suspect, disable workflows (gh workflow disable <name>, or Settings → Actions → Disable actions);
    • revoke the tokens agents use (see Leaked credentials);
    • stop any running agent sessions.
  2. Yank the release if a release is affected: delete the GitHub release or mark it as compromised in its notes, and pull the brew, Scoop, and winget manifests (revert the commit in homebrew-tap and scoop-bucket; close or revert the winget PR). Keep the artifacts and their hashes offline for the investigation.
  3. Pull a bad skill: revert it on dev and tell users to re-sync with aayu install or pin a good version with aayu install --pin <version> (n/a until WP3.2).
  4. Open a draft GitHub security advisory for the incident.

2. Eradicate

3. Recover

  1. Ship a new signed release with the fix (cosign signature and SLSA provenance, release.yml).
  2. Run aayu resume to clear the halt variable (and the [budget] breaker's pause), re-enable any workflows you disabled by hand, and re-issue tokens.
  3. Publish the GitHub security advisory with affected versions, fixed version, and the steps users must take (upgrade, re-install skills, rotate their own tokens).

4. Retro

Within two weeks of recovery, write a post-incident retro: timeline, detection gap, root cause, what contained it, and follow-up work. Follow-ups are filed as issues on this repository. File the retro as an issue; aayu retro takes this over once it exists (n/a until WP7.6).

Leaked credentials

Identities are described in docs/BUILD-PLAN.md §0.1: humans use their own token; agent lanes and CI use a bot identity (n/a until WP1.4; until then agents run under the human's identity and their writes are tagged identity:human-fallback).

Leaked secrets in a commit stay in Git history. Rotate them; rewriting history is not a fix.

Prompt injection via untrusted text

Issue and PR bodies, comments, intake forms, Figma text, Mobbin results, PostHog/Sentry exports, and dependency output are untrusted (§0.1). The planned controls are: untrusted text is wrapped in delimited provenance blocks before any model sees it; it can never trigger respond, ship, tell publish, or ops-catalog execution; each verb has a tool allowlist; child processes run with a scrubbed environment; and triage holds a labels-only capability (WP1.5, WP2.9, WP4.8). None of these exist yet.

If an agent acted on injected instructions: treat it as an incident, follow the plan above, revert the writes it made, and add the text as an injection fixture so the eval suite catches it.