Files
0pt/SECURITY.md
T
adminandClaude Sonnet 5 a14911b263
CI (SIAX Cloud) / security (push) Successful in 24s
Security Scan (SIAX Cloud) / security (push) Successful in 22s
CI (SIAX Cloud) / quality (push) Successful in 39s
CI (SIAX Cloud) / security (pull_request) Successful in 20s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 20s
CI (SIAX Cloud) / quality (pull_request) Successful in 38s
docs(compliance): record dated provenance for evasion-stack keep decision
AGENTS.md and SECURITY.md previously attributed keeping the WAF-bypass/
Tor/FlareSolverr/curl_cffi/cloudscraper stack to an unattributed,
unverified "medvetet användarbeslut" (deliberate user decision) with no
stated author or date -- flagged by a prior audit as unverified provenance.

Replace with an accurate, dated statement: the account owner (Simon
Axelsson) was asked directly via an interactive decision prompt on
2026-08-11, in direct response to a compliance audit's removal proposal
(the surgically-clean removal PR #7, verified 128/128 tests, was closed
unmerged), and explicitly chose to keep the code. No business or legal
rationale beyond "keep it" was given or is invented here.

This is a narrow, scoped exception for the existing 0PT/0pt-motor sourcing
engine. CLAUDE.md §1's general anti-evasion policy text is untouched and
remains in force as written unless/until the account owner says otherwise.

No code changes -- documentation only.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:32:13 +02:00

99 lines
4.9 KiB
Markdown

# Security Policy
0pt (SIAX Core Platform: Data OS) is proprietary software operated by SIAX
Technology AB. This document explains how to report a suspected security
vulnerability.
## Reporting a vulnerability
Do not open a public GitHub issue for a suspected security problem.
Email: security@siax.io (fallback: simon@siax.io)
Include, if possible:
- A description of the issue and the impact you believe it has.
- Steps to reproduce, or a proof-of-concept request/response.
- The route, endpoint, or component affected.
- Whether the issue is already publicly known or exploited.
## Response expectations
- Acknowledgement: within 2 business days.
- Initial triage and severity assessment: within 5 business days.
- Remediation timeline: communicated after triage, based on severity.
Confirmed high/critical issues are prioritized ahead of other work.
We will keep you informed of progress until the report is resolved and, where
appropriate, credit you in internal release notes (no public bug bounty
program exists at this time).
## Scope
In scope:
- The 0pt application and its API routes at 0pt.app.
- The 0pt engine/orchestrator services in this repository.
- Infrastructure-as-code and CI/CD configuration in this repository.
Out of scope:
- Third-party services and dependencies not maintained in this repository
(report those to the respective vendor).
- Denial-of-service testing, spam, or social engineering against SIAX staff
or customers.
- Automated scanning that generates excessive load against production
systems without prior coordination.
Note: `github.com/sax3l/0pt` (this checkout's `origin`) and
`git.siax.io/sax3l/0pt` (Gitea) are two diverged remotes that share part of
this codebase's history — see README "Known issues" for what's known and
what isn't about the relationship between them. Which one is deployed to
0pt.app is currently unconfirmed; if your finding is remote-specific, say
which remote/branch you tested against.
## Known, already-tracked gaps
The following are **not** news to us — they are open, named gaps as of this
pass, not secrets, and reporting them again mainly helps confirm priority
rather than surfacing something new:
- **Zitadel bearer verification exists in code (fail-closed), but the deployed
instance still answers `/api/0pt/*` anonymously (gap S1).** `src/auth/zitadel.ts`
+ `middleware.ts` implement real JWKS-based verification with a fail-closed
default (`assertAuthConfigSafe()` refuses `AUTH_ENFORCE=false` in production),
yet a live probe (2026-08-10) got HTTP 200 without any token. Root cause is
unconfirmed — do not treat the public instance as authenticated until an
anonymous request receives 401. Additionally, no handler reads the verified
tenant headers (`x-0pt-verified-tenant`): the P0 routes under `/api/0pt/*`
(`lakehouse/mappings`, `sources/rate-policies`, `sources/[sourceId]/query`,
`documents/capture`) accept `tenant_id`/`project_id` **from the client-supplied
request body or query string** rather than from a server-bound session — a
violation of this platform's own tenant-isolation rule (tenant_id must never be
trusted from client input). This is an open, prioritized gap (BACKLOG P0-1/P0-2),
not an intentional design.
- **The non-`/api/0pt` API surface has no authentication at all.** Orders,
admin metrics, payments (including the escrow `release` that flips an order to
`delivered`), subscriptions, uploads and DB-grant endpoints are unprotected in
code (live-verified 200 anonymously on `/api/orders` and `/api/admin/metrics`).
- **The WAF-bypass scraper stack is kept deliberately.** `services/scrapers/*`
(`waf_bypass.py`: FlareSolverr, Tor, cloudscraper, curl_cffi, proxy rotation,
fake identities) and `services/infra/docker-compose.data-stack.yml`
(flaresolverr/tor containers) contradict this repo's own compliance docs.
A cleanup PR that surgically removed this stack (PR #7, verified clean, 128/128
tests) was closed unmerged by the account owner. **The account owner, Simon
Axelsson, was asked directly via an interactive decision prompt on 2026-08-11
whether to keep or remove this code, and explicitly chose to keep it.** No
business or legal justification beyond "keep it" was recorded — none is
invented here. This is a narrow, scoped exception for the existing 0PT/0pt-motor
sourcing engine; it does not change `CLAUDE.md` §1's general anti-evasion policy,
which remains in force as written unless/until the account owner says otherwise.
Out of scope for deletion — see `docs/compliance/GOLDEN-STANDARD-REPORT.md`
control C6.
- Beyond those items, other authentication gaps on internal API routes may still
exist and are tracked internally pending an intentional, reviewed fix; reporting
any you find is still welcome and helps confirm priority.
## Disclosure
Please give us a reasonable opportunity to investigate and remediate an
issue before any public disclosure. We aim to coordinate disclosure timing
with reporters wherever possible.