WebRTC wurde von Google und Mozilla initiiert und später vom W3C standardisiert, um der Konkurrenz von Microsoft Skype etwas entgegen zu setzen. Google und Mozilla entschieden sich dafür, die Funktionalität für die Kommunikation in die Browser zu integrieren, um den Browser als univerelle Anwendung für jegliche Internetkommunikation auszubauen.
Neben der Internettelefonie wird WebRTC auch auch bei browserbasierten Videokonferenzsystemen wie Jitsi Meet eingesetzt. Bei der direkten 1:1 Kommunikation ist für den Datenstrom eine Ende-zu-Ende Verschlüsselung vorgesehen. Bei Konferenzsystemen ist es häufig so, dass der Konferenzserver als Endpunkt agiert, die Daten entschlüsselt und für jeden Teilnehmer neu verschlüsselt. (Verbesserte Lösung mit durchgehende Ende-zu-Ende Verschlüsselung für Konferenzsysteme sind in der Entwicklung.)
OpenH264 Videocodecs
Um WebRTC mit Firefox zu verwenden, wird das OpenH264 Plugin von Cisco benötigt, das die Videocodecs bereitstellt. Das Plugin ist Closed Source und wird beim ersten Start von Firefox automatisch herunter geladen und im Profilverzeichnis gespeichert.
Mit folgende Einstellungen unter
"about:config" wird das OpenH264 Plugin aktiviert:
media.gmp-gmpopenh264.enabled | = true |
media.gmp-gmpopenh264.autoupdate | = true |
media.gmp-gmpopenh264.provider.enabled | = true |
Bei einigen sicherheitsoptimierten Linux Distributionen wie RHEL oder Fedora ist das Plugin standardmäßig deaktiviert. Oft sind Probleme mit browserbasierten Videokonferenzen darauf zurück zu führen, dass das Plugin nicht aktiviert wurde.
Internet Connectivity Establishment (ICE)
Der Datenstrom soll bei WebRTC möglichst direkt zwischen den Teilnehmern ausgetauscht werden. Es wird der ICE Standard (Internet Connectivity Establishment) verwendet, um eine direkte Verbindung zwischen den Clients aufzubauen.
ICE versucht im Hintergrund sehr aggressiv, die direkte Verbindung irgendwie herzustellen. Es werden Proxy Einstellungen umgangen, via UPnP wird versucht, ein Loch in Router und Firewalls zu bohren, VPNs werden teilweise ausgetrickst... Dabei kommt ein STUN Server zum Einsatz, der die verschiedene Möglichkeiten ausprobiert. Wenn wirklich keine direkte Verbindung möglich ist, wird ein TURN Server als Proxy für den Datenstrom verwendet.
Aufgrund dieser aggressiven Strategie zum Verbindungsaufbau können der Gegenseite folgende Informationen bekannt werden, wie der
WebRTC Test von Browserleaks zeigt:
- Alle IP-Adressen und Interfaces des Rechners oder der VM im internen LAN/WLAN. (Ein Angreifer oder Trackingservice könnte das verwenden, um mehrere Rechner innerhalb eines Firmennetzwerkes oder in einem Haushalt zu unterscheiden.)
- Externe Adresse des Routers/Gateways zum Internet. (Diese Adresse sollte geheim bleiben, wenn man einen Proxy wie Tor Onion Router oder ein VPN verwendet. Aber alle Proxys und einige VPN Techniken können von ICE ausgetrickst werden und damit den Nutzer deanonymisieren.)
- Externe Adresse des Proxy oder VPN Endpunktes. (Diese Information lässt sich natürlich nicht geheim halten.)
Firefox bietet einige Möglichkeiten, diese Privacy Probleme von ICE zu reduzieren:
- Bei privater Nutzung kann man davon ausgehen, dass man innerhalb der Wohnung mündlich kommuniziert und nicht via WebRTC. Die internen Adressen aus dem LAN müssen somit nicht publiziert werden. Mit folgenden Optionen man es abschalten:
media.peerconnection.ice.default_address_only | = true |
media.peerconnection.ice.no_host | = true |
- Wenn man verhindern möchte, dass die Gegenseite die externe IP-Adresse des Routers erfährt und damit Schlussfolgerungen über den Standort via Geolocation ziehen könnte, kann man direkte Verbindungen generell ausschließen und immer eine Verbindung über einen TURN Proxy Server erzwingen:
media.peerconnection.ice.relay_only = true
- Wenn man den STUN/TURN Servern des Videokonferenzanbieters nicht vertraut, kann man eigene Server verwenden (die Standardserver der Firma oder des Providers):
media.peerconnection.use_document_iceservers = false
Die eigenen Server muss man in der folgenden Variable definieren:
media.peerconnection.default_iceservers = <Serverliste>
- Wenn man WebRTC nur via VPN verwenden möchte aber nicht, wenn man ohne VPN surft, dann kann man die zulässigen Netzwerkinterfaces definieren. Ein Beispiel:
media.peerconnection.ice.force_interface | = tun1 |
media.peerconnection.ice.no_host | = true |
Wenn das VPN nicht aktiviert wurde und damit das virtuelle VPN Interface "tun1" nicht vorhanden ist, kann man ganz normal surfen aber eine WebRTC Verbindung wird nicht akzeptiert. Nur wenn das VPN aktiv ist, ist eine WebRTC Verbindung möglich, deren Daten immer durch das VPN geschickt werden.
- Änlich wie bei der VPNs kann man auch die Verwendung eines Proxy erzwingen und WebRTC nur via Proxy zulassen:
media.peerconnection.ice.proxy_only = true
In den meisten Fällen wird WebRTC mit dieser Einstellung nicht funktionieren, da HTTP- oder SOCKS-Proxy wie Tor Onion Router nicht UDP-fähig sind.
Mit dem
WebRTC Test kann man prüfen, ob die Einstellungen korrekt funktionieren.
Media Device Enumeration
Um WebRTC nutzen zu können, muss Firefox wissen, welche Media Input Devices vorhanden sind und nach Zustimmung durch den Nutzer Zugriff darauf haben:
media.navigator.enabled | = true |
media.navigator.video.enabled | = true |
Trackingdienste können die Media Device Enumeration ausnutzen, um Daten über Kamera und Mikrofon zu sammeln und für das Hardware Fingerprinting zu verwenden. Der Surfer muss dabei nicht um Zustimmung für den Zugriff auf Kamera oder Mikrofon gebeten werden. Der
WebRTC Test demonstriert es (Beispiel: 2x Audio Input, 0x Kamera):
Firefox verwendet als Device-IDs einen gesalzenen Hash. Der Salt für die Berechnung des Hashes wird beim ersten Start festgelegt und immer erneuert, wenn Cookies und Cache Daten gelöscht werden. Außerdem ist der Salt in Surfcontainern unterschiedlich. Damit ist die Device-ID in gleicher Weise wie langlebige Cookies für das Tracking geeigent oder nicht geeignet wie Cookies und als Schutz gegen Tracking anhand der Device-IDs kann man die
Empfehlungen für Cookies umsetzen.
WebRTC, Media Device Enumeration und OpenH264 Plugin deaktivieren
Wenn man den Browser nur zum Surfen verwendet und nicht für Videokonferenzen mit Jitsi Meet oder ähnlichen Systemen, kann man WebRTC, Media Device Enumeration und das OpenH264 Plugin deaktivieren, um Trackingfeatures und Angriffsfläche zu minimieren:
media.peerconnection.enabled | = false |
| |
media.navigator.enabled | = false |
media.navigator.video.enabled | = false |
| |
media.gmp-gmpopenh264.enabled | = false |
media.gmp-gmpopenh264.autoupdate | = false |
media.gmp-gmpopenh264.provider.enabled | = false |
media.gmp-gmpopenh264.visible | = false |
(Diese Einstellungen sind in der moderaten und strengen Konfiguration aktiviert.)