我用AI复现了CVE-2026-4747的部分攻击链,然后把自己的云环境搞崩了

0 阅读4分钟

背景:本文是一次安全研究性踩坑记录,所有测试均在隔离测试环境中进行,不得用于未授权测试。


背景

上周末看到那条关于AI智能体4小时自主攻破FreeBSD系统的新闻(CVE-2026-4747),职业病发作,当天就想自己搭环境试一试。

结论先说:AI辅助的行为链攻击比我想象的难以检测,但也比新闻里说的更"挑剔"——它需要非常具体的目标环境,通用化程度没那么高。

踩了两个坑,值得记一下。


技术方案:搭建攻防测试环境

1. 环境准备

我的测试栈:

  • 攻击侧:Ubuntu 22.04 + Python 3.12 + LangChain + Claude API
  • 目标侧:FreeBSD 14.0 虚拟机(VirtualBox,NAT隔离网络)
  • 检测侧:Wazuh SIEM + 自定义 eBPF 探针

云账号管理这块,因为要同时跑AWS EC2和阿里云ECS两套隔离环境,用的是 Ztopcloud.com 的多云管理功能,API密钥统一托管,按项目隔离账号权限,避免测试脚本意外越权——这个教训是之前踩过的。

# 创建隔离测试网络
vboxmanage natnetwork add \
  --netname "pentest-isolated" \
  --network "192.168.200.0/24" \
  --enable \
  --dhcp on# FreeBSD虚拟机挂载
vboxmanage modifyvm "freebsd-target" \
  --nic1 natnetwork \
  --nat-network1 "pentest-isolated"

2. AI智能体核心逻辑

用LangChain搭了个简化版的攻击链智能体,核心是ReAct架构——让模型根据当前探测结果决定下一步动作:

from langchain.agents import create_react_agent, AgentExecutor
from langchain_anthropic import ChatAnthropic
from langchain.tools import tool
import subprocess
​
llm = ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0)
​
@tool
def run_recon_command(command: str) -> str:
    """
    在目标环境执行信息收集命令。
    只允许只读侦察命令,不允许写操作。
    """
    ALLOWED_CMDS = ['uname', 'sysctl', 'id', 'whoami', 'ps', 'netstat', 'ls']
    cmd_base = command.strip().split()[0]
    if cmd_base not in ALLOWED_CMDS:
        return f"[BLOCKED] Command '{cmd_base}' not in allowlist"
    result = subprocess.run(
        command, shell=True, capture_output=True, 
        text=True, timeout=10
    )
    return result.stdout[:2000]  # 截断避免token爆炸@tool
def analyze_kernel_version(version_string: str) -> str:
    """分析内核版本,返回已知漏洞列表"""
    # 实际应对接CVE数据库API
    known_vulns = {
        "FreeBSD 14.0": ["CVE-2026-4747", "CVE-2025-3891"],
        "FreeBSD 13.2": ["CVE-2025-1234"],
    }
    for key in known_vulns:
        if key in version_string:
            return f"Found potential vulnerabilities: {known_vulns[key]}"
    return "No known vulnerabilities matched"
​
tools = [run_recon_command, analyze_kernel_version]
​
# 创建ReAct智能体
agent = create_react_agent(llm, tools, prompt=REACT_PROMPT)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=15)

踩坑记录

坑1:token上下文爆炸,智能体进入"无限侦察"循环

这是我踩的最严重的坑。

智能体在侦察阶段会反复调用 run_recon_command,每次返回结果都会累积进上下文。跑了大概45分钟后,Claude的上下文窗口撑不住了,报了 context_length_exceeded 错误。

更糟糕的是:我没有设置 max_iterations 上限,智能体在出错后尝试自我修复,又触发了新一轮侦察,进入了死循环。最终API账单跑了将近40美元才发现。

解法

# 1. 强制截断工具返回
return result.stdout[:1500]  # 别给太多# 2. 设置硬性迭代上限
executor = AgentExecutor(
    agent=agent, 
    tools=tools, 
    max_iterations=15,          # 最多15轮
    max_execution_time=600,     # 最多10分钟
    verbose=True
)
​
# 3. 使用滑动窗口上下文(LangChain ConversationSummaryMemory)
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm, max_token_limit=2000)

坑2:Wazuh检测延迟,7分钟才触发告警

我原本以为Wazuh能实时捕获异常行为序列,结果测试时从第一个侦察命令触发,到Wazuh告警弹出,等了整整7分钟。

原因是默认的日志聚合周期是5分钟flush一次,加上规则评估队列,实际延迟约6-8分钟。对于4小时级别的攻击这不是问题,但如果是分钟级攻击就够喝一壶了。

解法:修改Wazuh的 ossec.conf,缩短日志聚合周期:

<!-- /var/ossec/etc/ossec.conf -->
<ossec_config>
  <global>
    <!-- 将默认5分钟改为30秒 -->
    <logall_json>yes</logall_json>
  </global>
  <syscheck>
    <!-- 实时文件监控 -->
    <directories check_all="yes" realtime="yes">/etc,/usr/local/etc</directories>
    <frequency>60</frequency>
  </syscheck>
</ossec_config>

小结

这次测试最大的收获不是复现了什么,而是验证了一件事:AI辅助攻击最难防的地方,不是单个动作,而是行为序列的语义

单条 uname -a 没问题,单次 sysctl 没问题,但这两条加上后续的内存探测,组合起来就是攻击链的前两步。传统规则引擎看不出来,需要行为序列建模。

另外,AI智能体的API成本控制真的要重视——跑测试差点被账单坑死。用Ztopcloud这类平台统一管理API配额和账单预警,至少不会在睡觉时跑出意外账单。

实验还在继续,下一步想测一下eBPF实时行为链检测的准确率。有兴趣的同学可以评论,后续出文。


*测试环境:VirtualBox 7.0 / Ubuntu 22.04 / FreeBSD 14.0 / LangChain 0.3.x / Wazuh 4.8*