CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

github-actions-injection

GitHub Actions ${{ }} expression injection — attacker-controlled context (issue/PR title, body, branch name, commit message) substituted into run: steps, unsafe pull_request_target + PR-head checkout, GITHUB_TOKEN scope abuse, artifact/cache poisoning, action tag-vs-SHA pinning.

Quality

83%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Critical

Do not install without reviewing

SKILL.md
Quality
Evals
Security

Quality

Content

90%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

An exemplary tactical security skill body: lean, dense with executable commands and payloads, well-organized by technique, with a safety decision gate covering verification and cleanup. The only notable gaps are implicit mid-workflow checkpoints (e.g., confirming the beacon fired) and one cross-skill reference that has no corresponding file in the bundle.

DimensionReasoningScore

Conciseness

The body is dense and tactical with no padding: it skips general concepts (no "what is GitHub Actions") and spends every line on non-obvious specifics — the untrusted-context sink table, the runner interpolation-before-shell mechanic, shell-meta-valid Git branch chars, and CVE-2025-30066 as evidence for a recurring pattern. Not 4 because even the tightest sections (grep recon, exploit payloads, decision gate) carry unique operational value with essentially nothing to trim.

5 / 5

Actionability

Nearly everything is copy-paste ready: the grep sink-finder, the actionlint docker command, the issue-title exploit payload with its expanded-shell trace, the branch-name injection git sequence, token-scope probes via curl/gh, and the org-wide action-pin inventory script. The few placeholders (<REPO>, <COLLAB>) are target parameters inherent to a PoC, not pseudocode. Not 4 because the concrete examples cover all the common cases (title injection, branch injection, pull_request_target checkout, token abuse, pinning) with executable detail.

5 / 5

Workflow Clarity

The body follows a usable implicit sequence — untrusted-context inventory, recon (grep/actionlint), sink pattern, exploit payloads, variants, defender patterns, detection signatures, and a numbered Decision gate with explicit verification ("once the screenshot is captured") and cleanup ("Close + delete the issue, branch, and any artifact"). Not 5 because the middle of the flow lacks explicit checkpoints — e.g., no step confirming the collaborator beacon actually fired before moving to token-scope abuse, and the recon-to-exploit transition is implicit in section ordering rather than stated. Not 3 because verification and cleanup steps are present in the Decision gate, so this is not an unvalidated risky workflow.

4 / 5

Progressive Disclosure

The single-file body is well-sectioned with scannable headers and tables, and content stays at one level with no nested references; for this skill's size the inline detail (sink table, detection signatures, tools table) is appropriately placed. Not 5 because the body points to `poisoned-pipeline-execution/SKILL.md`, which does not exist in this bundle (no references/, scripts/, or assets/ directories), leaving one dangling cross-reference; and at ~190 lines some material (e.g., exploit payload variants or the token-abuse catalog) could be split into referenced files. Not 3 because organization, signaling, and navigation within the file are clean.

4 / 5

Total

18

/

20

Passed

Description

71%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A specific, keyword-rich description that clearly delineates the GitHub Actions expression-injection niche with comprehensive enumeration of attack surfaces. Its main weakness is the missing explicit 'Use when...' trigger clause, which caps completeness, and a few natural synonyms (script injection, workflow injection) that only appear in metadata rather than the description itself.

Suggestions

Append an explicit trigger clause to the description, e.g. "Use when auditing or exploiting GitHub Actions workflows that interpolate untrusted github.event.* context, or when the user mentions pull_request_target, GITHUB_TOKEN leaks, or CI/CD script injection."

Fold natural synonyms currently only in metadata.when_to_use ("script injection", "workflow injection", "command injection") into the description body to improve trigger-term coverage.

Clarify the boundary with adjacent supply-chain skills (e.g., artifact poisoning / action pinning) by framing those as detection/defense aspects of this niche, reducing overlap with a pipeline-poisoning sibling skill.

DimensionReasoningScore

Specificity

The description enumerates multiple concrete, specific capabilities rather than vague language: "attacker-controlled context (issue/PR title, body, branch name, commit message) substituted into run: steps", "unsafe pull_request_target + PR-head checkout", "GITHUB_TOKEN scope abuse, artifact/cache poisoning, action tag-vs-SHA pinning" — comprehensive coverage of the expression-injection domain. Not 4 because coverage spans all major sub-techniques of the niche with no noticeable gaps.

5 / 5

Completeness

The 'what' is clear and detailed (the enumerated attack surfaces), but there is no "Use when..." clause or equivalent explicit trigger guidance — the rubric explicitly caps completeness at 3 in that case. The conditions listed ("attacker-controlled context... substituted into run: steps") only weakly imply when the skill applies. Not 4 because the 'when' is absent rather than merely imprecise.

3 / 5

Trigger Term Quality

Strong natural keywords a practitioner would actually say: "GitHub Actions", "expression injection", "pull_request_target", "GITHUB_TOKEN", "branch name", "run: steps", "tag-vs-SHA pinning". Not 5 because a few natural synonyms are missing from the description itself (e.g., "script injection", "command injection", "workflow injection"), which appear only in the metadata when_to_use field. Not 3 because the terms present go well beyond 'some relevant keywords' — they include the exact API/event names users would type.

4 / 5

Distinctiveness Conflict Risk

The niche ("GitHub Actions ${{ }} expression injection") is sharply defined with distinct triggers like pull_request_target and GITHUB_TOKEN that would not fire for unrelated skills. Not 5 because the trailing items "artifact/cache poisoning, action tag-vs-SHA pinning" bleed into supply-chain/pipeline-poisoning territory, creating minor overlap risk with a closely related sibling skill (referenced in the body as poisoned-pipeline-execution).

4 / 5

Total

16

/

20

Passed

Validation

93%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 15 / 16 Passed

Validation for skill structure

CriteriaDescriptionResult

metadata_version

'metadata.version' is missing

Warning

Total

15

/

16

Passed

Repository

PurpleAILAB/Decepticon

Path

packages/decepticon/decepticon/skills/standard/exploit/cicd/github-actions-injection/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.