# Passive security review — DeepHat | Autonomous security swarm
Run: f58cecad-9eef-4ffc-99b6-3aea341d6acc
Status: **completed**
Reviewed: `whitehat-swarm-mission-control.burnersforwinter.chatgpt.site`, `www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site`
Started: 2026-10-25T22:50:12.549Z
Requests: 18 of 40 budgeted, at most 1/s
Discovered pages: 5
Tier: 1
## Summary
**6** configuration issues: 1 high, 3 medium, 2 low.
### Pages fetched
- https://whitehat-swarm-mission-control.burnersforwinter.chatgpt.site/api-access/privacy → HTTP 200
- https://whitehat-swarm-mission-control.burnersforwinter.chatgpt.site/api-access/terms → HTTP 200
- https://whitehat-swarm-mission-control.burnersforwinter.chatgpt.site/ → HTTP 200
- https://whitehat-swarm-mission-control.burnersforwinter.chatgpt.site/contact → HTTP 404
- https://whitehat-swarm-mission-control.burnersforwinter.chatgpt.site/contact-us → HTTP 404
## Checks
| Check | Host | Severity | Result |
| --- | --- | --- | --- |
| The site serves HTTPS | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | High | fail |
| HTTP Strict Transport Security | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Medium | fail |
| Content Security Policy | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Medium | fail |
| MIME type sniffing is disabled | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Low | fail |
| Framing is restricted | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Medium | fail |
| Referrer policy | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Low | fail |
| Cookie attributes | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Server version disclosure | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Cross-origin resource sharing | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| HTTP redirects to HTTPS | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Git metadata is not exposed | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Environment file is not exposed | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Server status page is not exposed | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
| Exposure probe | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site, www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Low | error |
| TLS certificate | whitehat-swarm-mission-control.burnersforwinter.chatgpt.site | Info | pass |
## Findings
### 1. The site serves HTTPS (High)
An HTTPS request to www.whitehat-swarm-mission-control.burnersforwinter.chatgpt.site failed: write EPROTO 80FDC76A2D7F0000:error:0A000410:SSL routines:ssl3_read_bytes:ssl/tls alert handshake failure:../ssl/record/rec_layer_s3.c:918:SSL alert number 40
**Suggested fix.** Serve the site over HTTPS with a valid certificate and redirect HTTP traffic.
### 2. HTTP Strict Transport Security (Medium)
No Strict-Transport-Security header was returned.
**Suggested fix.** Add Strict-Transport-Security: max-age=31536000; includeSubDomains. Start with a short max-age while testing.
### 3. Content Security Policy (Medium)
No Content-Security-Policy header was returned.
**Suggested fix.** Start with Content-Security-Policy-Report-Only. Inventory external scripts and inline code, then test a site-specific policy before enforcing it.
### 4. Framing is restricted (Medium)
Neither X-Frame-Options nor a CSP frame-ancestors directive restricts framing.
**Suggested fix.** Send X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.
### 5. MIME type sniffing is disabled (Low)
No X-Content-Type-Options header was returned.
**Suggested fix.** Add X-Content-Type-Options: nosniff.
### 6. Referrer policy (Low)
No Referrer-Policy header was returned.
**Suggested fix.** Add Referrer-Policy: strict-origin-when-cross-origin.
## Patch
Configuration suggestions for staging review; see `patch/README.md` for placement and verification.
### _headers
```
# Review in staging. CSP is report-only and does not remediate the CSP finding.
/*
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; script-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
```
### nginx.conf
```
# Review in staging. CSP is report-only; tailor it before enforcement.
# Add inside the server { } block, then reload nginx.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; script-src 'self'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
```
### apache.conf
```
# Review in staging. CSP is report-only; tailor it before enforcement.
# Add inside the <VirtualHost> block or .htaccess, then reload Apache.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; script-src 'self'"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
```
## Requires site-specific review
- https-availability
- csp
## Application findings (deep pass)
### 1. Unauthenticated exposure of internal swarm execution telemetry, credentials, and full reports via /api/swarm/state (Medium)
Location: /api/swarm/state
The public "spectator" endpoint `GET /api/swarm/state` returns the complete internal recorded-run payload to any unauthenticated visitor. It includes the swarm's raw shell commands, credential values typed into the login form, internal tooling paths, agent identifiers, the full penetration-test reports and patch for the internal DeskFlow fixture, internal budget/inference accounting, and the operator policy configuration. Only the operator control endpoints (`/api/operator/*`) and `/operator` are access-controlled; the corresponding read model at `/api/swarm/state` is not.
Evidence: Anonymous request and response (headers trimmed):
```http
GET /api/swarm/state HTTP/1.1
Host: whitehat-swarm-mission-control.burnersforwinter.chatgpt.site
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Server: cloudflare
```
Body excerpts (32,568 bytes total):
```json
{"backendRevision":"spectator-proof-6","job":{"status":"passed","attempts":3,...},
"result":{"findingCount":3,"verifiedFixCount":3,
"report":"# Security Penetration Test Report ... **Key findings** ... Privilege escalation and tenant relocation (Critical) ...",
"patch":"--- a/app.py\n+++ b/app.py\n@@ -85,17 +85,21 @@ ...",
"findings":[{"id":"vuln-0002","title":"Privilege escalation and cross-tenant account relocation via mass assignment on PATCH /api/profile","severity":"critical"}],
"scope":"Owned synthetic multi-company DeskFlow portal on loopback only"},
"telemetry":{"terminal":[{"command":"... agent-browser --session swarm fill @e4 \"deskflow-demo-only\" ... open http://127.0.0.1:8765/login","output":"..."}],
"source":"native-strix-sqlite"},
"inference":{"limit":2,"remaining":1.79,"maxRequests":600,"inputTokens":10470602},
"policy":{"scope":"Built-in synthetic DeskFlow portal only","hosting":"Cloudflare Containers","model":"deepseek-ai/DeepSeek-V4.1-Flash-1017","treasury":"Not connected"}}
```
Control — the authenticated sibling routes correctly reject the same anonymous caller:
```json
GET /api/operator/state -> 403 {"error":"Operator sign-in required."}
POST /api/queue/next -> 403 {"error":"Operator sign-in required."}
GET /api/swarm/state -> 200 (full internal document)
```
## Basis and limits
The baseline is passive: GET and HEAD against public addresses only. DNS is resolved once and connections are pinned; the site stays inside its own registrable domain; redirects are reported, never followed; the rate and request budget are enforced.
Checks cover transport, response headers, cookie flags, version banners, CORS, the certificate, and a few well-known exposure paths.
## What this review did not do
No exploitation, login, form submission, credential use, file upload, or application-logic testing in the passive baseline. No finding is confirmed exploitable; exposures are recorded as directly observed. Nothing was changed on the server.
## Delivery
`owner-email.md` and `github-issue.md` are generated from these findings. Nothing is sent unless the `send` command runs.
completed · Tier 1 · 6 findings
whitehat-swarm-mission-control.burnersforwinter.chatgpt.site
Reviewed Sun, 25 Oct 2026 22:42:09 GMT. Report emailed to you@company.com.
Suggested patch
Review before applying.
# Review in staging. CSP is report-only and does not remediate the CSP finding. /* Strict-Transport-Security: max-age=31536000; includeSubDomains Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; script-src 'self' X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Referrer-Policy: strict-origin-when-cross-origin