본문으로 건너뛰기
cccskills
무료GitHub에 공개

aikido-triage

Triages an Aikido security findings CSV against a local codebase. For each finding, reads the flagged file, traces the code path, and verdicts it as KEEP OPEN or CLOSE with a specific reason. Outputs a reviewed CSV and a self-contained HTML evidence report. Run this at the end of a pentest when an Aikido CSV is available.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구GitHubRedis
설치 방법 보기

포함된 파일(1)

  • SKILL.md12.2 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Aikido Findings Triage Workflow

You are triaging an Aikido SAST/SCA/secret-scanning CSV export against a local codebase. Your job is to read every finding, investigate the flagged code, and verdict each one with evidence. At the end you produce a reviewed CSV and a self-contained HTML report.

Do not guess. Read the actual files before rendering a verdict.


Arguments

Parse from the user's invocation:

  • CSV_PATH — path to the Aikido CSV export
  • CODEBASE_PATH — absolute path to the local codebase to investigate

If either argument is missing, ask the user before proceeding.


Phase 1 — Parse the CSV

  1. Read CSV_PATH with the Read tool.

  2. Parse every row. Key columns to extract per finding:

    • aikido_issue_id — unique ID
    • type — sast | open_source | leaked_secret | eol
    • severity — critical / high / medium / low
    • affected_file — relative path to the flagged file
    • related_cve — CVE or advisory ID (may be empty)
    • rule — rule name that fired
    • start_line / end_line — flagged line range
    • installed_version / patched_version — for SCA findings
    • affected_package — for SCA/EOL findings
  3. Group findings by type so you can batch-investigate efficiently.


Phase 2 — Investigate Each Finding

Work through findings type by type. For each one, read the flagged file and apply the investigation playbook for that type.

2a — leaked_secret findings

Step 1 — Does the file exist?

Use the Read tool on CODEBASE_PATH/affected_file. If the file does not exist: → Verdict: CLOSE — File Removed → Note: "File does not exist at HEAD. Finding references removed code in git history." → Move on. Do not investigate further.

Step 2 — Read the flagged lines.

Read start_line to end_line (expand by ±3 lines for context).

Apply these patterns:

What you seeVerdict
ENV.fetch(...), ENV[...], ENV.fetch(..., nil)CLOSE — False Positive (env var read)
${{ secrets.* }} (GitHub Actions)CLOSE — False Positive (GH Actions secret)
${VARIABLE_NAME} in .npmrc/.env.exampleCLOSE — False Positive (env var placeholder)
--mount=type=secret in DockerfileCLOSE — False Positive (Docker build secret)
A long regex, UA string, or binary-looking dataCLOSE — False Positive (pattern mismatch)
An actual hardcoded token/key/password stringKEEP OPEN — check liveness if possible
A real URL with embedded credentials (user:pass@host)KEEP OPEN

For sidekiq-sensitive-url rule: check whether the flagged content is a Redis URL with credentials or just a gem declaration. Almost always a false positive in Gemfile/Gemfile.lock.

Step 3 — If hardcoded secret found:

  • Note the exact line and masked value
  • Check if secret_liveness column says active — if so, escalate to critical
  • Verdict: KEEP OPEN — Hardcoded Secret

2b — sast findings

Step 1 — Read the flagged file and lines.

Read CODEBASE_PATH/affected_file at start_line ± 10 lines of context.

Step 2 — Apply rule-specific investigation:

NoSQL injection (NoSQL injection attack possible)

  • Trace what the flagged call actually does. Follow the call chain:
    1. What does the flagged function call?
    2. Does it call a NoSQL driver (MongoDB, Redis query, Elasticsearch, Mongoose)?
    3. Or does it call an HTTP client (axios, fetch, HTTParty)?
  • Check CODEBASE_PATH/Gemfile and CODEBASE_PATH/package.json for NoSQL drivers.
  • If no NoSQL driver exists in the stack: CLOSE — False Positive

SQL injection (SQL injection, string-based query concatenation)

  • Read the flagged method. Check:
    1. Is there actual string interpolation into a raw SQL string? ("... #{variable}")
    2. What is the type of the interpolated variable? (Ruby Date, Integer, String?)
    3. Is it executed via select_all, execute, or connection.exec?
    4. Trace the variable back to its source — is it user-controlled?
  • If raw interpolation exists but type coercion removes the injection vector: KEEP OPEN — Medium (dangerous pattern, mitigated)
  • If raw interpolation with no type coercion on a user-controlled string: KEEP OPEN — High
  • If interpolation is of a hardcoded or server-side-only value: CLOSE — False Positive

Unpinned GitHub Actions (3rd party Github Actions should be pinned)

  • Read the workflow file at the flagged line.
  • Check if uses: has a SHA pin (@abc123def...) or only a tag (@v2, @main).
  • Tag-pinned or branch-pinned: KEEP OPEN — Real Finding
  • SHA-pinned: CLOSE — False Positive

NODE_AUTH_TOKEN (Use of NODE_AUTH_TOKEN)

  • Read the flagged line. If value is ${{ secrets.* }}: CLOSE — False Positive
  • If hardcoded token value: KEEP OPEN

Other SAST rules

  • Read the flagged lines. Apply judgment: is the finding actually present in the code, or is it a pattern-match on a non-vulnerable construct? Document what you found.

2c — open_source / SCA findings

For each SCA finding:

Step 1 — Identify the vulnerable function from the CVE/advisory.

Use your knowledge of the CVE to identify what specific function/class is vulnerable. If you need more detail, use /analyze-cve to do a full dataflow trace.

Step 2 — Check if the package is used in application source code.

Use Grep to search for imports of the package in the application source:

  • JS/TS: import .* from 'package-name' or require('package-name')
  • Ruby: require 'package' or check Gemfile for direct gem declaration vs transitive

Step 3 — Apply these verdicts:

ScenarioVerdict
Package not imported anywhere in app source (transitive/build-only)CLOSE — Not Exploitable
Package imported but vulnerable function never calledCLOSE — Not Exploitable
Package imported, vulnerable function called, no user input reaches itCLOSE — Not Exploitable
Package imported, vulnerable function called with user-controlled input, no sanitizationKEEP OPEN
devDependency only (webpack-dev-server, jest, babel plugins)CLOSE — Not Exploitable

Step 4 — For complex SCA findings with user-reachable code paths: Run /analyze-cve skill to do a full dataflow trace before rendering the verdict.


2d — eol findings

  • Read the version file (.ruby-version, check package.json for the framework version).
  • Confirm the actual installed version.
  • Look up the EOL date from your knowledge.
  • If EOL date has passed: KEEP OPEN — Real Finding
  • Document the EOL date and recommended upgrade path.

Phase 3 — Assign Final Verdicts

For every finding, assign:

FieldValues
recommended_actionKEEP OPEN or CLOSE
close_categoryFalse Positive / File Removed / Not Exploitable / Real Finding
analyst_notesOne sentence — what you found and why
evidenceSpecific file:line references and code fragments proving the verdict

Phase 4 — Output the Reviewed CSV

Write a new CSV to the same directory as the input CSV, named <original-name>-reviewed.csv.

Column set (lean — do not include empty cloud/VM/container columns from the original):

aikido_issue_id, type, severity, affected_file, related_cve, rule, start_line,
recommended_action, close_category, analyst_notes, evidence

Rules:

  • Wrap any field containing commas in double quotes
  • Use | (space-pipe-space) as separator within the evidence field — never commas
  • Keep analyst_notes to one sentence with no commas
  • Every row must have exactly 11 fields

Phase 5 — Generate the HTML Evidence Report

Write a self-contained HTML file to the same directory as the CSV, named <project-name>-security-review.html.

HTML structure (follow this exactly)

1. <header>  — project name, analyst, date, branch/source
2. Stats bar — total / close / keep open / false positive / file removed / not exploitable counts
3. Jump nav  — anchor links to each section
4. Full summary table — all findings, colour-coded by severity and action
5. KEEP OPEN section — one detailed card per finding with full code evidence
6. FALSE POSITIVES section — one card per finding with evidence showing why it's a FP
7. FILE REMOVED section — simple table (no code to show)
8. NOT EXPLOITABLE section — one card per finding with code evidence
9. <footer>

Card anatomy (for sections 5, 6, 8)

Each finding card must contain:

  • Finding ID, severity badge, type, file:line
  • recommended_action badge
  • Verdict paragraph — plain English explanation
  • Fix (for KEEP OPEN only) — exact command or code change required
  • Evidence code block — the actual lines from the file, syntax-highlighted, with line numbers and comments explaining what is or isn't vulnerable

Code block style

Use <pre> blocks with dark background. Add inline <span> highlights:

  • class="highlight" — red, for the vulnerable or suspicious line
  • class="ok" — green, for the safe/correct pattern
  • class="comment" — gray, for explanatory annotations added by the analyst

Severity badge colours

  • Critical → red background
  • High → orange background
  • Medium → yellow background
  • Low → green background

Action badge colours

  • KEEP OPEN → red
  • CLOSE → green

Close category badge colours

  • False Positive → blue
  • File Removed → purple
  • Not Exploitable → green
  • Real Finding → red

CSS

Embed all CSS in a <style> block in <head>. No external dependencies — the file must be fully self-contained and openable offline.

Use a clean, professional light theme. Monospace font for file paths and code. System font stack for prose.


Phase 6 — Summary to User

After writing both files, output a short summary:

## Triage complete

**CSV:** /path/to/reviewed.csv
**Report:** /path/to/report.html

| Action     | Count |
|------------|-------|
| KEEP OPEN  | N     |
| CLOSE      | N     |
| — False Positive | N |
| — File Removed   | N |
| — Not Exploitable| N |

**Keep open findings:**
- [ID] severity — short description
- ...

Rules

  • Read every flagged file before rendering a verdict. Never close a finding based on the rule name alone.
  • Batch independent reads in parallel — read multiple files in one response when they don't depend on each other.
  • Use /analyze-cve for complex SCA findings where user input may reach the vulnerable function. Do not skip this.
  • For leaked_secret findings on files that exist: always read the exact flagged lines. Do not assume it's a false positive without looking.
  • Preserve line numbers in all code snippets — use the actual line numbers from the source file.
  • Do not fabricate code. Only quote lines you have actually read from the file.
  • Write the HTML last — after all verdicts are finalized, so the report is complete.
  • Do not include empty columns in the output CSV — strip the cloud/VM/container/ARN columns from the original Aikido export.

Finding type quick reference

Aikido typePrimary checkMost common outcome
leaked_secretDoes file exist? Then read flagged lines.False Positive or File Removed
sast — NoSQLTrace call chain to actual DB driverAlmost always False Positive if MySQL/Postgres stack
sast — SQLiRead raw SQL method, check interpolation + type coercionMedium finding, often partially mitigated
sast — ActionsCheck for SHA pin vs tag pinReal finding if tag-pinned
open_sourceGrep app source for import, check if vulnerable function usedOften Not Exploitable (transitive/build-only)
eolRead version file, check EOL dateAlways a real finding if EOL date passed

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Exploit pervasive logical flaws in Multi-Factor Authentication (MFA/2FA) implementations to bypass the secondary authentication challenge entirely. Techniques include response manipulation, referal spoofing, token reuse, and predictable backup codes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

401/403 bypass playbook. Use when encountering access-denied responses on admin panels, API endpoints, or restricted paths. Covers path manipulation, HTTP method tampering, header injection, protocol downgrade, and automated bypass tools.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

Complete PortSwigger deep-dive with exact payloads for every lab variant including zero-day techniques

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

Active Directory ACL abuse playbook. Use when exploiting misconfigured AD permissions including GenericAll, WriteDACL, DCSync rights, shadow credentials, LAPS reading, GPO abuse, and BloodHound-guided attack paths.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

Execute AS-REP Roasting to extract and crack the NTLM hashes of Active Directory user accounts that have the "Do not require Kerberos preauthentication" flag explicitly enabled. This attack generates a recoverable Ticket Granting Ticket (TGT) without requiring the attacker to authenticate first.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

AD Certificate Services attack playbook. Use when targeting misconfigured AD CS for privilege escalation via ESC1-ESC13 template abuse, NTLM relay to enrollment, CA officer abuse, and certificate-based persistence.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

ShulkwiSEC/bb-huge232026년 7월 11일 업데이트

ShulkwiSEC의 스킬 모두 보기

이 스킬의 문제 신고