April 2, 2020

How to use Zoom with a Sandbox

With Corona, video conferences are on the rise, and organizations tend to use Zoom. The problem is that Zoom shows more and more security holes, bad practices, and privacy-related problems.

Zoom has a version that runs in the browser, but in my experience, it runs much worse than the native application. As running the native application is a security and privacy risk, let's see how we can use Linux sandbox techniques to restrict what the Zoom client can access.

1) Use flatpak.
Flatpak uses a sandbox called bubblewrap that isolates it from most of your personal data. You can find Zoom on Flathub.

If you do not have flatpak, you could try to use the bubblewrap sandbox without flatpak or try using firejail, but for most people it is much easier to just use flatpak.

2) Use Flatseal to revoke access to data that Zoom does not need to be able to access before running Zoom the first time. You can remove access to all host files (filesystems=host and filesystems=home disabled) without any problems.

This already solves many security and privacy issues of Zoom.

The problem that still remains is that Zoom generates personalized identifiers by using your network card's unique hardware address.

3) Restricting Access to your network devices: Now Zoom is isolated from your private files, but when you already used Zoom and have a look at $HOME/.var/.var/app/us.zoom.Zoom/config/zoomus.conf you will notice that Zoom uses your MAC-Address as identifier in the line deviceID=XX:XX:XX:XX:XX:XX.

There is a way to protect against this when you really want Zoom not to know such unique identifiers by using network namespaces.

Our setup is based on this introduction to Linux network namespaces. We will need some additional routing for network access and a tool to allow normal users to run applications in a network namespace for running Zoom inside a private network namespace.

Setting up a network namespace for Zoom:

sudo ip netns add zoom # Create the namespace "zoom"
sudo ip link add veth0 type veth peer name veth1 # Create connected virtual interfaces
sudo ip link set veth1 netns zoom # Assign the second interface to the network namespace "zoom"

You can now verify that you only see the virtual interface by running ip netns zoom exec ip link show. This runs the command ip link show inside the namespace "zoom" and you should see a loopback interface "lo" and the virtual interface "veth1" inside the new namespace.

When running ip link show alone, you should see your usual host network interfaces and "veth0", but no device "veth1".

Next, we need to assign IPs and set up a default route inside the network namespace so that Zoom can reach its servers. We will use the net for the interfaces. When you already use this net, you need to choose another IP range.

# Activate the interface in the default namespace
sudo ip link set up veth0
sudo ip addr add dev veth0
# Activate the interface inside the zoom namespace
sudo ip netns exec zoom ip link set up veth1
sudo ip netns exec zoom ip addr add dev veth1
# Add a default route inside the namespace
sudo ip netns exec zoom ip route add default via
# Enable IP forwarding
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Now we can communicate with the host outside of the zoom namespace and need to add routing into the internet. We use iptables with a NAT setup for this:

sudo iptables -P FORWARD -j DROP # Drop all packets that are not matched by another rule.
sudo iptables -I FORWARD -s -j ACCEPT # Forward packets for IPs from inside the namespace
sudo iptables -t nat -A POSTROUTING -s -j MASQUERADE # Use NAT for packets from the zoom network

To be able to use the namespace without root privileges you need to install netns-exec. This tool allows every user on the computer to run programs in another network namespace, so do not install it if this is a problem for you.

Now run netns-exec zoom IP link as a normal user to verify that you can execute programs in the network namespace and that you can only see the virtual network device.

When everything works, you can start using Zoom by running

netns-exec zoom flatpak run us.zoom.Zoom

Afterward, you can verify that zoomus.conf contains the virtual MAC address from the veth network interface instead of the unique MAC address of your network card.

Feedback If anything does not work for you, please leave a comment so that I can improve this article.

Kategorien: english Software Linux Sicherheit
Tagged: Zoom Flatpak network namespace netns Security Privacy

4 Kommentare

Sept. 2, 2020 18:42 - Jennings

flatpak doesn't actually sandbox Zoom, since it is given full access to every file in your home folder.

Okt. 29, 2020 09:02 - allo

Use flatseal to remove the access and it's fine.

Jan. 20, 2021 02:49 - Bill

Really appreciate the post but even though I've figured out how to get networking to work in the namespace Zoom still times out during login. Any thoughts on why would be appreciated.

1. A good reference https://iximiuz.com/en/posts/container-networking-is-simple/ 2. Until I enabled ip_forwarding in the host namespace this failed. $ sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' 3. After ip forwarding was enabled I could ping from the guest namespace to the internet. $ ping -c 2

Feb. 5, 2021 22:29 - allo

@Bill: I often got login timeouts in the last time, with or without namespace (always using flatpak). I am not sure if this is caused by using a network namespace or just a problem with Zoom being over capacity. I added the forwarding explicitely to the article.

Kommentar schreiben