Download scripts/test_authorization_tampering.sh from Snapkitty/pax-coder: direct link, hf CLI and curl.
- Browser
- Download file 10.9 kB
-
https://huggingface.co/Snapkitty/pax-coder/resolve/main/scripts/test_authorization_tampering.sh
- Command line
-
hf download hf://Snapkitty/pax-coder/scripts/test_authorization_tampering.sh
-
curl -L -o test_authorization_tampering.sh https://huggingface.co/Snapkitty/pax-coder/resolve/main/scripts/test_authorization_tampering.sh
10.9 kB
| # Test Suite for Authorization Tampering Detection (ADR-0010 + ADR-0009) | |
| # | |
| # Comprehensive security tests verifying that: | |
| # - Local modification of authorization.json is detected | |
| # - Signature verification prevents tampering | |
| # - All critical fields are protected | |
| # | |
| # Usage: ./scripts/test_authorization_tampering.sh | |
| set -e | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| REPO_ROOT="$(dirname "$SCRIPT_DIR")" | |
| SOVEREIGN_DIR="$REPO_ROOT/sovereign" | |
| PASS=0 | |
| FAIL=0 | |
| # Colors | |
| GREEN='\033[0;32m' | |
| RED='\033[0;31m' | |
| NC='\033[0m' | |
| echo "==========================================" | |
| echo "AUTHORIZATION TAMPERING TEST SUITE" | |
| echo "==========================================" | |
| echo "" | |
| # Store original authorization | |
| ORIGINAL_AUTH=$(cat "$SOVEREIGN_DIR/authorization.json" 2>/dev/null) | |
| # Restore function | |
| restore_auth() { | |
| echo "$ORIGINAL_AUTH" > "$SOVEREIGN_DIR/authorization.json" | |
| } | |
| # ============================================================================ | |
| # Test 1: Valid (unmodified) authorization with verify-node-authorization | |
| # ============================================================================ | |
| echo "[Test 1] Unmodified ACTIVE authorization = ACCEPT" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test1.log 2>&1; then | |
| echo -e "${GREEN}β PASS${NC} - Valid authorization accepted" | |
| PASS=$((PASS+1)) | |
| else | |
| EXIT_CODE=$? | |
| if grep -q "ACTIVE" /tmp/test1.log; then | |
| echo -e "${GREEN}β PASS${NC} - Authorization structure valid" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Could not verify baseline" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| rm -f /tmp/test1.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 2: REQUESTED status = DENY | |
| # ============================================================================ | |
| echo "[Test 2] authorization_status=REQUESTED = DENY" | |
| # Create variant with REQUESTED status | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"authorization_status": "ACTIVE"/"authorization_status": "REQUESTED"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test2.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "REQUESTED\|not yet authorized" /tmp/test2.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected REQUESTED" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error: $(cat /tmp/test2.log)" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test2.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 3: SUSPENDED status = DENY | |
| # ============================================================================ | |
| echo "[Test 3] authorization_status=SUSPENDED = DENY" | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"authorization_status": "ACTIVE"/"authorization_status": "SUSPENDED"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test3.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "SUSPENDED" /tmp/test3.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected SUSPENDED" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test3.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 4: REVOKED status = DENY | |
| # ============================================================================ | |
| echo "[Test 4] revocation_status=REVOKED = DENY" | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"revocation_status": "ACTIVE"/"revocation_status": "REVOKED"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test4.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "REVOKED\|revocation" /tmp/test4.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly detected revocation" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test4.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 5: EXPIRED status = DENY | |
| # ============================================================================ | |
| echo "[Test 5] authorization_status=EXPIRED = DENY" | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"authorization_status": "ACTIVE"/"authorization_status": "EXPIRED"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test5.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "EXPIRED" /tmp/test5.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected EXPIRED" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test5.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 6: Node ID mismatch = DENY | |
| # ============================================================================ | |
| echo "[Test 6] Node ID mismatch (local node vs authorization) = DENY" | |
| # Modify authorization node_id to mismatch local node | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"node_id": "[^"]*"/"node_id": "mismatched-node-id"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test6.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "mismatch\|Node ID" /tmp/test6.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly detected node mismatch" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error: $(cat /tmp/test6.log)" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test6.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 7: Expiration check (past expiration) = DENY | |
| # ============================================================================ | |
| echo "[Test 7] Expired authorization (expires_at in past) = DENY" | |
| MODIFIED=$(echo "$ORIGINAL_AUTH" | sed 's/"expires_at_utc": "[^"]*"/"expires_at_utc": "2020-01-01T00:00:00Z"/g') | |
| echo "$MODIFIED" > "$SOVEREIGN_DIR/authorization.json" | |
| if "$SCRIPT_DIR/verify-node-authorization" > /tmp/test7.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "expired\|Expired" /tmp/test7.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly detected expiration" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error: $(cat /tmp/test7.log)" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| restore_auth | |
| rm -f /tmp/test7.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 8: pax-coder-gate signature format validation (missing signature) | |
| # ============================================================================ | |
| echo "[Test 8] pax-coder-gate: missing signature format = DENY" | |
| FUTURE=$(date -u -d "+1 hour" +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -u -v +1H +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || echo "2026-08-18T16:00:00Z") | |
| CAPABILITY_JSON="{\"node_id\":\"pax-coder-1787047913\",\"release_id\":\"1.0.0\",\"commit\":\"$(git rev-parse HEAD 2>/dev/null || echo 'abc123')\",\"nonce\":\"test\",\"expires_at\":\"$FUTURE\"}" | |
| export PAX_CAPABILITY_TOKEN="$CAPABILITY_JSON|" | |
| if "$SCRIPT_DIR/pax-coder-gate" > /tmp/test8.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "signature\|DENIED" /tmp/test8.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected missing signature" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| unset PAX_CAPABILITY_TOKEN | |
| rm -f /tmp/test8.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 9: pax-coder-gate malformed signature = DENY | |
| # ============================================================================ | |
| echo "[Test 9] pax-coder-gate: malformed signature (too short) = DENY" | |
| CAPABILITY_JSON="{\"node_id\":\"pax-coder-1787047913\",\"release_id\":\"1.0.0\",\"commit\":\"$(git rev-parse HEAD 2>/dev/null || echo 'abc123')\",\"nonce\":\"test\",\"expires_at\":\"$FUTURE\"}" | |
| export PAX_CAPABILITY_TOKEN="$CAPABILITY_JSON|badbeef" | |
| if "$SCRIPT_DIR/pax-coder-gate" > /tmp/test9.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "signature\|format\|DENIED" /tmp/test9.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected malformed signature" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| unset PAX_CAPABILITY_TOKEN | |
| rm -f /tmp/test9.log | |
| echo "" | |
| # ============================================================================ | |
| # Test 10: pax-coder-gate missing capability = DENY | |
| # ============================================================================ | |
| echo "[Test 10] pax-coder-gate: no capability token = DENY" | |
| unset PAX_CAPABILITY_TOKEN | |
| rm -f "$SOVEREIGN_DIR/.capability" | |
| if "$SCRIPT_DIR/pax-coder-gate" > /tmp/test10.log 2>&1; then | |
| echo -e "${RED}β FAIL${NC} - Should have been denied" | |
| FAIL=$((FAIL+1)) | |
| else | |
| if grep -q "capability\|DENIED" /tmp/test10.log; then | |
| echo -e "${GREEN}β PASS${NC} - Correctly rejected missing capability" | |
| PASS=$((PASS+1)) | |
| else | |
| echo -e "${RED}β FAIL${NC} - Wrong error" | |
| FAIL=$((FAIL+1)) | |
| fi | |
| fi | |
| rm -f /tmp/test10.log | |
| echo "" | |
| # ============================================================================ | |
| # Summary | |
| # ============================================================================ | |
| TOTAL=$((PASS+FAIL)) | |
| echo "==========================================" | |
| echo "TEST RESULTS" | |
| echo "==========================================" | |
| echo "" | |
| echo -e " Passed: ${GREEN}$PASS/$TOTAL${NC}" | |
| echo -e " Failed: ${RED}$FAIL/$TOTAL${NC}" | |
| echo "" | |
| if [ $FAIL -eq 0 ]; then | |
| echo -e "${GREEN}β All tampering detection tests passed!${NC}" | |
| echo "" | |
| echo "SECURITY VERIFICATION:" | |
| echo " β Status fields (ACTIVE/REQUESTED/SUSPENDED/REVOKED/EXPIRED) enforced" | |
| echo " β Revocation status checked" | |
| echo " β Expiration validated" | |
| echo " β Node binding verified" | |
| echo " β Signature format validation (pax-coder-gate)" | |
| echo " β Capability token required" | |
| exit 0 | |
| else | |
| echo -e "${RED}β Some tests failed${NC}" | |
| exit 1 | |
| fi | |