Reference
Network and security
Corvus is a web interface served by a local HTTP server, and the API behind that interface is the whole application: arming, a takeoff, a parameter write and a firmware upload are each one request. There is no login, because the ground station is a program on your laptop rather than a service on a network. This page explains how that stays true.
This machine only
The server listens on 127.0.0.1, so it answers only programs on
the same computer. On a flight line hotspot the alternative would be every
laptop and phone on that WiFi being able to arm your aircraft.
Requests are also checked for the name they were addressed to. A web page
that tricks the browser into treating a hostile name as
127.0.0.1 (DNS rebinding) still sends that name, and is refused.
A second screen on the network
If you really want a second screen, for example a tablet showing the
interface off the same link, set CORVUS_BIND and the server
listens where you point it:
CORVUS_BIND=0.0.0.0 ./run.sh
Corvus says so in its log at every launch. There is still no authentication, so treat that network the way you would treat handing someone the transmitter.
What a web page can do
Reading your telemetry: no
A website you visit cannot read your telemetry. The API names only loopback
origins as allowed to read its answers, so another tool on your own machine
still works and the web at large gets nothing. Before this, any page open in
any tab could have fetched http://localhost:8000/api/state and
read back position, battery and mode, or pulled the SSH host, user name and
key path out of the configuration. If a tool on another origin genuinely
needs access, name exactly that origin in
CORVUS_ALLOWED_ORIGIN.
Sending data out: no
The interface is fenced in with a Content Security Policy. Everything the page loads comes from the Corvus server, and, the line that matters most, the page may not talk to any other host. If something ever managed to inject a script (a plugin you installed, a value that slipped through), it could not send your telemetry, SSH credentials or map keys off the machine. The page also refuses to be embedded in another page, so nobody can frame the interface and trick you into clicking ARM.
Keys and passwords
- Map keys stay in the config file, which is readable by you alone. Corvus fetches tiles itself, so a key never appears in a page, a URL or a log line. See Map service.
- Camera passwords never reach the browser and never appear on a command line. See Camera passwords.
- SSH passwords are never held by a plugin; a launcher button names a saved connection and the backend takes the credentials from there.
- Settings exports leave passwords and map keys out unless you switch them on.
SSH host keys
SSH connections to a companion computer remember host keys, in
~/.corvus/known_hosts. The first connection to a new machine is
accepted and written down: you rarely have a known hosts entry for a
companion computer, and being stopped at the field is worse than the risk.
Every later connection is checked, and a key that does not match what was
recorded is refused, which is the case that actually means something.
To refuse unknown hosts as well, set:
CORVUS_SSH_HOST_KEYS=strict
MAVLink signing
A SiK radio authenticates nothing: it relays whatever it hears on its frequency, so anyone within radio range could inject a disarm. MAVLink 2 signing closes that, and Corvus supports it as an opt-in.
- Give the autopilot a 32 byte signing key.
- Put the same key in a file on the ground station, either as 32 raw bytes or as 64 hexadecimal characters. On macOS and Linux the file must be owned by you and readable by you alone (
chmod 600). - Point
CORVUS_MAVLINK_SIGNING_KEY_FILEat it and start Corvus.
CORVUS_MAVLINK_SIGNING_KEY_FILE="$HOME/.corvus/signing.key" ./run.sh
With signing on, every frame Corvus sends is signed and unsigned frames are
rejected. Three messages stay exempt on purpose: RADIO_STATUS
comes from the SiK modem, which has no key; ADSB_VEHICLE and
COLLISION are traffic warnings from outside the vehicle. None of
them can command anything.
A key that cannot be loaded fails the connection rather than falling back to an unsigned link. Otherwise a typo in a path would silently remove the protection you asked for, and nothing on the outside would show it.
Plugins
A plugin is ordinary JavaScript running in the app's own page, and the launcher plugins run whatever command you give them. Local commands can only be started from this computer, even when Corvus is reachable from the network. Read a plugin before you install it. See Plugins.