Skip to content

Commit 7dd54c2

Browse files
authored
Merge pull request #151 from consideRatio/pr/verify-port
Ensure TigerVNC isn't accessible via the network
2 parents 5a46ef7 + 127dbb2 commit 7dd54c2

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

.github/workflows/test.yaml

+21-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ jobs:
6060
6161
- name: Test vncserver
6262
run: |
63-
container_id=$(docker run -d -it -p 5901:5901 test vncserver -xstartup /opt/install/jupyter_remote_desktop_proxy/share/xstartup -verbose -fg -geometry 1680x1050 -SecurityTypes None -rfbport 5901)
63+
# TigerVNC needs to be configured with -rfbport -1 to not open a TCP
64+
# port, while TurboVNC doesn't support being passed -1 and won't open
65+
# a TCP port anyhow.
66+
rfbport_arg="-rfbport -1"
67+
if [ "${{ matrix.vncserver }}" == "turbovnc" ]; then rfbport_arg=""; fi
68+
69+
container_id=$(docker run -d -it test vncserver -xstartup /opt/install/jupyter_remote_desktop_proxy/share/xstartup -verbose -fg -geometry 1680x1050 -SecurityTypes None -rfbunixpath /tmp/vncserver.socket $rfbport_arg)
6470
sleep 1
6571
6672
echo "::group::Install netcat, a test dependency"
@@ -70,9 +76,18 @@ jobs:
7076
'
7177
echo "::endgroup::"
7278
73-
docker exec -it $container_id timeout --preserve-status 1 nc -v localhost 5901 2>&1 | tee -a /dev/stderr | \
79+
docker exec -it $container_id timeout --preserve-status 1 nc -vU /tmp/vncserver.socket 2>&1 | tee -a /dev/stderr | \
7480
grep --quiet RFB && echo "Passed test" || { echo "Failed test" && TEST_OK=false; }
7581
82+
echo "::group::Security - Verify TCP ports wasn't opened"
83+
ports=(5800 5801 5900 5901)
84+
for port in "${ports[@]}"
85+
do
86+
docker exec -it $container_id timeout --preserve-status 1 nc -vz localhost $port | tee -a /dev/stderr | \
87+
grep --quiet succeeded && { echo "Failed security check - port $port open" && SECURITY_OK=false; } || echo "Passed security check - port $port not opened"
88+
done
89+
echo "::endgroup::"
90+
7691
echo "::group::vncserver logs"
7792
docker exec $container_id bash -c 'cat ~/.vnc/*.log'
7893
echo "::endgroup::"
@@ -82,6 +97,10 @@ jobs:
8297
echo "Test failed!"
8398
exit 1
8499
fi
100+
if [ "$SECURITY_OK" == "false" ]; then
101+
echo "Security check failed!"
102+
exit 1
103+
fi
85104
86105
- name: Install playwright
87106
run: |

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Extra ignore patterns specific to this project
22
# Installed JS libraries
33
node_modules/
4+
package-lock.json
45
# Built JS files
56
jupyter_remote_desktop_proxy/static/dist
67

jupyter_remote_desktop_proxy/setup_websockify.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,27 @@ def setup_websockify():
1212
"vncserver executable not found, please install a VNC server"
1313
)
1414

15+
# TurboVNC and TigerVNC share the same origin and both use a Perl script
16+
# as the executable vncserver. We can determine if vncserver is TigerVNC
17+
# by searching tigervnc string in the Perl script.
18+
#
19+
# The content of the vncserver executable can differ depending on how
20+
# TigerVNC and TurboVNC has been distributed. Below are files known to be
21+
# read in some situations:
22+
#
23+
# - https://github.com/TigerVNC/tigervnc/blob/v1.13.1/unix/vncserver/vncserver.in
24+
# - https://github.com/TurboVNC/turbovnc/blob/3.1.1/unix/vncserver.in
25+
#
26+
with open(vncserver) as vncserver_file:
27+
vncserver_file_text = vncserver_file.read().casefold()
28+
is_turbovnc = "turbovnc" in vncserver_file_text
29+
1530
# {unix_socket} is expanded by jupyter-server-proxy
16-
vnc_args = [vncserver, '-rfbunixpath', '{unix_socket}']
31+
vnc_args = [vncserver, '-rfbunixpath', "{unix_socket}", "-rfbport", "-1"]
32+
if is_turbovnc:
33+
# turbovnc doesn't handle being passed -rfbport -1, but turbovnc also
34+
# defaults to not opening a TCP port which is what we want to ensure
35+
vnc_args = [vncserver, '-rfbunixpath', "{unix_socket}"]
1736

1837
xstartup = os.getenv("JUPYTER_REMOTE_DESKTOP_PROXY_XSTARTUP")
1938
if not xstartup and not os.path.exists(os.path.expanduser('~/.vnc/xstartup')):

0 commit comments

Comments
 (0)