Request icon
Return icon
Switch icon
Snooze icon
Log icon
SlackIncomingWebhook icon
Trigger icon

Triage Aikido Vulnerabilities by Reachability, Auto-Snooze Unreachable Findings and Page Only on Real Risk

Use Aikido reachability analysis in Kestra to auto-snooze vulnerabilities with no call chain, escalate exploitable reachable code, and keep an audit trail of every suppression.

Categories
AIInfrastructure

Most vulnerability backlogs are noise. A scanner flags every CVE in every transitive dependency, and an engineer spends the week proving that ninety percent of them are never actually executed. Aikido already answers that question with reachability analysis, tracing whether application code can reach the vulnerable function at all. This blueprint turns that answer into an automated decision: findings with no call chain and no known exploit are snoozed with a written justification, findings that are reachable or actively exploited page the on-call engineer, and anything ambiguous is queued for a human. The suppression is recorded in Aikido itself, so the audit trail survives long after the execution log rolls off.

How it works

  1. The on_new_high_severity_issue trigger (io.kestra.plugin.aikido.issues.Trigger) polls Aikido every ten minutes and fires one execution per newly detected issue group scoring 80 or above. On first activation it records a baseline instead of flooding you with the existing backlog.
  2. The authenticate task (io.kestra.plugin.core.http.Request) performs the OAuth2 client-credentials exchange against /api/oauth/token using basic auth, returning a short-lived bearer token.
  3. The issue_detail task reads /api/public/v1/issues/{id}, which carries the three fields the gate depends on: reachability_status, exploitability, and severity_score alongside original_cvss_severity_score.
  4. The reachability task calls /api/public/v1/issues/{id}/reachability for the traced call chains. It runs with options.allowFailed: true so a workspace without the reachability engine degrades to the unknown path instead of failing the flow.
  5. The classify task (io.kestra.plugin.core.debug.Return) collapses those signals into one JSON verdict object, including how many call chains were returned and the delta between Aikido's re-scored severity and the raw CVSS score.
  6. The route task (io.kestra.plugin.core.flow.Switch) branches three ways. suppress calls io.kestra.plugin.aikido.issues.Snooze with a written reason and a dated expiry. escalate posts a structured Slack block with the call chain count. review logs the finding for a human.
  7. The errors block guarantees a failed triage is announced rather than silently dropping a finding on the floor.

What you get

  • Automatic, justified suppression of unreachable findings, with the reason stored in Aikido rather than in a spreadsheet.
  • Paging that fires on exploitability and reachability, not on raw CVSS, so the on-call rotation stops being trained to ignore alerts.
  • A visible comparison of Aikido's contextual score against the original CVSS score on every escalation.
  • A dated snooze that re-surfaces the finding instead of burying it forever.
  • Flow-level outputs (verdict, reachability_status) that a parent flow or a reporting job can consume.

Who it's for

  • Application security teams drowning in dependency findings that are never executed at runtime.
  • Platform teams who own the vulnerability SLA but do not own the application code.
  • On-call engineers who want a page to mean something.

Why orchestrate this with Kestra

Reachability data is only useful if something acts on it. Aikido exposes the analysis over its API, but deciding what to do with it is a workflow problem: authenticate, correlate several endpoints, branch on the result, write a suppression back with an expiry, and notify the right channel. Kestra gives that logic a declarative home with retries on the token exchange, a graceful degradation path when reachability is unavailable, branch-level task isolation through Switch, and an execution record that shows exactly why a given CVE was suppressed six months ago. Doing the same in a scheduled script means reimplementing OAuth refresh, partial-failure handling, and an audit trail that auditors will actually accept.

Prerequisites

  • An Aikido workspace with API credentials created under Settings, Integrations, Aikido REST API. The credentials need the issues:read and issues:write scopes.
  • Reachability analysis enabled on the workspace. Without it the flow still runs, but every finding resolves to the review branch.
  • A Slack incoming webhook for the escalation channel.
  • Aikido rate-limits the public API to 20 calls per minute per workspace, which the ten minute trigger interval stays comfortably under.

Secrets

  • AIKIDO_CLIENT_ID, AIKIDO_CLIENT_SECRET: OAuth2 client credentials for the Aikido public API.
  • SLACK_WEBHOOK: incoming webhook URL used for escalations and failure notices.

Quick start

  1. Add the secrets above to your Kestra namespace.
  2. Set vars.api_base and vars.token_url to your Aikido region if you are not on the EU instance. The US, AU, and ME regions use app.us.aikido.dev, app.au.aikido.dev, and app.me.aikido.dev.
  3. Run the flow manually with the default issue_group_id to confirm authentication and routing before enabling the trigger.
  4. Tune escalation_score and the trigger's severityThreshold to your own paging appetite.
  5. Enable the trigger and let the first poll seed its baseline.

How to extend

  • Replace the review branch with io.kestra.plugin.core.flow.Pause so a human resumes the execution with an explicit snooze or escalate decision.
  • Open a Jira issue on the escalate branch with io.kestra.plugin.jira.issues.Create and store the ticket key back on the Aikido issue group as a note.
  • Feed the call chain from the reachability response into an AI agent to draft the fix, then attach the suggestion to the Slack message.
  • Widen the suppress branch to also require sla_remediate_by to be more than thirty days out, so nothing close to an SLA breach is ever auto-snoozed.
  • Add a weekly companion flow that lists snoozed issues about to expire so the backlog is reviewed on purpose rather than by surprise.
  • Swap the Slack escalation for io.kestra.plugin.pagerduty.alerts.Create when the finding is both reachable and actively exploited.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.