openvibers/openvibe.vision SECURITY.md

SECURITY.md

main 3.8 KB · 52 lines · markdown

1# Security policy
2
3OpenVibe is run in the open, and we want to hear about security problems before anyone else does.
4
5## Reporting a vulnerability
6
7Email **[email protected]** with "security" in the subject. Please include what you found, where (URL,
8repository, file), how to reproduce it, and what an attacker could do with it. Do not open a public GitHub issue for
9a vulnerability, and do not test against other people's accounts, data or streams.
10
11We reply within 7 days, keep you updated while we fix it, and credit you when the fix ships if you would like.
12
13## Scope
14
15Every OpenVibe service and site (openvibe.live, openvibe.network, openvibe.vision, openvibe.design, openvibe.meme,
16openvibe.today, openvibe.tools, openvibe.media, openvibe.community, openvibe.games and the other openvibe.*
17domains) and every repository under github.com/OpenVibers. Machine-readable contact details are at
18`/.well-known/security.txt` on each site.
19
20## What OpenVibe.Vision holds
21
22- Saved answers: the question, the cleaned answer text, the engine/model/provider/route that answered, the reason,
23 the cost, the latency, the image sha256, the media type and the byte count. Never the image bytes.
24- Compare samples: the same model/provenance/cost/latency per engine. Aggregate benchmark rows have no subject.
25- UI checks: source (html, url or screenshot), the viewport, the findings and the summary. Never the screenshot.
26- A person's Network session tokens only in httpOnly cookies (`vision_at`, `vision_rt`); no token is stored in the
27 database, rendered into a page or logged.
28- Face data, only after a separate consent: AES-256-GCM ciphertext of face templates, opt-in Vision uploads and
29 vectors; the signed consent record (typed name, text version and time), cast tags and private library groups.
30 Never sent to OpenVibe.AI, Search, model prompts or Bench.
31- No provider key. AI calls use the service's own Network client-credentials token and OpenVibe.AI's routing.
32
33## Image inputs and the UI check
34
35An image URL is fetched only after every resolved address is checked: loopback, link-local, private and
36unique-local addresses are refused, redirects are re-checked, the content type must be an image and the size is
37bounded. `VISION_ALLOW_PRIVATE_URLS=1` exists for tests and a deliberately isolated deployment; it is off in
38production. A UI check URL goes through the same public-address guard, executes no JavaScript and fetches no remote
39stylesheet. The screenshot path writes a temporary file for Tesseract and removes it in a finally block.
40
41The `/internal/events` account route is loopback only and refuses a proxied request; nginx answers 404 for
42`/internal` and `/metrics`. A service token is judged on its own signature, audience and capability grant; an
43unknown or forged token is refused, never downgraded to the session.
44
45## Faces with scoped consent
46
47Detect and blur do not identify anyone. Face matching uses local YuNet/SFace ONNX models and separately signed, purpose-specific consent. Templates and opt-in uploads are encrypted with `VISION_FACE_KEY` (AES-256-GCM) and private; a person can withdraw a purpose and erase its template immediately. A cast matcher reads only the named channel's consenting roster, and revoking a grant stops matches and deletes past tags. Library grouping is off unless `VISION_FACE_LIBRARY_REGIONS` allows the region. Vision never identifies strangers on the open web, builds no public face index, and a match alone never unlocks anything (liveness is `not_checked` until a tested component exists). AI may describe people, including how they look; the model prompt forbids naming or recognising a stranger, and no looks filter runs. A report that any rule was broken is a security report for this repository.
48
49## Supported versions
50
51Only the current `main` branch, which is what runs in production, receives fixes.
52