第八章–重生之我是AI人:扩展与反思—Hati踩过的坑

admin 2026-06-23 05:51:26 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了AI安全工具Hati在跨平台兼容性、可降级设计和审计合规方面的实践经验。针对Windows/Linux/macOS环境,解决了终端编码、Celery替代方案等问题;通过Elasticsearch/Redis降级机制确保系统稳定性;详细说明了技能添加流程和MCP工具集成方法。文章还分析了LLM决策偏好、误报率等挑战,并提出了多Agent协作、长期记忆等未来发展方向。 综合评分: 82 文章分类: AI安全,渗透测试,安全工具,安全建设,漏洞分析


cover_image

第八章 – 重生之我是AI人:扩展与反思 — Hati踩过的坑

TtTeam

2026年6月21日 11:13 广东

在小说阅读器读本章

去阅读

以下文章来源于威胁情报Z分析 ,作者Gach0ng

威胁情报Z分析 .

国际网络安全威胁情报,地缘政治事件分析。

  1. 跨平台兼容那些坑

Hati 跑在 Windows、Linux、macOS 三个平台。跨平台最大的坑是细节。

坑 1:Windows 终端编码

症状:PowerShell 跑 python -m api.main 报 UnicodeEncodeError: ‘gbk’ codec can’t encode character。

为啥:Windows 默认 GBK,我们的 prompt 和日志里有大量中文和 emoji。

解法:agents/orchestrator.py:9-15

if sys.platform == 'win32':    try:        sys.stdout.reconfigure(encoding='utf-8', errors='replace')        sys.stderr.reconfigure(encoding='utf-8', errors='replace')    except AttributeError:        pass

这行代码在所有 agent 模块都重复了 4-5 次。重复是合理的 — 因为每个模块都可能被独立 import,不能依赖外部。

教训:Python 项目做跨平台,encoding 永远第一坑。

坑 2:Celery 在 Windows 失效

症状:celery worker 在 Windows 启动失败,报 NotImplementedError。

为啥:Celery 4.x 在 Windows 上不支持 prefork,用 solo pool 又不支持定时任务。

解法:不用 Celery,直接用 concurrent.futures.ThreadPoolExecutor。

文件:api/main.py(后台任务)

from concurrent.futures import ThreadPoolExecutorexecutor = ThreadPoolExecutor(max_workers=5)
@router.post("/api/pentest/start")async def start_pentest(req: PentestStartRequest):    task_id = str(uuid.uuid4())    # 扔进线程池,不阻塞    executor.submit(run_pentest_task, task_id, req)    return {"task_id": task_id, "status": "started"}

但 Linux 上还能用 Celery(config/celery_config.py 留着)。

教训:别死磕一个方案,降级到能跑的就行。

坑 3:Docker Desktop 启动慢

症状:Windows 上 docker-compose up -d redis 要 30 秒,Linux 上 1 秒。

为啥:Docker Desktop 用 WSL2 后端,启动慢。

解法:

● Windows 用户:接受现实,或者用 WSL 直接装 Redis

● 配置好超时(timeout=10 改成 timeout=30)

  1. 可降级设计

设计原则:外部依赖挂了,Hati 不能挂。

2.1 Elasticsearch 降级

文件:security/audit_logger.py:48-65

def _init_es(self):    try:        self._es = Elasticsearch([ES_URL], verify_certs=False, request_timeout=10)        if self._es.ping():            print(f"✅ ES 连接成功")        else:            print("⚠️ ES 连接失败,降级到本地日志")            self._es = None    except Exception as e:        print(f"⚠️ ES 异常,降级到本地日志: {e}")        self._es = None
def log(self, event):    if self._es:        self._es.index(index="pentest-logs", document=event)    else:        # 降级:写本地 JSON        with open(f"logs/{event['timestamp']}.json", "a") as f:            f.write(json.dumps(event) + "\n")

实际效果:Hati 启动时如果 ES 不通,日志显示”降级到本地日志”,任务正常跑。

2.2 Redis 降级

类似逻辑:state/progress_tracker.py 检测 Redis 不通就改用内存字典。

2.3 MCP 降级

如果 Kali VM 不可达,Hati 会:

  1. 跳过 execute_tool 路径

  2. 不报错,直接走 execute_skill 路径(主机侧 requests 发包)

  3. 任务能完成,只是少了 30% 功能

  4. 审计和合规

每次任务都产生审计记录:

# security/audit_logger.pyaudit.log(    task_id=task_id,    actor="orchestrator",    action="execute_skill",    target="http://testphp.vulnweb.com",    decision=llm_decision,  # LLM 输出的 JSON    result=execution_result,  # 执行结果    timestamp=datetime.utcnow().isoformat(),    authorized_by="[email protected]"  # 来自请求)

审计字段:

● 谁(actor)

● 干了啥(action)

● 对谁(target)

● 决策依据(decision – LLM 思考过程)

● 结果(result)

● 授权人(authorized_by)

为啥要审计:

● 合规:渗透测试必须有书面授权

● 复盘:出问题时能追

● 客户要求:甲方常要”完整的测试日志”

  1. 怎么加新技能(开发者视角)

第 6 章讲了 Markdown 加法,这里讲工程化做法。

步骤:

  1. 在 skills/hack-skills/skills/ 下创建目录

  2. 写 SKILL.md

  3. (可选) 写 SCENARIOS.md(具体场景)

  4. 重新加载技能

示例:加一个”密码学误用”技能

mkdir -p skills/hack-skills/skills/crypto-misuse

写 SKILL.md:

---name: crypto-misusedescription: 检测密码学 API 的常见误用(弱算法、硬编码 IV 等)severity: mediumtags: [crypto, api, web]---
## detection1. 抓包看 HTTPS 协议版本(SSLv3、TLS 1.0 都是弱协议)2. 看证书是否过期3. 看加密算法是否使用 MD5、SHA1、DES4. 看 IV 是否硬编码或可预测
## success_indicators- 响应头: Server: SSLv3- 证书过期天数 < 0- 加密算法包含 MD5|SHA1|DES|RC4
## pocsopenssl s_client -connect target.com:443 -tls1

重启 Hati:

# 强制重载技能python&nbsp;-c&nbsp;"from agents.skill_loader import get_skill_loader; get_skill_loader()"

新技能就被纳入 match_skills 的候选池,LLM 可以在 ReAct 循环里自动发现和使用。

  1. 怎么加新 MCP 工具

步骤:

  1. 在 Kali VM 上装工具

  2. 在 hexstrike/hexstrike_mcp.py 加 @mcp.tool() 装饰器

  3. 重启 HexStrike Server

  4. Hati 端不需要改 — HexStrikeClient.execute_command() 透传命令

# hexstrike/[email protected]()def&nbsp;my_new_tool(target:&nbsp;str, option:&nbsp;str&nbsp;=&nbsp;"default") ->&nbsp;dict:&nbsp; &nbsp;&nbsp;"""我的新工具"""&nbsp; &nbsp;&nbsp;return&nbsp;subprocess_run(["my-new-tool", option, target])

6.1 单 LLM 决策的偏置

LLM 对热门漏洞类型有偏好(老提 SQL 注入、XSS),很少主动提 SSRF、XXE。这是训练数据分布问题。

应对:

● state/diversity_injector.py:强制多类型漏洞尝试

● 第 7 章 RAG 注入历史 POC 来平衡

6.2 8 轮上下文窗口紧张

8 轮后早期信息开始被压缩/遗忘。

应对:

● state/context_compressor.py:对历史结果做摘要

● 把”上一轮结果”摘要(不全文)喂给下一轮

6.3 误报率

虽然有多模式确认,误报率仍在 3-5%。

应对:

● 不在生产目标上跑(仅授权测试)

● 报告里明确标记 status: confirmed/potential/false_positive

6.4 性能瓶颈

单任务 5-10 分钟,主要时间花在 LLM 调用上(每次决策 3-10 秒)。

应对:

● 分层 Prompt 减少 KV-cache 失效

● 并行执行独立任务(ThreadPoolExecutor)

● 用更小的模型(未来方向)

  1. 未来方向

我目前在想的几个方向:

7.1 更多的agent协作

现状:有限的 LLM 做所有决策。

未来:

● ReconAgent(专门做信息收集)

● VulnAgent(专门做漏洞分析)

● ExploitAgent(专门做漏洞利用)

● ReportAgent(专门做报告)

● 互相通信,各有专长

7.2 长期记忆

现状:每次任务经验不沉淀。

未来:

● 把”成功的 POC 改写模式”存进向量库

● 下次遇到类似目标,直接复用历史经验

7.3 主动学习

现状:模型参数固定。

未来:

● 用 LoRA 微调

● 把”成功任务”作为训练数据

● 让 LLM 在 Hati 场景下越来越准

7.4 实时决策可视化

现状:Web UI 只显示”现在在干啥”。

未来:

● 实时画 ReAct 决策树

● 让用户介入决策(“这个目标先别测 XSS”)

● 半自动化 → 监督式自动化

  1. 写在最后:开源与安全

Hati 已经开源,MIT 协议。

但必须强调:这个工具仅供合法的安全测试和学术研究使用。

# 来自 README本工具仅供合法的安全测试和学术研究使用。使用前请确保已获得目标系统所有者的书面授权。使用者需遵守当地法律法规,作者不承担任何因滥用本工具而导致的法律责任。

我在每次 PR 合并前都会确认:

● ✅ 没有硬编码的”恶意 payload”

● ✅ 默认配置下不会真的打未授权目标

● ✅ 审计日志默认开启

  1. 联系和反馈

● 绿泡泡和github同名,作者多年甲方经验,目前在乙方厂商做ai安全分析,在岗看机会中~欢迎交流

● 项目地址:https://github.com/Gach0ng/Hati

● GitHub Issues:提 bug、提建议

● PR 欢迎:加技能、改 prompt、优化 RAG 都行

● 安全问题:请私下交流,不要在公开 issue 提

感谢您的耐心,祝挖洞愉快。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:TtTeam 《第八章 – 重生之我是AI人:扩展与反思 — Hati踩过的坑》

评论:0   参与:  0