MCP, MCP server
pporlock
Local HTTPS interception and modification for Chrome, on macOS.
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST SECRETS_PATH_DOTENV SECRETS_ENV_READ OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
daemon/src/pporlock/capture/dryrun.py, line 257
shutil.rmtree(root, ignore_errors=True) - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
daemon/src/pporlock/addon/interceptor.py, line 265
# JavaScript reacts badly to a failed fetch (REQ PXY-031). - SECRETS_PATH_DOTENV Low
Mentions a .env file.
.gitignore, line 37
.env - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
mcp/src/pporlock_mcp/client.py, line 51
env = os.environ.get("PPORLOCK_TOKEN") - OBFUSCATION_FILE_OVER_READ_CAP Note
A file was over the read cap and was not fully read.
docs/architecture.html, line 1
<!DOCTYPE html> - OBFUSCATION_FILE_CAP_REACHED Note
The 400 file cap was reached before every file was read.
docs/architecture.html, line 1
<!DOCTYPE html>
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
daemon/src/pporlock/capture/dryrun.py, line 257
shutil.rmtree(root, ignore_errors=True)
daemon/src/pporlock/cli/certs.py, line 47
return subprocess.run( # noqa: S603 # nosec B603
daemon/src/pporlock/cli/launchd.py, line 94
return subprocess.run( # noqa: S603 # nosec B603
Show more
daemon/src/pporlock/cli/main.py, line 178
shutil.rmtree(state_dir, ignore_errors=True)
daemon/src/pporlock/cli/main.py, line 179
shutil.rmtree(log_dir, ignore_errors=True)
daemon/src/pporlock/control/app.py, line 253
shutil.rmtree(directory, ignore_errors=True)
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Concern
can reach a host that is not written as a fixed address.
NETWORK_NO_FIXED_HOST
daemon/src/pporlock/addon/interceptor.py, line 265
# JavaScript reacts badly to a failed fetch (REQ PXY-031).
daemon/src/pporlock/cli/client.py, line 94
with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 # nosec B310
daemon/src/pporlock/control/auth.py, line 201
none did not come from a page. curl and the CLI legitimately omit it,
Show more
extension/src/background/icon.ts, line 207
flowerBitmap ??= fetch(url)
extension/src/shared/api.ts, line 78
const response = await fetch(`${this.origin}${path}`, init);
extension/src/shared/api.ts, line 109
const response = await fetch(`${this.origin}${path}`, init);
testfixtures/origin/server.py, line 101
<script>fetch('/dest/json');</script>
web/e2e/extension/attribution.spec.ts, line 70
if ((await fetch(url)).ok) return;
web/e2e/extension/attribution.spec.ts, line 92
return (await fetch(`http://127.0.0.1:${controlPort}/metrics`, {
web/e2e/extension/attribution.spec.ts, line 139
const begin = (await fetch(`http://127.0.0.1:${controlPort}/pair/begin`, {
web/e2e/extension/attribution.spec.ts, line 195
const flows = (await fetch(`http://127.0.0.1:${controlPort}/flows?limit=200`, {
web/e2e/extension/banner.spec.ts, line 142
if ((await fetch(`http://127.0.0.1:${controlPort}/state/health`)).ok) return;
web/e2e/extension/banner.spec.ts, line 252
await fetch(`http://127.0.0.1:${controlPort}/flows?limit=100`, {
web/e2e/extension/banner.spec.ts, line 313
await fetch(`http://127.0.0.1:${controlPort}/flows?limit=100`, {
web/e2e/extension/failsafe.spec.ts, line 45
if ((await fetch(`http://127.0.0.1:${fixturePort}/health`)).ok) return;
web/e2e/extension/failsafe.spec.ts, line 66
const res = await fetch(`http://127.0.0.1:${controlPort}/state/health`);
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
mcp/src/pporlock_mcp/client.py, line 51
env = os.environ.get("PPORLOCK_TOKEN")
.githooks/pre-commit, line 26
if echo "$STAGED" | grep -qE '(^|/)(\.env|\.pporlock/|\.mitmproxy/)|\.(pem|key)$'; then
.gitignore, line 37
.env
Show more
.gitignore, line 36
# Local state - NEVER commit
docs/implementation-plan.md, line 188
- Blocks commits containing `~/.pporlock/token`, `.mitmproxy`, or `.env` paths
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read. the file cap was reached before every file was read.
OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED
docs/architecture.html, line 1
<!DOCTYPE html>
docs/request-lifecycle.html, line 1
<!DOCTYPE html>
docs/rules-engine.html, line 1
<!DOCTYPE html>
Show more
web/src/components/modules/GuidesDialog.tsx, line 1
/**
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 a6811360faa8. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file. a file was over the read cap and was not fully read. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: a6811360faa81028fc4406e34421eca3447db667
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.