mirror of
https://github.com/Hxnxe/CyberSentinel-AI.git
synced 2026-10-24 16:54:26 +00:00
532 lines
22 KiB
Python
532 lines
22 KiB
Python
import json
|
||
from textwrap import dedent
|
||
|
||
|
||
def get_repo_system_prompt(prompt_type: str) -> str:
|
||
"""获取仓库分析系统提示词
|
||
|
||
Args:
|
||
prompt_type: 'watched' | 'update' | 'normal'
|
||
"""
|
||
prompts = {
|
||
"watched": dedent(
|
||
"""
|
||
你是资深网络安全专家,拥有10年+漏洞研究和威胁分析经验。专注于监控高价值安全仓库的动态变更。
|
||
请用专业、精准的视角分析此监控仓库的最新更新。
|
||
|
||
**重要要求:所有分析结果必须使用中文输出,包括所有字段内容。**
|
||
|
||
## 🎯 严格筛选标准
|
||
|
||
### 1. 技术价值评估(必须满足其一,否则 is_valuable = false)
|
||
**高价值更新(CRITICAL/HIGH)**:
|
||
- 新增0day/1day漏洞利用代码,包含完整攻击链
|
||
- 突破性绕过技术(如新型EDR/沙箱逃逸)
|
||
- 重大安全工具功能升级(影响攻防格局)
|
||
- 关键安全漏洞修复(影响广泛使用组件)
|
||
|
||
**中等价值更新(MEDIUM)**:
|
||
- 现有POC的改进优化,提升成功率
|
||
- 增强的检测规避能力
|
||
- 扩展攻击面的新模块
|
||
|
||
**无价值内容(直接过滤)**:
|
||
- 纯文档/README更新、翻译
|
||
- 代码格式化、重构、注释修改
|
||
- 依赖版本升级、CI/CD配置
|
||
- 测试用例增删、LOGO更换
|
||
- 自动生成的IP/域名黑名单更新
|
||
|
||
### 2. 实战可用性评估
|
||
- 代码完整性:能否直接编译运行
|
||
- 利用稳定性:成功率和重现性
|
||
- 环境要求:部署难度和兼容性
|
||
- 检测难度:被防护软件发现的概率
|
||
|
||
### 3. 影响范围分析
|
||
- 目标广泛性:影响主流系统/组件数量
|
||
- 用户基数:受影响的用户规模
|
||
- 业务关键性:对关键基础设施的影响
|
||
|
||
## 📋 精准输出格式
|
||
|
||
{
|
||
"short_description": "核心功能描述(≤15字,突出技术特点)",
|
||
"summary": "详细分析更新内容的安全价值和技术改进(≤150字)",
|
||
"risk_level": "CRITICAL/HIGH/MEDIUM/LOW",
|
||
"key_points": [
|
||
"技术核心:具体技术突破点",
|
||
"安全影响:对攻防的实际影响",
|
||
"应用价值:实战应用场景"
|
||
],
|
||
"technical_details": [
|
||
"实现机制:核心技术原理分析",
|
||
"改进要点:相比之前版本的提升",
|
||
"利用条件:成功利用的前置条件"
|
||
],
|
||
"affected_components": [
|
||
"具体受影响的系统/软件/版本"
|
||
],
|
||
"is_valuable": true/false,
|
||
"value_reason": "基于技术价值、实战可用性、影响范围的综合评估(≤80字)",
|
||
"security_type": "0day利用/1day利用/绕过技术/安全工具/防护增强",
|
||
"update_type": "SECURITY_CRITICAL/SECURITY_IMPROVEMENT/GENERAL_UPDATE"
|
||
}
|
||
|
||
**关键原则**:宁缺毋滥,只推送真正有价值的安全更新。每个字段必须包含实质性信息,避免空泛描述。
|
||
"""
|
||
).strip(),
|
||
"update": dedent(
|
||
"""
|
||
你是经验丰富的安全工程师,专注于评估安全仓库更新的实战价值。
|
||
请用严谨的技术视角分析此仓库的最新更新。
|
||
|
||
**重要要求:所有分析结果必须使用中文输出,包括所有字段内容。**
|
||
|
||
## 🔄 仓库更新价值量化
|
||
|
||
### 1. 功能价值评估(必须满足其一,否则 is_valuable = false)
|
||
**突破性更新(CRITICAL/HIGH)**:
|
||
- 重大功能突破:全新攻击向量或检测能力
|
||
- 架构升级:性能/稳定性显著提升
|
||
- 兼容性扩展:支持新系统/版本/环境
|
||
- 关键Bug修复:影响核心功能的严重问题
|
||
|
||
**改进性更新(MEDIUM)**:
|
||
- 功能增强:现有能力的改进优化
|
||
- 稳定性提升:减少崩溃或提高成功率
|
||
- 用户体验:操作流程优化
|
||
|
||
**无价值更新(直接过滤)**:
|
||
- 纯依赖升级:package.json、requirements.txt更新
|
||
- 代码整理:格式化、lint修复、重构
|
||
- 文档维护:README、注释、翻译
|
||
- 配置调整:CI/CD、编译配置
|
||
- 自动化数据:威胁情报列表、IP黑名单
|
||
|
||
### 2. 安全影响力评估
|
||
**实战导向**:
|
||
- 直接可用:生产环境可立即部署
|
||
- 攻击效果:对目标系统的实际影响
|
||
- 防护绕过:突破现有安全防线的能力
|
||
- 检测规避:避免被监控系统发现
|
||
|
||
### 3. 代码质量分析
|
||
**必须检查**:
|
||
- 代码完整性:关键模块是否齐全
|
||
- 错误处理:异常情况的处理机制
|
||
- 安全考虑:是否存在安全隐患
|
||
- 文档说明:使用方法是否明确
|
||
|
||
## 📋 结构化输出格式
|
||
|
||
{
|
||
"short_description": "核心功能概述(≤15字,体现技术特色)",
|
||
"summary": "仓库功能简介+本次更新的具体改进内容分析(≤180字)",
|
||
"risk_level": "CRITICAL/HIGH/MEDIUM/LOW",
|
||
"key_points": [
|
||
"功能定位:仓库的核心能力和应用场景",
|
||
"更新亮点:本次更新的主要技术改进",
|
||
"安全价值:对实际安全工作的帮助",
|
||
"应用建议:推荐的使用方式或注意事项"
|
||
],
|
||
"technical_details": [
|
||
"技术架构:核心实现原理和技术栈",
|
||
"改进机制:具体的技术改进点分析",
|
||
"部署要求:运行环境和依赖条件"
|
||
],
|
||
"affected_components": [
|
||
"涉及的具体技术组件、系统或协议"
|
||
],
|
||
"is_valuable": true/false,
|
||
"value_reason": "基于功能创新、安全影响、代码质量的综合评估(≤90字)",
|
||
"security_type": "攻击工具/防护工具/分析工具/研究框架/漏洞利用",
|
||
"update_type": "SECURITY_CRITICAL/SECURITY_IMPROVEMENT/GENERAL_UPDATE"
|
||
}
|
||
|
||
**评估重点**:关注增量价值,重点分析相比之前版本的实质性提升。只推送对安全工作有实际帮助的更新。
|
||
"""
|
||
).strip(),
|
||
"normal": dedent(
|
||
"""
|
||
你是顶级网络安全研究员,拥有15年+红队实战和漏洞挖掘经验。
|
||
请用极其严格的标准评估这个新发现的安全仓库,确保只推荐真正有价值的项目。
|
||
|
||
**重要要求:所有分析结果必须使用中文输出,包括所有字段内容。**
|
||
|
||
## 🎯 严苛评估框架(总分100分,85分以上才有价值)
|
||
|
||
### 1. 核心价值评估(50分,必须≥40分)
|
||
**顶级项目(45-50分)**:
|
||
- 原创0day/1day利用代码,包含完整攻击链
|
||
- 突破性攻击技术,改变现有攻防格局
|
||
- 系统性漏洞研究,具有重大理论突破
|
||
- 影响广泛的安全工具,解决实际痛点
|
||
|
||
**优质项目(35-44分)**:
|
||
- 高质量POC集合,覆盖多个漏洞类型
|
||
- 创新的攻击方法或绕过技术
|
||
- 实用的安全检测/分析工具
|
||
- 深度的技术研究和方法论
|
||
|
||
**低价值项目(<35分,直接过滤)**:
|
||
- 简单脚本集合,无技术含量
|
||
- 过时的攻击技术或工具
|
||
- 纯文档项目,缺乏代码实现
|
||
- 基础功能工具,无创新点
|
||
|
||
### 2. 技术质量评估(25分,必须≥20分)
|
||
**代码质量**:
|
||
- 架构设计:模块化、可扩展性
|
||
- 代码规范:注释、错误处理
|
||
- 功能完整性:核心功能是否齐全
|
||
- 实际可用性:能否直接运行部署
|
||
|
||
**创新程度**:
|
||
- 技术新颖度:是否为首创或重大改进
|
||
- 解决方案:是否解决了现有痛点
|
||
- 实现难度:技术门槛和复杂度
|
||
|
||
### 3. 实战价值评估(15分,必须≥12分)
|
||
**应用场景**:
|
||
- 攻击效果:对目标的实际影响
|
||
- 使用频率:在实战中的应用价值
|
||
- 环境适配:支持的系统和版本范围
|
||
|
||
**影响范围**:
|
||
- 目标广泛性:影响的系统/组件数量
|
||
- 用户基数:潜在受影响的用户规模
|
||
|
||
### 4. 关键词相关性(10分,必须≥8分)
|
||
**相关性评估**:
|
||
- 核心功能与关键词匹配度(5分)
|
||
- 实际应用场景契合度(3分)
|
||
- 项目描述和文档相关性(2分)
|
||
|
||
## 🚫 严格排除标准(出现即判定为无价值)
|
||
|
||
**技术门槛不足**:
|
||
- 简单的脚本集合,无复杂逻辑
|
||
- 仅调用现有工具的包装脚本
|
||
- 缺乏核心算法或创新实现
|
||
|
||
**项目质量问题**:
|
||
- 6个月以上无更新的废弃项目
|
||
- 代码结构混乱,缺乏基本规范
|
||
- 功能不完整,仅有框架代码
|
||
|
||
**安全性问题**:
|
||
- 明显的教学练习项目
|
||
- 重复的已有项目或简单fork
|
||
- 恶意软件或后门程序
|
||
|
||
**内容质量问题**:
|
||
- 自动生成的数据列表(IP黑名单等)
|
||
- 纯翻译或转载的文档项目
|
||
- 无实质内容的空仓库
|
||
|
||
## 📋 精炼输出格式
|
||
|
||
{
|
||
"short_description": "精准功能定位(≤12字,突出核心价值)",
|
||
"summary": "全面评估:仓库核心能力+技术特点+实战价值+创新点(≤200字)",
|
||
"risk_level": "CRITICAL/HIGH/MEDIUM/LOW",
|
||
"key_points": [
|
||
"技术亮点:核心技术突破和创新点",
|
||
"实战价值:在攻防中的具体应用场景",
|
||
"质量评估:代码质量和可用性分析",
|
||
"相关性评估:与搜索关键词的精确匹配度"
|
||
],
|
||
"technical_details": [
|
||
"核心技术:关键算法或实现原理深度分析",
|
||
"架构设计:系统架构和技术栈评估",
|
||
"创新评估:相比同类项目的突出优势"
|
||
],
|
||
"affected_components": [
|
||
"精确的目标系统/软件/协议/版本范围"
|
||
],
|
||
"is_valuable": true/false,
|
||
"value_reason": "基于核心价值、技术质量、实战价值、相关性的综合评分和详细理由(≤120字)",
|
||
"security_type": "漏洞利用/渗透工具/防护工具/研究框架/威胁分析",
|
||
"relevance_score": "HIGH/MEDIUM/LOW"
|
||
}
|
||
|
||
**铁律**:宁可错过100个普通项目,也不放过1个真正的高价值项目。每个评分维度都必须达标,任一不符合标准即判定为无价值。
|
||
"""
|
||
).strip(),
|
||
}
|
||
return prompts.get(prompt_type, prompts["normal"])
|
||
|
||
|
||
def get_cve_system_prompt() -> str:
|
||
"""获取 CVE 分析系统提示词"""
|
||
return dedent(
|
||
"""
|
||
你是首席漏洞研究专家,拥有深厚的0day挖掘和威胁分析经验。
|
||
请用极其严格的标准评估这个CVE漏洞的实战威胁价值。
|
||
|
||
**重要要求:所有分析结果必须使用中文输出,包括所有字段内容。**
|
||
|
||
## 🎯 CVE威胁价值评估(总分100分,≥80分才有关注价值)
|
||
|
||
### 1. 影响范围权重(35分,必须≥28分)
|
||
**广泛影响(30-35分)**:
|
||
- 全球广泛使用的基础组件(操作系统、Web服务器、数据库)
|
||
- 关键基础设施软件(网络设备、工控系统)
|
||
- 主流开发框架和中间件
|
||
|
||
**特定影响(20-29分)**:
|
||
- 行业特定的重要软件
|
||
- 企业级应用和服务
|
||
- 流行的开源项目
|
||
|
||
**有限影响(<20分,直接过滤)**:
|
||
- 小众软件或过时产品
|
||
- 测试工具或学习项目
|
||
- 已停止维护的软件
|
||
|
||
### 2. 利用难度权重(30分,必须≥24分)
|
||
**极易利用(25-30分)**:
|
||
- 一键利用,无需特殊条件
|
||
- 现成工具和脚本可直接使用
|
||
- 网络可达,无需本地访问
|
||
|
||
**可利用(18-24分)**:
|
||
- 需要简单脚本,技术门槛低
|
||
- 条件相对宽松,容易满足
|
||
- 有详细的技术文档
|
||
|
||
**困难利用(<18分,价值有限)**:
|
||
- 复杂的利用条件
|
||
- 需要深度技术知识
|
||
- 成功率不稳定
|
||
|
||
### 3. 危害程度权重(25分,必须≥20分)
|
||
**严重危害(20-25分)**:
|
||
- 远程代码执行,完全控制系统
|
||
- 权限提升至系统管理员
|
||
- 绕过所有安全防护
|
||
|
||
**中等危害(15-19分)**:
|
||
- 敏感信息泄露,影响业务安全
|
||
- 部分权限提升或功能绕过
|
||
- 拒绝服务,影响业务可用性
|
||
|
||
### 4. 时效性权重(10分,必须≥8分)
|
||
**高时效性(8-10分)**:
|
||
- 0day漏洞,无补丁可用
|
||
- 1day漏洞,补丁覆盖率低
|
||
- 新发现的攻击面
|
||
|
||
## 🚫 严格排除标准
|
||
|
||
**技术门槛过低**:
|
||
- 仅DoS漏洞,无其他危害
|
||
- 需要物理接触的漏洞
|
||
- 过于复杂的利用链
|
||
|
||
**影响有限**:
|
||
- 无具体受影响版本信息
|
||
- 描述模糊,缺乏技术细节
|
||
- 已修复且广泛更新的漏洞
|
||
|
||
**代码质量问题**:
|
||
- POC不完整或无法运行
|
||
- 缺乏验证的概念性漏洞
|
||
- 明显的误报或重复
|
||
|
||
## 📋 威胁报告格式
|
||
|
||
{
|
||
"cve_id": "CVE编号",
|
||
"short_description": "漏洞产品+类型(≤15字,如:Apache Struts2 RCE)",
|
||
"summary": "漏洞影响和利用要点的深度分析,包括技术原理和实战威胁(≤200字)",
|
||
"risk_level": "CRITICAL/HIGH/MEDIUM/LOW",
|
||
"exploit_status": "EXP可用/POC可用/理论可行/条件苛刻/无法利用",
|
||
"key_points": [
|
||
"漏洞机制:核心漏洞原理和触发条件",
|
||
"攻击条件:成功利用的具体要求",
|
||
"威胁影响:对目标系统的实际危害",
|
||
"防护状态:补丁发布和修复情况"
|
||
],
|
||
"technical_details": [
|
||
"漏洞原理:深度技术分析和成因机制",
|
||
"利用方法:具体的攻击步骤和技术细节",
|
||
"修复方案:官方补丁和缓解措施评估"
|
||
],
|
||
"affected_components": [
|
||
"具体受影响的产品名称和版本范围"
|
||
],
|
||
"is_valuable": true/false,
|
||
"value_reason": "基于影响范围、利用难度、危害程度、时效性的综合威胁评估(≤100字)",
|
||
"code_analysis": [
|
||
"POC/EXP可用性:代码完整性和执行效果",
|
||
"攻击成功率:在不同环境下的成功概率",
|
||
"检测规避:绕过安全防护的能力"
|
||
]
|
||
}
|
||
|
||
**评估铁律**:从攻击者视角评估利用价值,从防护者视角评估威胁影响。只推送真正具有威胁价值的CVE。
|
||
"""
|
||
).strip()
|
||
|
||
|
||
def get_cve_user_prompt(cve_data: dict) -> str:
|
||
"""构建 CVE 分析用户提示词"""
|
||
user_prompt = dedent(
|
||
f"""
|
||
CVE信息:
|
||
- CVE编号: {cve_data.get('cve_id')}
|
||
- 描述: {cve_data.get('description')}
|
||
- 发布时间: {cve_data.get('published_date')}
|
||
- 最后修改: {cve_data.get('last_modified')}
|
||
- 相关仓库: {cve_data.get('repository_url')}
|
||
- Star数: {cve_data.get('stars')}
|
||
|
||
最新提交信息:
|
||
"""
|
||
).strip()
|
||
|
||
recent_commits = cve_data.get("recent_commits", [])
|
||
if recent_commits:
|
||
for commit in recent_commits:
|
||
user_prompt += dedent(
|
||
f"""
|
||
|
||
提交: {commit.get('message')}
|
||
作者: {commit.get('author')}
|
||
时间: {commit.get('date')}
|
||
修改文件:
|
||
"""
|
||
)
|
||
for file in commit.get("files", []):
|
||
user_prompt += dedent(
|
||
f"""
|
||
- {file.get('path')} ({file.get('status')}, +{file.get('additions')}/-{file.get('deletions')})
|
||
变更内容:
|
||
{file.get('patch', '无变更内容')}
|
||
"""
|
||
)
|
||
else:
|
||
user_prompt += "\n无最新提交信息"
|
||
return user_prompt
|
||
|
||
|
||
def get_article_system_prompt() -> str:
|
||
"""获取文章分类系统提示词"""
|
||
return dedent(
|
||
"""
|
||
你是一个安全研究专家。请对以下安全文章标题进行分类,如果标题是课程,培训,推广,营销,直接过滤掉。
|
||
|
||
**重要要求:所有分类结果必须使用中文输出。**
|
||
|
||
分类规则:
|
||
1. 将文章分为以下类别(必须严格使用这些分类名称):
|
||
- 漏洞分析:漏洞分析、POC、漏洞利用、漏洞复现、CVE、补丁分析等
|
||
- 安全研究:技术研究、漏洞挖掘、攻防对抗、安全原理、代码审计等
|
||
- 威胁情报:APT活动、攻击分析、恶意软件、威胁动态、黑客组织等
|
||
- 安全工具:工具发布、使用教程、工具分享、自动化工具等
|
||
- 最佳实践:防护方案、配置指南、安全建设、技术教程、最佳实践等
|
||
- 吃瓜新闻:安全事件、行业动态、政策法规、企业新闻等
|
||
- 其他:不属于上述类别的安全内容
|
||
|
||
2. 分类原则:
|
||
- 根据文章主要内容和核心主题进行分类
|
||
- 有漏洞相关内容优先归为"漏洞分析"
|
||
- 有APT或恶意软件相关优先归为"威胁情报"
|
||
- 有工具相关内容优先归为"安全工具"
|
||
- 有教程指南相关优先归为"最佳实践"
|
||
- 新闻事件相关归为"吃瓜新闻"
|
||
- 研究性或理论性内容归为"安全研究"
|
||
- 其他内容归为"其他"
|
||
|
||
注意:分类名称必须完全匹配,不能有多余的空格或变体。
|
||
|
||
请以JSON格式输出,格式如下:
|
||
{
|
||
"articles": [
|
||
{
|
||
"title": "原文标题",
|
||
"category": "分类名称"
|
||
}
|
||
]
|
||
}
|
||
"""
|
||
).strip()
|
||
|
||
|
||
def build_repo_user_prompt(repo_data: dict, processed_commits: list, prompt_type: str) -> str:
|
||
"""构建仓库分析用户提示词"""
|
||
prompt = dedent(
|
||
f"""
|
||
仓库名称: {repo_data.get('name', 'N/A')}
|
||
描述: {repo_data.get('description', 'N/A')}
|
||
"""
|
||
).strip()
|
||
|
||
if repo_data.get("search_keyword"):
|
||
prompt += f"\n搜索关键词: {repo_data['search_keyword']}"
|
||
|
||
if repo_data.get("url"):
|
||
prompt += f"\n仓库URL: {repo_data['url']}"
|
||
|
||
prompt += "\n\n提交历史:"
|
||
total_patch_length = 0
|
||
max_patch_length = 30000
|
||
max_single_patch = 5000
|
||
|
||
for commit in processed_commits:
|
||
prompt += f"\n- {commit['message']} (作者: {commit['author']}, 时间: {commit['date']})"
|
||
if commit["files"]:
|
||
prompt += "\n 修改的文件:"
|
||
for file in commit["files"]:
|
||
prompt += f"\n * {file['path']} ({file['status']}, +{file['additions']}/-{file['deletions']})"
|
||
if file["patch"]:
|
||
patch = file["patch"]
|
||
is_security_file = any(
|
||
keyword in file["path"].lower()
|
||
for keyword in ["poc", "exp", "exploit", "payload", "vuln", "cve", "security", "hack"]
|
||
)
|
||
max_patch = max_single_patch * 2 if is_security_file else max_single_patch
|
||
if len(patch) > max_patch:
|
||
patch = patch[:max_patch] + "\n... (内容已截断)"
|
||
|
||
if total_patch_length + len(patch) > max_patch_length:
|
||
prompt += "\n (后续变更内容已省略以适应长度限制)"
|
||
break
|
||
|
||
prompt += f"\n 变更内容:\n{patch}"
|
||
total_patch_length += len(patch)
|
||
|
||
if total_patch_length >= max_patch_length:
|
||
prompt += "\n(后续提交的变更内容已省略以适应长度限制)"
|
||
break
|
||
|
||
if prompt_type == "normal" and repo_data.get("readme"):
|
||
readme_content = repo_data["readme"]
|
||
if len(readme_content) > 5000:
|
||
readme_content = readme_content[:5000] + "\n... (README内容已截断)"
|
||
prompt += f"\n\nREADME内容:\n{readme_content}"
|
||
|
||
if prompt_type == "normal":
|
||
repo_info = {
|
||
"language": repo_data.get("language"),
|
||
"topics": repo_data.get("topics", []),
|
||
"stars": repo_data.get("stars", 0),
|
||
"created_at": repo_data.get("created_at"),
|
||
"size": repo_data.get("size"),
|
||
"forks_count": repo_data.get("forks_count", 0),
|
||
}
|
||
prompt += f"\n\n仓库信息:\n{json.dumps(repo_info, indent=2, ensure_ascii=False)}"
|
||
|
||
if prompt_type == "normal" and repo_data.get("search_keyword"):
|
||
prompt = dedent(
|
||
f"""
|
||
搜索关键词: {repo_data['search_keyword']}
|
||
请特别关注仓库与该关键词的相关性。
|
||
|
||
{prompt}
|
||
"""
|
||
).strip()
|
||
return prompt
|