Applies to v0.10.2 and later.
- Supported Versions
- Reporting a Vulnerability
- Disclosure Policy
- Security Considerations
- Security Audit
- Hall of Fame
| Version | Supported |
|---|---|
| 0.10.x | β Active development |
| 0.9.x | |
| 0.8.x | |
| < 0.8 | β Not released |
Only the latest minor release receives security updates. Ensure you build from main before reporting.
If you discover a security vulnerability in Orbiscreen, please report it responsibly and privately.
Preferred method:
- Open a private security advisory on GitHub: Security Advisories β
Alternative method:
- Email the maintainers via the GitHub security contact above.
What to include:
| Field | Details |
|---|---|
| Description | Clear explanation of the vulnerability |
| Reproduction | Steps to reproduce - minimal PoC if possible |
| Component | Affected crate / module and version |
| Impact | Privilege escalation, input injection, data exposure, etc. |
| Fix | Suggested mitigation (optional) |
Response timeline:
| Phase | Timeframe |
|---|---|
| Initial acknowledgment | Within 72 hours |
| Impact assessment | Within 7 days |
| Patch development | Within 30 days (critical) |
| Public disclosure | Coordinated after fix is released |
We follow a coordinated disclosure model:
- Report received and acknowledged
- Vulnerability validated and severity assessed
- Fix developed and tested
- Patch released to all supported versions
- Public disclosure with credit to reporter (if desired)
No premature disclosure. Do not open public issues or pull requests for security bugs until the fix is released.
Orbiscreen is a Linux host daemon plus a Material 3 Android client that:
- Creates kernel-level virtual displays via the
evdiDRM module - Captures screen contents via X11 (
x11rb) or Wayland (ashpd+ PipeWire) - Injects input events via
evdevil(uinput) orashpdRemoteDesktop - Streams MPEG-TS/H.264 over a plain HTTP endpoint (
/stream) β WebRTC is no longer used for the Android client - Exposes a control-plane HTTP API at
/api/control(lock, blank, ctrl-alt-del, open) - Exposes
/api/infowith the host's display resolution, encoder, and version
| Area | Risk | Mitigation |
|---|---|---|
uinput injection |
Any process holding the virtual touchscreen can inject arbitrary input | The daemon opens the uinput device exclusively; restrict /dev/uinput permissions on the host |
| Screen capture | Frames contain everything rendered to the virtual display | v0.10 binds to the evdi-backed virtual display only, not the primary desktop |
Cleartext HTTP /stream |
A LAN attacker can passively view the desktop | orbiscreen only binds on 127.0.0.1 by default; the LAN case is opt-in via adb reverse or LAN bind in the config |
/api/control |
A LAN attacker can call lock/blank/open | The endpoint is unauthenticated by design; treat 0.0.0.0 bind as LAN-only |
| evdi kernel module | DKMS + Secure Boot signing is distro-specific | Module loading is the host administrator's responsibility |
mDNS advertising (_orbiscreen._tcp.) |
Hostname + port broadcast on the local network | No credentials are advertised; the discovery record only contains host, port, and the instance name |
| Android input model (v0.10.2) | InputDispatcher posts absolute pointer / wheel / stylus / keyboard events to /input |
The endpoint is the same one used historically; restrict access at the network layer |
-
Run the daemon as a non-root user with explicit
/dev/uinput+/dev/dri/card*permissions viaudevrules. -
Do not expose the signaling port (
8788by default) to untrusted networks. Bind to127.0.0.1and useadb reversefor USB transport on untrusted networks. -
Build from source from the official repository:
git clone https://github.com/shadow-x78/orbiscreen.git
-
Review the
evdikernel module provenance before loading it; Secure Boot hosts must sign it. -
Never log raw input events in production -
tracingis set toINFOby default and does not dump pointer coordinates. The AndroidInputDispatchersimilarly does not log coordinates in release builds. -
Verify package signatures before installing. See
docs/PACKAGING.mdfor the GPG / keystore fingerprints.
Orbiscreen (v0.10.2) is written in Rust (edition 2021) plus a Kotlin Android client (Material 3 + Jetpack Compose). A running daemon performs:
open()on/dev/dri/card*evdi nodesUinputDeviceconstruction viaevdevilGetImage(X11) orScreencastportal (Wayland) capture- GStreamer pipeline construction for H.264 encoding
axumHTTP listener on the configured signaling port, serving/stream,/health,/api/info,/input,/api/controladb reversesubprocess invocation when a USB device is attachedNsdManager.discoverServiceson the Android client (no outbound traffic outside the LAN)
All logic is readable in plain Rust and Kotlin. If you perform an audit, please share findings via the private reporting channels above.
We thank the following security researchers for responsible disclosure:
(None yet - be the first!)
Built by shadow-x78 Β· orbiscreen Β· Back to README
Β© 2026 Orbiscreen (shadow-x78)