Security Sweep — Public Repository & alai.no Hardening (MC #107285)
Security Sweep — Public Repository & alai.no Hardening (MC #107285)
Date: 2026-08-16
Scope: johnatbasicas/alai-web, https://alai.no, and https://ucenje.alai.no
Production commit: 620dd3af082952b7dbded28a4c5b4685b5445366
Pull request: johnatbasicas/alai-web#2
Trigger
The source repository was public and exposed tracked CLAUDE.md and .claude/** files. A full sweep was ordered to identify and remove repository, deployment, secret-handling, browser, and production exposure risks.
Confirmed findings
- Public GitHub access exposed agent metadata and internal operational instructions.
- A stale
index.html.bakfile was publicly readable onalai.no. - A hidden internal
.credits.mdfile was publicly readable onucenje.alai.no. - Deprecated Vercel state contained expired OIDC tokens and duplicate local backups.
- A legacy unused mail dependency had high-severity advisories.
- GitHub Actions used mutable action tags; repository secret scanning and branch protection were unavailable or disabled.
- Pages lacked a true 404 response and a complete Content Security Policy.
- The contact proxy lacked bounded streaming input, complete validation, honeypot handling, safe upstream errors, and dynamic-response security headers.
- The GitHub Cloudflare deploy token was stale, causing repeated authentication failures.
- Wrangler debug logs contained local proxy shared-secret material and were too broadly readable.
Remediation completed
Repository and source
- Changed the GitHub repository to private; anonymous raw access now returns 404.
- Removed tracked
CLAUDE.md,.claude/**, obsolete credential-setup instructions, and legacy Vercel/mail runtime files. - Removed expired Vercel token files, deprecated Vercel state/backups, vulnerable local dependencies, and ignored HTML backups.
- Moved legitimate non-runtime documentation and verification sources outside deployable asset roots.
- Removed an unrelated Azure DevOps remote from the local web repository.
Cloudflare Pages
- Added
.assetsignoreprotection to both Pages roots. - Added deterministic public-asset preflight validation and bypass regression tests.
- Added real
404.htmlresponses to both sites. - Added CSP, HSTS,
nosniff, clickjacking, permissions, referrer, and cross-origin headers. - Removed Google-hosted font and analytics runtime dependencies instead of weakening CSP.
- Kept
ucenjestatic-only by isolating its Wrangler working directory. - Added edge tombstone redirects for the two stale cached sensitive paths; requests now resolve to 404.
Contact endpoint
- Enforced JSON content type and an 8 KiB streaming body limit.
- Added strict name/email/message validation and conservative email grammar.
- Activated the existing honeypot.
- Restricted browser origins and unsupported methods.
- Added a 10-second upstream timeout and generic upstream failure responses.
- Added
no-storeand complete security headers to dynamic responses.
CI and credentials
- Pinned GitHub Actions to immutable commit SHAs.
- Added Gitleaks, asset checks, Python regression tests, contact-function tests, and Dependabot.
- Restricted Actions to selected actions with mandatory SHA pinning and read-only defaults.
- Restored the valid scoped Cloudflare Pages token from the approved vault and updated GitHub Secrets without exposing the token.
- Verified canonical CI deployment of both Pages projects.
- Restricted Wrangler configuration/evidence permissions and removed debug logs containing proxy secrets.
Verification
- Production Playwright gate: 21/21 PASS.
- Browser console errors: 0.
- Gitleaks current tree/history: 0 findings.
- Semgrep OWASP/JavaScript: 0 findings.
- Open Dependabot alerts: 0.
- Canonical GitHub Actions deployment: SUCCESS.
- Sensitive live paths: 404 after edge routing.
- Repository visibility: PRIVATE.
Evidence
/Users/makinja/system/evidence/107285/final-security-sweep-report.json/Users/makinja/system/evidence/107285/browser-verification.json/Users/makinja/system/evidence/alai-web-security-sweep-20260816/FINAL-REPORT.md
Evidence directories are restricted to user-only access. No credential values are recorded in this page or its evidence summaries.
Residual low risks
- GitHub branch protection for a private repository requires a paid plan. Compensating controls are enabled: private visibility, selected SHA-pinned Actions, read-only workflow permissions, Gitleaks CI, web commit signoff, and merged-branch deletion.
- DNSSEC and CAA remain separate registrar/certificate-issuer changes and require a dedicated controlled rollout.
- The edge tombstone rules should remain until the old one-week cache lifetime has fully elapsed; then revalidate direct paths before considering rule removal.
Closure
Technical remediation and production verification are complete. This page is the task-specific BookStack record for MC #107285.
No comments to display
No comments to display