MCP, MCP server
Aperion Shield
Works with:
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit b1cdc28f164e, unchanged since the check below.
INSTALL_REMOTE_SCRIPT OBFUSCATION_RUNS_ENCODED_PAYLOAD PERMISSION_SHELL_UNDECLARED SECRETS_PATH_CREDENTIAL
Why this grade
- INSTALL_REMOTE_SCRIPT High
Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).
install.sh, line 4
# curl -fsSL https://shield-get.aperion.ai | sh - OBFUSCATION_RUNS_ENCODED_PAYLOAD High
Decodes and runs an encoded payload (for example eval with atob or base64).
src/scan/mod.rs, line 978
let ids = scan_str("x.js", "eval(atob(payload))"); - PERMISSION_SHELL_UNDECLARED Medium
Runs shell commands that the manifest or description does not mention.
README.md, line 393
(fetch piped into `Invoke-Expression`), tier **Critical**. - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
src/engine.rs, line 38
//! sensitive_paths: ['/etc/**', '~/.ssh/**', '~/.aws/**'] # NEW (v2)
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.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
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
requests shell access. No manifest field names shell or command execution.
PERMISSION_SHELL_UNDECLARED
README.md, line 393
(fetch piped into `Invoke-Expression`), tier **Critical**.
config/shieldset.yaml, line 953
- '(?i)\b(Invoke-WebRequest|iwr|curl|wget|Invoke-RestMethod|irm)\b[^\n]*\|\s*(iex|Invoke-Expression)\b'
config/shieldset.yaml, line 954
- '(?i)\b(iex|Invoke-Expression)\s*\(\s*(New-Object\s+Net\.WebClient|Invoke-WebRequest|iwr|irm)\b'
Show more
config/shieldset.yaml, line 955
reason: "PowerShell download-and-execute (fetch piped to Invoke-Expression) -- the Windows curl|sh."
Install and update
Serious
install fetches a script from the network. README documents an installer that pipes a download into a shell. The docs document an installer that pipes a download into a shell.
INSTALL_REMOTE_SCRIPT INSTALL_DOCUMENTED_INSTALLER
README.md, line 50
project MCP + Skills, and `curl -fsSL https://shield-get.aperion.ai | sh`.
README.md, line 73
curl -fsSL https://shield-get.aperion.ai | sh
install.sh, line 4
# curl -fsSL https://shield-get.aperion.ai | sh
Show more
README.md, line 235
3. **`curl | sh` install.** `curl -fsSL https://shield-get.aperion.ai | sh`
README.md, line 241
curl -fsSL https://shield-get.aperion.ai | sh
README.md, line 810
curl -fsSL https://shield-get.aperion.ai | sh
install.sh, line 169
echo " Shared box: SHIELD_INSTALL_DIR=/usr/local/bin sudo -E sh -c 'curl -fsSL https://shield-get.aperion.ai | sh'"
docs/INSTALL.md, line 6
curl -fsSL https://shield-get.aperion.ai | sh
docs/INSTALL.md, line 14
curl -fsSL https://shield-get.aperion.ai | sh
docs/INSTALL.md, line 20
curl -fsSL https://raw.githubusercontent.com/AperionAI/shield/main/install.sh | sh
docs/INSTALL.md, line 52
curl -fsSL https://shield-get.aperion.ai | sh
docs/shieldset-as-code.md, line 239
[allow -> approval] run_terminal: curl https://artifacts.corp/install.sh | sh
src/predicates.rs, line 1046
"curl -s https://x | bash -c 'cat > /tmp/out'"
Network
Concern
can reach a host that is not written as a fixed address. can reach api.github.com. The description does not name that host. can reach cluster1.aperion.ai. The description does not name that host. can reach .... The description does not name that host. can reach x. The description does not name that host. can reach example.com. The description does not name that host. can reach api.example. The description does not name that host. can reach x.example. The description does not name that host. can
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
install.sh, line 8
# curl + tar + (shasum or sha256sum).
install.sh, line 109
json="$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest")" || err "couldn't resolve latest release"
install.sh, line 123
command -v curl >/dev/null 2>&1 || err "curl is required"
Show more
install.sh, line 135
curl -fSL "$url" -o "$tmp/$asset" || err "download failed: $url"
install.sh, line 137
if curl -fSL "$url.sha256" -o "$tmp/$asset.sha256" 2>/dev/null; then
src/engine.rs, line 1743
let p = json!({"command": "curl -X DELETE https://cluster1.aperion.ai/api/policies/hipaa"});
src/predicates.rs, line 26
/// `curl ... | tee /tmp/x && sh /tmp/x`, and similar "trust-on-first-use"
src/predicates.rs, line 32
/// (`curl -d`, `wget --post-data`, `nc <host>`, an `http*://` argument
src/predicates.rs, line 1326
"curl http://localhost:7778/api/admin/quarantine"
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
src/context.rs, line 96
&policy_with_signals(&[".env.production", "prod/"]),
src/context.rs, line 106
fs::write(tmp.path().join(".env.production"), "DB=prod").unwrap();
src/engine.rs, line 38
//! sensitive_paths: ['/etc/**', '~/.ssh/**', '~/.aws/**'] # NEW (v2)
Show more
src/context.rs, line 108
WorkspaceContext::probe_at(&policy_with_signals(&[".env.production"]), tmp.path());
src/context.rs, line 110
assert_eq!(ctx.matched_signals, vec![".env.production".to_string()]);
src/context.rs, line 133
fs::write(tmp.path().join(".env.production"), "x").unwrap();
src/context.rs, line 134
let mut p = policy_with_signals(&[".env.production"]);
src/engine.rs, line 11
//! prod_signals: [".env.production", "prod/", "Procfile"]
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Serious
runs an encoded payload.
OBFUSCATION_RUNS_ENCODED_PAYLOAD
src/scan/mod.rs, line 978
let ids = scan_str("x.js", "eval(atob(payload))");
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 b1cdc28f164e. requests shell access. No manifest field names shell or command execution. install fetches a script from the network. README documents an installer that pipes a download into a shell. The docs document an installer that pipes a download into a shell. can reach a host that is not written as a fixed address. can reach api.github.com. The description does not name that host. can reach cluster1.aperion.ai. The description does not name that host. can reach .... The description does not name that host. can reach x. The description does not name that host. can reach example.com. The description does not name that host. can reach api.example. The
Date and source
Date checked:
github.com
Commit graded: b1cdc28f164e93704f6541b0a3cd6e065a800979
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.