Files
CASAN/AINative_OKR_CASAN5/.specify/tests/phase-sec27-tests.sh
T
thanhnvandClaude Opus 4.8 2c765c9a45 feat(plan-01): Phase 0.5 — path indirection via casan-paths.sh (no file moves)
Task 1.2: introduce a single path resolver so no harness script hardcodes
`.specify/...` scattered across the tree. casan-paths.sh resolves four roots
(HARNESS/STATE/GOVERNANCE/APP) by marker-based walk-up from its own location —
never `git rev-parse` (git root is the repo PARENT here, not the app dir).

- 101 bash scripts/tests: 238 hardcoded `$PROJECT_ROOT/.specify/...` refs rewritten
  to CASAN_HARNESS_ROOT (code) / CASAN_STATE_ROOT (logs,state) / CASAN_GOVERNANCE_ROOT.
  Sandbox test vars ($WORK/$TP/$FP/$T1_WORK) left untouched.
- Roots are NOT exported: each script/subprocess self-resolves from its own tree,
  matching the original per-script semantics and preserving hermetic sandbox isolation
  (node casan-step.mjs, copied telemetry/rollback scripts must not inherit real roots).
- Sandbox tests that copy a harness script now also copy casan-paths.sh (its new
  sibling dependency): adversarial (verify-audit-chain/verify-tool-audit/rollback) +
  track-a (security-check/telemetry-integrity).
- control-plane-settings.json reclassified as STATE (untracked runtime store).

Roots all still resolve to `.specify` in this monolithic layout, so behavior is
unchanged. Full gate: PASS=64 FAIL=0 SKIP=3 (adversarial 44/0, track-a 25/0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 22:07:41 +09:00

47 lines
1.6 KiB
Bash

#!/usr/bin/env bash
set -uo pipefail
# CASAN Plan-16 SEC-27 (X-02) — strip control/ANSI chars from log output.
#
# Log messages carry attacker-influenced data (action names, tool-output snippets).
# A raw ESC/CSI sequence can rewrite a reviewer's terminal; a raw CR/LF can inject a
# fake log line. casan_log now strips control chars (keeping tab). Proves the ESC
# byte and embedded newlines are removed while the visible text survives.
#
# Deterministic; no model/network.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../scripts/bash/casan-paths.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
PASS=0; FAIL=0
pass() { echo "PASS: $1"; PASS=$((PASS + 1)); }
fail() { echo "FAIL: $1"; FAIL=$((FAIL + 1)); }
echo "===== Plan-16 SEC-27: log control-char stripping ====="
# shellcheck source=/dev/null
source "$CASAN_HARNESS_ROOT/scripts/bash/casan-log.sh"
PAYLOAD="$(printf 'start\033[31mRED\033[0m\nFAKE [ERROR] injected-audit-line')"
OUT="$(casan_log error test "$PAYLOAD" 2>&1)"
if printf '%s' "$OUT" | od -An -c | grep -q '033'; then
fail "ESC byte survived into the log (terminal-escape injection)"
else
pass "ESC byte stripped from log output"
fi
LINES="$(printf '%s\n' "$OUT" | grep -c .)"
[[ "$LINES" -eq 1 ]] \
&& pass "embedded newline stripped — no injected second log line" \
|| fail "log emitted $LINES lines (newline injection)"
printf '%s' "$OUT" | grep -q "start" && printf '%s' "$OUT" | grep -q "RED" \
&& pass "visible text preserved (only control bytes removed)" \
|| fail "visible text lost"
echo ""
echo "===== SEC-27 SUMMARY: PASS=$PASS FAIL=$FAIL ====="
[[ "$FAIL" -eq 0 ]] || exit 1