diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/security-smoke.sh | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/scripts/security-smoke.sh b/scripts/security-smoke.sh deleted file mode 100755 index a8cabbd..0000000 --- a/scripts/security-smoke.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env bash -# -# Negative-path smoke tests for the hardened pi-chrome bridge. -# -# Run against a live bridge (Pi session must be running with this pi-chrome version). -# These tests do NOT require an extension to be paired; they assert that unauthenticated -# callers cannot drive Chrome through the bridge. -# -# usage: ./scripts/security-smoke.sh -# -# Each test is independent. Failures print FAIL and a non-zero exit at the end. - -set -u - -BRIDGE_URL="${PI_CHROME_BRIDGE_URL:-http://127.0.0.1:17318}" -FAILED=0 -pass() { echo "PASS $1"; } -fail() { echo "FAIL $1 (got: $2)"; FAILED=$((FAILED+1)); } - -check_status() { - local desc="$1" expected="$2" actual="$3" - if [[ "$actual" == "$expected" ]]; then pass "$desc"; else fail "$desc — expected HTTP $expected" "$actual"; fi -} - -http_status() { - curl -sS -o /dev/null -w "%{http_code}" "$@" -} - -echo "Bridge URL: $BRIDGE_URL" - -# 1. /command without auth header -> 401 (broker auth required) -status=$(http_status -X POST "$BRIDGE_URL/command" -H 'content-type: application/json' --data '{"action":"tab.list","params":{}}') -check_status "/command without auth -> 401" 401 "$status" - -# 2. /next from random chrome-extension origin returns 200 idle and never delivers a command. -# Until the bridge is paired, the response includes {"needsPairing":true}. After pairing, -# a non-pinned origin still gets the same idle payload (never the queued command). Either -# way: type=none, no commands. -body=$(curl -sS -H 'Origin: chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' "$BRIDGE_URL/next?name=smoke") -if echo "$body" | grep -q '"type":"none"' && ! echo "$body" | grep -q '"type":"command"'; then - pass "/next from unpinned chrome-extension origin is idle, never command" -else - fail "/next from unpinned chrome-extension origin" "$body" -fi - -# 3. /next with wrong-shaped Origin (real web origin) -> 403 -status=$(http_status -H 'Origin: https://example.com' "$BRIDGE_URL/next") -check_status "/next from web origin -> 403" 403 "$status" - -# 4. Oversized body to /command -> 413. Stream via stdin so argv stays sane on macOS. -status=$(head -c $((2*1024*1024)) /dev/zero | tr '\0' 'x' \ - | curl -sS -o /dev/null -w "%{http_code}" -X POST "$BRIDGE_URL/command" \ - -H 'content-type: application/json' --data-binary @-) -check_status "/command oversized body -> 413" 413 "$status" - -# 5. Malformed JSON to /result without auth: must be rejected (401/403) and must not crash -# the server. Verify by hitting /status afterwards. -status=$(http_status -X POST "$BRIDGE_URL/result" \ - -H 'content-type: application/json' \ - -H 'Origin: chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \ - --data 'not json') -case "$status" in - 401|403) pass "/result malformed JSON without auth rejected ($status)";; - *) fail "/result malformed JSON without auth" "$status";; -esac -# Confirm server stayed responsive after the parse-error attempt. -status=$(http_status "$BRIDGE_URL/status") -check_status "/status still responsive after malformed POST" 200 "$status" - -# 6. /status is OK (loopback only, no secrets) -> 200 -status=$(http_status "$BRIDGE_URL/status") -check_status "/status -> 200" 200 "$status" - -# 7. /command with bogus auth header -> 401 -status=$(http_status -X POST "$BRIDGE_URL/command" \ - -H 'content-type: application/json' \ - -H 'x-pi-chrome-auth: v1 ts=1 nonce=AAAA sig=AAAA' \ - --data '{"action":"tab.list","params":{}}') -check_status "/command with bogus auth -> 401" 401 "$status" - -# 8. /pair without active pairing window -> 403 -status=$(http_status -X POST "$BRIDGE_URL/pair" \ - -H 'content-type: application/json' \ - -H 'Origin: chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \ - --data '{"extensionId":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","extensionNonce":"AAAA","mac":"AAAA"}') -case "$status" in - 401|403) pass "/pair without active window rejected ($status)";; - *) fail "/pair without active window" "$status";; -esac - -echo -if [[ $FAILED -eq 0 ]]; then - echo "ALL SMOKE TESTS PASSED" - exit 0 -else - echo "$FAILED test(s) failed" - exit 1 -fi |
