openvibers/openvibe.vision SECURITY.md
SECURITY.md
| 1 | # Security policy |
| 2 | |
| 3 | OpenVibe is run in the open, and we want to hear about security problems before anyone else does. |
| 4 | |
| 5 | ## Reporting a vulnerability |
| 6 | |
| 7 | Email **[email protected]** with "security" in the subject. Please include what you found, where (URL, |
| 8 | repository, file), how to reproduce it, and what an attacker could do with it. Do not open a public GitHub issue for |
| 9 | a vulnerability, and do not test against other people's accounts, data or streams. |
| 10 | |
| 11 | We 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 | |
| 15 | Every OpenVibe service and site (openvibe.live, openvibe.network, openvibe.vision, openvibe.design, openvibe.meme, |
| 16 | openvibe.today, openvibe.tools, openvibe.media, openvibe.community, openvibe.games and the other openvibe.* |
| 17 | domains) 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 | |
| 35 | An image URL is fetched only after every resolved address is checked: loopback, link-local, private and |
| 36 | unique-local addresses are refused, redirects are re-checked, the content type must be an image and the size is |
| 37 | bounded. `VISION_ALLOW_PRIVATE_URLS=1` exists for tests and a deliberately isolated deployment; it is off in |
| 38 | production. A UI check URL goes through the same public-address guard, executes no JavaScript and fetches no remote |
| 39 | stylesheet. The screenshot path writes a temporary file for Tesseract and removes it in a finally block. |
| 40 | |
| 41 | The `/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 |
| 43 | unknown or forged token is refused, never downgraded to the session. |
| 44 | |
| 45 | ## Faces with scoped consent |
| 46 | |
| 47 | Detect 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 | |
| 51 | Only the current `main` branch, which is what runs in production, receives fixes. |
| 52 |