LangChain AI代码审计Agent 初用心得
d2550自留地
2026年5月25日 09:37
江苏
在小说阅读器读本章
去阅读
以下文章来源于ap0s
,作者ap0s
ap0s
.
安全小白
LangChain AI代码审计Agent 初用心得
本人使用的优缺点总结
优点
- 封装prompt、llm,Parser 调用确实方便
- 工具集成,如一个
@tool就可以封装成一个agent的方法 - 链式调用
- 对RAG处理以及向量数据库处理比较方便
缺点:
- 受服务提供商的限制,如官方GLM暂未集成
框架
设计思想是通过对审计的重点使用@tool进行封装,让agent知道自己要干哪些事情,然后进行补充,这里写死比较局限,得喂一些rag
\"\"\"
PHP Ssrf 检测工具
\"\"\"
from langchain_core.tools import tool
from typing import List, Dict, Any
import re
@tool
def detect_php_ssrf(code: str) -> List[Dict[str, Any]]:
\"\"\"检测 PHP SSRF (服务端请求伪造) 漏洞\"\"\"
import re
vulnerabilities = []
\"\"\"例如\"\"\"
patterns = {
\"file_get_contents\": {
\"pattern\": r'file_get_contents\\s*\\([^)]*\\$_(GET|POST|REQUEST)',
\"severity\": \"HIGH\",
\"description\": \"file_get_contents 使用用户输入,可能 SSRF\"
},
\"curl_setopt URL\": {
\"pattern\": r'curl_setopt.*CURLOPT_URL.*\\$_(GET|POST|REQUEST)',
\"severity\": \"HIGH\",
\"description\": \"cURL 请求 URL 由用户控制\"
},
\"fopen用户输入\": {
\"pattern\": r'fopen\\s*\\([^)]*\\$_(GET|POST|REQUEST)',
\"severity\": \"MEDIUM\",
\"description\": \"fopen 打开用户指定的 URL\"
},
}
lines = code.splitlines()
for i, line in enumerate(lines, 1):
for vuln_type, info in patterns.items():
if re.search(info[\"pattern\"], line, re.IGNORECASE):
vulnerabilities.append({
\"type\": f\"PHP SSRF - {vuln_type}\",
\"line\": i,
\"code\": line.strip(),
\"description\": info[\"description\"],
\"severity\": info[\"severity\"]
})
return vulnerabilities
使用漏洞分析+污点检测的,判断此处是否用户可控
## 详细发现
### 1. SSRF (服务端请求伪造) - CRITICAL
**位置**: webhook/model.php 第 580-620 行,misc/model.php 第 200-250 行
**检测方式**: detect_php_ssrf + LLM 分析
**污点验证**: is_tainted=True, confidence=HIGH
审计结果
目前看来,确实能够审计出来一些有用或者可以水cve的洞,对于组合漏洞的挖掘效果不是很尽如人意
关于ai幻觉
让每次ai干活的时候,让读取一个类似于:《用户使用协议》的东西进行排除,但是不能完全排除
消耗
因为不集成GLM,所以我这里使用的QWEN3.5-PLUS,简单审计100w token就消耗完了,LangChain这种工具的开发还是得使用本地模型进行调试
TODO
- 添加LLM漏洞验证模块
- 添加国标+实际漏洞的RAG
- 添加任务模块让工具自行pull干活
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论