Skills— plugin

Skills — independently scanned and version-tracked by SaferSkills.

by dotnet·Plugin·github.com/dotnet/skills

Is Skills safe to install?

SaferSkills independently audited Skills (Plugin) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 29 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.

Score
45/100
●●●●●○○○○○
Re-scan~30s
Latest scan
ScannedJun 27, 2026 · 131d ago
Scans run0 over 90 days
Detectors55 checks · 5 categories
Findings0 warnings · 29 high
EngineSaferSkills 2b638c6
View methodology →
SaferSkills installs
This week0
This month0
All time0
CategoryWeightCategory scoreContribution
Securityprompt, exec, net, exfil, eval
35%
0
0.0 pts
Supply chainhash, typosquat, maintainer, lockfile
20%
100
20.0 pts
Maintenancestaleness, pinning, CI
15%
100
15.0 pts
TransparencySKILL.md, perms, README
15%
100
15.0 pts
Communityinstalls, verify, response
15%
100
15.0 pts

Findings & checks · 29 flagged

Securityscore 0 · 29 findings
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · tests/dotnet-test/agent.test-engineer/eval.yaml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpttests/dotnet-test/agent.test-engineer/eval.yaml· yaml
150p=pathlib.Path('fixtures/classic-mstest/.eval-validation/GeneratedTests.csproj');
151p.parent.mkdir(parents=True,exist_ok=True);
152p.write_bytes(base64.b64decode('PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CiAgPFByb3BlcnR5
… (96 chars elided on L152)
153&& dotnet build
154fixtures/classic-mstest/.eval-validation/GeneratedTests.csproj
Occurrences
1 occurrence · at L152
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256c6a1f077829fb465…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · tests/dotnet-test/code-testing/eval.yaml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpttests/dotnet-test/code-testing/eval.yaml· yaml
249p=pathlib.Path('fixtures/classic-mstest/.eval-validation/GeneratedTests.csproj');
250p.parent.mkdir(parents=True,exist_ok=True);
251p.write_bytes(base64.b64decode('PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CiAgPFByb3BlcnR5
… (96 chars elided on L251)
252&& dotnet build
253fixtures/classic-mstest/.eval-validation/GeneratedTests.csproj
Occurrences
1 occurrence · at L251
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256c6a1f077829fb465…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · tests/dotnet-test/test-value-evidence/eval.yaml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpttests/dotnet-test/test-value-evidence/eval.yaml· yaml
96- 25199cc2c189957da34fd9fa417c582a0033d75cfb1772b91caac7d4a135b634:test-value-evidence/SKILL
… (3 chars elided on L96)
97- --original
98- boundary.py:ZGVmIHNoaXBwaW5nX2Nvc3QoYW1vdW50KToKICAgICIiIk9yZGVycyBvZiBhdCBsZWFzdCAxMDAgc2
… (96 chars elided on L98)
99- --tests
100- test_boundary.py
Occurrences
1 occurrence · at L98
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256fdb5c6674126e53f…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · tests/dotnet-winforms/winforms-expert/eval.yaml×19
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpttests/dotnet-winforms/winforms-expert/eval.yaml· yaml
25- type: run-command
26config:
27command: pwsh -NoProfile -EncodedCommand JAB0AGUAeAB0ACAAPQAgAFsASQBPAC4ARgBpAGwAZQBdADoAOgB
… (98 chars elided on L27)
28expected_exit_code: 0
29timeout: 1m
Occurrences
19 occurrences · first at L27, also L68, L109 +16 more
Show all 19 locations
Line
File
L27
tests/dotnet-winforms/winforms-expert/eval.yaml
L68
tests/dotnet-winforms/winforms-expert/eval.yaml
L109
tests/dotnet-winforms/winforms-expert/eval.yaml
L149
tests/dotnet-winforms/winforms-expert/eval.yaml
L159
tests/dotnet-winforms/winforms-expert/eval.yaml
L197
tests/dotnet-winforms/winforms-expert/eval.yaml
L237
tests/dotnet-winforms/winforms-expert/eval.yaml
L279
tests/dotnet-winforms/winforms-expert/eval.yaml
L284
tests/dotnet-winforms/winforms-expert/eval.yaml
L320
tests/dotnet-winforms/winforms-expert/eval.yaml
L330
tests/dotnet-winforms/winforms-expert/eval.yaml
L368
tests/dotnet-winforms/winforms-expert/eval.yaml
L409
tests/dotnet-winforms/winforms-expert/eval.yaml
L414
tests/dotnet-winforms/winforms-expert/eval.yaml
L455
tests/dotnet-winforms/winforms-expert/eval.yaml
L495
tests/dotnet-winforms/winforms-expert/eval.yaml
L536
tests/dotnet-winforms/winforms-expert/eval.yaml
L577
tests/dotnet-winforms/winforms-expert/eval.yaml
L632
tests/dotnet-winforms/winforms-expert/eval.yaml
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha2566a9065fb046a75ae…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/devops-health-check.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/devops-health-check.lock.yml· yaml
1107setupGlobals(core, github, context, exec, io, getOctokit);
1108const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1109await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1109)
1110- name: Redact grader outputs
1111if: always()
Occurrences
1 occurrence · at L1109
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/devops-health-groom.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/devops-health-groom.lock.yml· yaml
1096setupGlobals(core, github, context, exec, io, getOctokit);
1097const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1098await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1098)
1099- name: Redact grader outputs
1100if: always()
Occurrences
1 occurrence · at L1098
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/devops-health-investigate.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/devops-health-investigate.lock.yml· yaml
1147setupGlobals(core, github, context, exec, io, getOctokit);
1148const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1149await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1149)
1150- name: Redact grader outputs
1151if: always()
Occurrences
1 occurrence · at L1149
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/issue-investigate.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/issue-investigate.lock.yml· yaml
1243setupGlobals(core, github, context, exec, io, getOctokit);
1244const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1245await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1245)
1246- name: Redact grader outputs
1247if: always()
Occurrences
1 occurrence · at L1245
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/issue-triage.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/issue-triage.lock.yml· yaml
1248setupGlobals(core, github, context, exec, io, getOctokit);
1249const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1250await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1250)
1251- name: Redact grader outputs
1252if: always()
Occurrences
1 occurrence · at L1250
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/markdown-linter.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/markdown-linter.lock.yml· yaml
1183setupGlobals(core, github, context, exec, io, getOctokit);
1184const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1185await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1185)
1186- name: Redact grader outputs
1187if: always()
Occurrences
1 occurrence · at L1185
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
HIGHLong base64-encoded blob hidden in the skill documentationSS-SKILL-INJECT-B64-PAYLOAD-01 · Prompt injection · .github/workflows/pr-malicious-scan.agent.lock.yml
HIGH — once decoded by the agent, an encoded payload has the same impact class as plain-text injection.
Why it matters

A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.

The exact value spotted
excerpt.github/workflows/pr-malicious-scan.agent.lock.yml· yaml
1217setupGlobals(core, github, context, exec, io, getOctokit);
1218const { main } = require(path.join(actionsDir, 'trace_graders.cjs'));
1219await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6InRvb2wtc3VjY2Vzcy1yYXRlIiwibmFtZSI6IlRv
… (96 chars elided on L1219)
1220- name: Redact grader outputs
1221if: always()
Occurrences
1 occurrence · at L1219
How to fix
Remove the encoded blob, or decode it and review what it actually contains.
  1. Decode the base64 string and confirm it is not an instruction directed at the agent.
  2. Move any legitimate binary or signature data into a dedicated file (*.sig, SIGNATURES) outside the documentation.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-B64-PAYLOAD-01sha256f834a6cb209b1568…rubric 365aacaView on GitHub
Supply chainscore 100 · 0 findings
✓—All supply chain checks passedNo findings in this category for the latest scan.pass
Maintenancescore 100 · 0 findings
✓—All maintenance checks passedNo findings in this category for the latest scan.pass
Transparencyscore 100 · 0 findings
✓—All transparency checks passedNo findings in this category for the latest scan.pass
Communityscore 100 · 0 findings
✓—All community checks passedNo findings in this category for the latest scan.pass
Vendor response · right of reply
Are you the maintainer? Submit a response →

Audit the pieces. Scan the whole. Decide.

~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.