Skill是AI Agent系统中的一种高级能力封装模块,它主要用于将一组提示词逻辑(Prompts)、工具调用(Tools)、资源访问(Resources)以及任务执行流程整合在一起,使模型能够像"掌握某项技能"一样完成特定任务。Skill通常对应一个明确的任务能力,例如:代码审查、文档总结、数据分析等,它会在内部定义任务步骤、调用所需工具并读取相关资源,然后根据预设提示词生成最终结果。在基于MCP的系统或AI Agent架构中,Skill可以看作是对底层能力的进一步抽象和编排,使复杂任务可以通过模块化方式被复用和扩展,从而让AI不仅能够理解信息,还能够执行完整的工作流程
SKILL通常以一个独立目录的形式存在,通过规范化的文件来描述AI Agent的能力、执行流程以及相关资源,完整的SKILL目录结构如下所示:
my-skill/
├── SKILL.md # 必需:说明和元数据
├── scripts/ # 可选:可执行代码
├── references/ # 可选:文档参考资料
├── assets/ # 可选:模板、资源
└──LICENSE.txt # 可选:授权License在基于MCP的技能(Skill)体系中为了避免一次性向模型注入大量信息而浪费上下文窗口和Token,通常会采用一种称为渐进式披露(Progressive Disclosure)的设计思想,它会根据任务需要逐步向模型提供信息,在实际实现中Skill通常采用三层渐进式披露架构:始终加载层、按需加载层、主动探索层
LAYER 1:始终加载(元数据)
第一层是YAML前置信息,通常位于Skill文件的最顶部并以YAML格式编写,它主要用于向模型简要说明当前SKILL的技能基本信息并帮助模型理解该技能的存在以及什么时候应该使用它,例如:技能名称、用途、适用场景以及触发条件等,由于这部分信息会直接出现在模型的系统提示中,因此必须保持极简、清晰和结构化,只包含最必要的描述信息
前置信息示例:
---
name: skill-name
description: Brief description of what this skill does and when to use it
---作用逻辑如下:

第二层是SKILL.md主体,模型通过第一层信息判断某个Skill与当前任务相关时,系统就会加载该文件的主体内容并执行任务,这部分内容通常包含技能的完整说明,例如:任务执行步骤、操作流程、最佳实践、示例说明以及注意事项等,第二层与第一层相比信息会更加详细,能够为模型提供执行任务所需的具体指导
SKILL.md示例:https://skillsmp.com/zh/skills/firyrice-skill-skills-pdf-zh-skill-md
---
name: pdf
description: 当用户想要处理 PDF 文件时使用此技能。包括从 PDF 读取或提取文本/表格、合并或拼接多个 PDF、拆分 PDF、旋转页面、添加水印、创建新 PDF、填写 PDF 表单、加密/解密 PDF、提取图像以及对扫描的 PDF 进行 OCR 使其可搜索。如果用户提到 .pdf 文件或要求生成 PDF,请使用此技能。
license: Proprietary. LICENSE.txt has complete terms
---
# PDF 处理指南
## 概述
本指南介绍了使用 Python 库和命令行工具进行基本 PDF 处理操作。有关高级功能、JavaScript 库和详细示例,请参阅 REFERENCE.md。如果需要填写 PDF 表单,请阅读 FORMS.md 并遵循其说明。
## 快速开始
```python
from pypdf import PdfReader, PdfWriter
# 读取 PDF
reader = PdfReader("document.pdf")
print(f"Pages: {len(reader.pages)}")
# 提取文本
text = ""
for page in reader.pages:
text += page.extract_text()
```
## Python 库
### pypdf - 基本操作
#### 合并 PDF
```python
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
reader = PdfReader(pdf_file)
for page in reader.pages:
writer.add_page(page)
with open("merged.pdf", "wb") as output:
writer.write(output)
```
#### 拆分 PDF
```python
reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as output:
writer.write(output)
```
#### 提取元数据
```python
reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"Title: {meta.title}")
print(f"Author: {meta.author}")
print(f"Subject: {meta.subject}")
print(f"Creator: {meta.creator}")
```
#### 旋转页面
```python
reader = PdfReader("input.pdf")
writer = PdfWriter()
page = reader.pages[0]
page.rotate(90) # 顺时针旋转 90 度
writer.add_page(page)
with open("rotated.pdf", "wb") as output:
writer.write(output)
```
### pdfplumber - 文本和表格提取
#### 提取带布局的文本
```python
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
```
#### 提取表格
```python
with pdfplumber.open("document.pdf") as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for j, table in enumerate(tables):
print(f"Table {j+1} on page {i+1}:")
for row in table:
print(row)
```
#### 高级表格提取
```python
import pandas as pd
with pdfplumber.open("document.pdf") as pdf:
all_tables = []
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table: # 检查表格是否非空
df = pd.DataFrame(table[1:], columns=table[0])
all_tables.append(df)
# 合并所有表格
if all_tables:
combined_df = pd.concat(all_tables, ignore_index=True)
combined_df.to_excel("extracted_tables.xlsx", index=False)
```
### reportlab - 创建 PDF
#### 基本 PDF 创建
```python
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf", pagesize=letter)
width, height = letter
# 添加文本
c.drawString(100, height - 100, "Hello World!")
c.drawString(100, height - 120, "This is a PDF created with reportlab")
# 添加线条
c.line(100, height - 140, 400, height - 140)
# 保存
c.save()
```
#### 创建多页 PDF
```python
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("report.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []
# 添加内容
title = Paragraph("Report Title", styles['Title'])
story.append(title)
story.append(Spacer(1, 12))
body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
story.append(body)
story.append(PageBreak())
# 第 2 页
story.append(Paragraph("Page 2", styles['Heading1']))
story.append(Paragraph("Content for page 2", styles['Normal']))
# 构建 PDF
doc.build(story)
```
#### 下标和上标
**重要提示**:绝不要在 ReportLab PDF 中使用 Unicode 下标/上标字符(₀₁₂₃₄₅₆₇₈₉、⁰¹²³⁴⁵⁶⁷⁸⁹)。内置字体不包含这些字形,会导致它们显示为实心黑框。
相反,在 Paragraph 对象中使用 ReportLab 的 XML 标记标签:
```python
from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheet
styles = getSampleStyleSheet()
# 下标:使用 <sub> 标签
chemical = Paragraph("H<sub>2</sub>O", styles['Normal'])
# 上标:使用 <super> 标签
squared = Paragraph("x<super>2</super> + y<super>2</super>", styles['Normal'])
```
对于 canvas 绘制的文本(非 Paragraph 对象),手动调整字体大小和位置,而不是使用 Unicode 下标/上标。
## 命令行工具
### pdftotext (poppler-utils)
```bash
# 提取文本
pdftotext input.pdf output.txt
# 提取保留布局的文本
pdftotext -layout input.pdf output.txt
# 提取特定页面
pdftotext -f 1 -l 5 input.pdf output.txt # 第 1-5 页
```
### qpdf
```bash
# 合并 PDF
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
# 拆分页面
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
# 旋转页面
qpdf input.pdf output.pdf --rotate=+90:1 # 将第 1 页旋转 90 度
# 移除密码
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
```
### pdftk (如果可用)
```bash
# 合并
pdftk file1.pdf file2.pdf cat output merged.pdf
# 拆分
pdftk input.pdf burst
# 旋转
pdftk input.pdf rotate 1east output rotated.pdf
```
## 常见任务
### 从扫描的 PDF 提取文本
```python
# 需要:pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path
# 将 PDF 转换为图像
images = convert_from_path('scanned.pdf')
# OCR 每一页
text = ""
for i, image in enumerate(images):
text += f"Page {i+1}:\n"
text += pytesseract.image_to_string(image)
text += "\n\n"
print(text)
```
### 添加水印
```python
from pypdf import PdfReader, PdfWriter
# 创建水印(或加载现有的)
watermark = PdfReader("watermark.pdf").pages[0]
# 应用到所有页面
reader = PdfReader("document.pdf")
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark)
writer.add_page(page)
with open("watermarked.pdf", "wb") as output:
writer.write(output)
```
### 提取图像
```bash
# 使用 pdfimages (poppler-utils)
pdfimages -j input.pdf output_prefix
# 这会将所有图像提取为 output_prefix-000.jpg、output_prefix-001.jpg 等
```
### 密码保护
```python
from pypdf import PdfReader, PdfWriter
reader = PdfReader("input.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
# 添加密码
writer.encrypt("userpassword", "ownerpassword")
with open("encrypted.pdf", "wb") as output:
writer.write(output)
```
## 快速参考
| 任务 | 最佳工具 | 命令/代码 |
|------|-----------|--------------|
| 合并 PDF | pypdf | `writer.add_page(page)` |
| 拆分 PDF | pypdf | 每个文件一页 |
| 提取文本 | pdfplumber | `page.extract_text()` |
| 提取表格 | pdfplumber | `page.extract_tables()` |
| 创建 PDF | reportlab | Canvas 或 Platypus |
| 命令行合并 | qpdf | `qpdf --empty --pages ...` |
| OCR 扫描的 PDF | pytesseract | 先转换为图像 |
| 填写 PDF 表单 | pdf-lib 或 pypdf (见 FORMS.md) | 见 FORMS.md |
## 下一步
- 有关高级 pypdfium2 用法,请参阅 REFERENCE.md
- 有关 JavaScript 库(pdf-lib),请参阅 REFERENCE.md
- 如果需要填写 PDF 表单,请遵循 FORMS.md 中的说明
- 有关故障排除指南,请参阅 REFERENCE.md作用逻辑如下(以code Review)为例:

第三层是关联文件/扩展资源,通常存放在技能目录中的其他文件夹(例如:references/、examples/、templates/),第三层与前面两层不同,它不会自动加载,而是由模型在需要时主动探索,例如:当模型在执行任务时发现需要更详细的API文档、示例代码、模板文件时就可以导航到这些关联文件中获取信息
扩展资源示例:
skill/
├─ SKILL.md
├─ references/
│ ├─ api_docs.md
│ ├─ style_guide.md
├─ templates/
│ ├─ review_template.md
│ └─ report_template.md
└─ examples/
├─ example1.md
└─ example2.md作用逻辑示例:

在本地安装好Claude Code后,我们可以通过一下三种方式来安装Skills:
方式1:自然语言安装
我们可以找到需要安装的SKILL的GIthub项目地址,随后在Claude Code中输入命令让其安装即可,例如:
帮我安装skill,项目地址是:https://github.com/anthropics/skills/tree/main/skills/pdf
方式二:人工手动安装
Claude Code专门有一个文件夹用来管理所有的Skill文件,我们可以找到需要安装的SKILL的GIthub项目地址,随后下载SKILL包并解压到指定的目录下面即可使用,简易示例如下:
Step 1:下载SKILL到本地
https://skillsmp.com/zh/skills/unix2dos-skills-news-tracker-skill-md


Step 2:将SKILLs解压后放到对应的目录(skill需要新建)

Step 3:随后让Claude Code来列出Skills

备注:需要注意SKILL在不同操作系统中存放的路径各不相同
存储类型 | Windows路径 | Linux /macOS路径 | Skill 示例路径 | 使用范围 |
|---|---|---|---|---|
全局Skill(个人级) | C:\Users\用户名\.claude\skills\ | ~/.claude/skills/ | ~/.claude/skills/<skill-name>/SKILL.md | 当前用户的所有项目都可以使用 |
项目Skill(项目级) | 项目路径\.claude\skills\ | ./.claude/skills/ | .claude/skills/<skill-name>/SKILL.md | 只对当前项目生效 |
插件Skill(插件级) | <plugin>\skills\ | <plugin>/skills/ | <plugin>/skills/<skill-name>/SKILL.md | 仅在插件启用的环境中生效 |
方式三:插件市场安装
Claude Code支持插件市场功能,我们可以像应用商店一样浏览和安装Skills,例如:
# 插件市场注册
/plugin marketplace add anthropics/skills
#插件浏览安装
/plugin install document-skills@anthropic-agent-skills
备注说明:上面我们使用的是Claude Code的插件机制安装的Skill,而不是直接手动下载Skill到全局或项目目录,所以会将Skill安装到.claude\plugins\marketplaces\anthropic-agent-skills目录中去,例如:


同时插件市场还提供了npx的安装方式,例如:
npx skills add unix2dos/skills
随后我们选择对应的SKill进行安装:
npx skills add unix2dos/skills

Coze是字节跳出的AI Agent平台,也支持Skills功能,我们可以再其功能界面选择"扣子编程->技能-附件"中来上传对应的SKill技能包并应用


手动创建SKILL主要包括以下五个步骤:

首先我们需要再本地创建一个SKILL工作目录

A、目录初始化
首先我们需要对SKILL目录结构按需进行初始化
#标准规范
my-skill/
├── SKILL.md # 必需:说明和元数据
├── scripts/ # 可选:可执行代码
├── references/ # 可选:文档参考资料
└── assets/ # 可选:模板、资源
#简易示例
cve-detail
├── SKILL.md # 必需:核心文件
├── references/ # 可选:参考资料
└── assets/ # 可选:模板资源B、核心文件编写
SKILL.md核心文件编写设计要点:
编写格式示例:
---
name: cve-detail
description: xxxx // SKILL简要描述
---
# xxx // SKILL简短介绍
.....
## When to Use This Skill // SKILL何时使用
......
## Implementation Steps // SKILL执行流程
Step 1:xxx
Step 2:xxx
## Output format // SKILL输出格式
## Error Handling // SKILL异常处理工具地址:
https://github.com/anthropics/skills/tree/main/skills/skill-creator
工具介绍:Skill Creator是Anthropic官方提供的一个元技能(Meta Skill),它主要用于创建、优化、评估和测试其他Skills
使用方法:
Step 1:安装skill
npx skills add https://github.com/anthropics/skills --skill skill-creator
Step 2:创建Skill
随后我们要从一个产品经理的视角触发,将Claude Code当成你的研发同事,告诉他你想要需要做一个什么样子的SKILL?这个SKILL的工作流程是怎么样的?输出是怎么样的?越详细越好
我是SDL安全团队的一员,我们团队日常工作的一环就是对新纰漏的安全漏洞进行应急响应,在应急过程中我们需要快速定位对应的安全漏洞的信息(包括:影响产品、影响版本、利用条件、漏洞代码、是否有公开POC、修复方案),我们希望可以
将这个过程通过SKILL来实现自动化,请结合一下的需求描述细节设计一个SKILL:
主要目的:根据用户输入的"CVE/CNVD/CNNVD/GHSA ID"漏洞编号快速定位对应的安全漏洞信息(包括:影响产品、影响版本、利用条件、漏洞代码、是否有公开POC、修复方案)
触发条件:用户输入"关键词(情报分析) + CVE/CNVD/CNNVD漏洞编号"
执行流程:
Step 1: 校验CVE/CNVD/CNNVD漏洞编号
Step 2: 根据CVE/CNVD/CNNVD漏洞编号快速定位,可以从官方漏洞情报源快速获取,例如:CVE官方情报查询、CNVD官方情报查询、CNNVD官方情报查询(需要你自行扩展)
Step 3: 获取漏洞代码、漏洞POC信息(如有)、漏洞修复方案
Step 4: 输出漏洞情报分析报告,格式如下:
漏洞编号:CVE、CNVD、CNNVD编号
GHSA ID:GHSA ID编号
产品名称:组件名称/软件名称
语言生态:JAVA/GO....
漏洞描述:漏洞信息描述
漏洞类型:RCE/SQLI/XSS等
CVSS评分:CVSS评分
影响版本:产品受影响版本
修复版本:产品漏洞修复版本
官方公告:产品官方针对此漏洞的说明信息
POC/EXP:
是否存在:漏洞POC/EXP存在/不存在
POC代码:POC/EXP代码工程地址 或者 POC/EXP代码信息
参考信息
逐一列举上述信息获取的来源,需要给出对应的地址
在创建的期间SKILL-create也会根据当前你的这些描述来提出几个关键的问题 和你交互式访谈,一起来完成这个设计,是不是很想一个合作小伙伴


随后又开始勤勤恳恳的working了,在工作之中可能需要交互式的去授予一些权限(按需授予哦)


生成结果如下:

SKILL.md
---
name: vulnerability-intelligence
description: 根据CVE/CNVD/CNNVD/GHSA漏洞编号快速获取安全漏洞情报分析报告。当用户需要分析安全漏洞、查询漏洞详情、获取漏洞POC或修复方案时使用此技能。特别适用于SDL安全团队应急响应、漏洞分析、安全研究等场景。当用户提到"漏洞分析"、"情报分析"、"CVE详情"、"CNVD查询"等关键词时触发此技能。
---
# 漏洞情报分析技能
## 概述
本技能用于根据安全漏洞编号(CVE、CNVD、CNNVD、GHSA)快速获取详细的漏洞情报分析报告。技能会自动从多个官方漏洞情报源获取信息,并生成标准格式的分析报告,包含漏洞描述、影响版本、POC信息、修复方案等关键信息。
## 输入格式
用户应提供漏洞编号,可以包含以下任意格式:
- CVE编号:`CVE-2024-12345`
- CNVD编号:`CNVD-2024-12345`
- CNNVD编号:`CNNVD-2024-12345`
- GHSA编号:`GHSA-xxxx-xxxx-xxxx`
用户可以在编号前添加关键词如"漏洞分析"、"情报分析"、"CVE详情"、"CNVD查询",例如:
- "漏洞分析 CNVD-2024-12345"
- "情报分析 GHSA-xxxx-xxxx-xxxx"
- "CVE详情 CVE-2025-xxxx"
- "CNVD查询 CNVD-2024-12345"
## 执行流程
### 步骤1:校验漏洞编号
1. 解析用户输入,提取漏洞编号
2. 验证编号格式是否符合标准
3. 确定漏洞编号类型(CVE/CNVD/CNNVD/GHSA)
### 步骤2:查询漏洞信息
根据漏洞编号类型选择相应的查询源:
#### CVE编号查询源:
1. **NVD (National Vulnerability Database)**: https://nvd.nist.gov/vuln/detail/CVE-{id}
2. **MITRE CVE**: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-{id}
3. **CVE Details**: https://www.cvedetails.com/cve/CVE-{id}/
#### CNVD编号查询源:
1. **CNVD官网**: https://www.cnvd.org.cn/flaw/show/{id}
2. **CNNVD官网**: https://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD={id}
#### GHSA编号查询源:
1. **GitHub Advisory Database**: https://github.com/advisories/{id}
2. **OSV.dev**: https://osv.dev/vulnerability/{id}
### 步骤3:信息提取与解析
从查询结果中提取以下信息:
1. **漏洞基本信息**:标题、描述、发布日期
2. **技术详情**:漏洞类型、CVSS评分、影响组件
3. **影响范围**:受影响产品、影响版本
4. **修复信息**:修复版本、补丁链接
5. **POC信息**:是否有公开POC/EXP、相关链接
6. **参考信息**:官方公告、安全公告链接
### 步骤4:生成分析报告
**必须严格按照以下模板生成中文漏洞情报分析报告,保持完全相同的标题、顺序和格式。不要添加额外的章节或改变结构。**
#### 报告模板(必须严格遵循)
```
漏洞编号:[CVE/CNVD/CNNVD编号]
GHSA ID:[GHSA ID编号]
产品名称:[组件名称/软件名称]
语言生态:[JAVA/GO/Python等]
漏洞描述:[漏洞信息描述]
漏洞类型:[RCE/SQLI/XSS等]
CVSS评分:[CVSS评分]
影响版本:[产品受影响版本]
修复版本:[产品漏洞修复版本]
官方公告:[产品官方针对此漏洞的说明信息]
POC/EXP:
是否存在:[漏洞POC/EXP存在/不存在]
POC代码:[POC/EXP代码工程地址 或者 POC/EXP代码信息]
参考信息:
1. [来源1名称]: [URL]
2. [来源2名称]: [URL]
...
```
#### 关键要求:
1. **格式严格性**:必须使用上述完全相同的标题和顺序
2. **信息完整性**:尽可能填写所有字段,如果某些信息无法获取,标记为"[信息缺失]"
3. **中文输出**:所有内容使用中文描述
4. **参考信息格式**:每个参考源使用数字编号列表,格式为 `[来源名称]: [URL]`
5. **POC信息**:如果存在公开POC,提供链接或代码片段;如果不存在,明确说明"不存在"
6. **CVSS评分**:如果存在多个CVSS版本,优先使用CVSS 3.x评分
7. **版本信息**:尽可能准确地提供受影响版本和修复版本范围
## 工具使用指南
### 网络查询工具
使用`WebFetch`或`WebSearch`工具从上述源获取信息。**重要:查询时应明确要求提取符合报告模板的信息。**
```bash
# 示例:查询CVE信息
WebFetch({
url: "https://nvd.nist.gov/vuln/detail/CVE-2024-12345",
prompt: "提取CVE漏洞的以下信息用于漏洞分析报告:1. 标题/产品名称 2. 详细描述 3. CVSS评分 4. 漏洞类型 5. 受影响版本范围 6. 修复版本 7. 官方公告链接 8. POC信息(如有)"
})
```
### 报告生成指南
**必须严格按照以下流程生成报告:**
1. **信息收集**:从多个源收集漏洞信息
2. **信息验证**:对比不同源的信息,选择最权威的数据
3. **模板填充**:将信息填入报告模板,保持原有格式不变
4. **格式检查**:确保报告完全符合模板结构
5. **信息标注**:如果某些信息无法获取,使用"[信息缺失]"标注
6. **来源记录**:为每个信息点记录来源URL
**绝对禁止:**
- 更改模板的标题、顺序或结构
- 添加额外的章节或子标题
- 使用不同的格式(如Markdown标题、项目符号列表)
- 省略模板中的任何字段(除非确实无法获取信息)
### 信息处理
1. 如果网页内容可以直接解析,使用`WebFetch`的prompt提取结构化信息
2. 如果网页需要JavaScript渲染,考虑使用`WebSearch`获取摘要信息
3. 多个源的信息进行对比和验证,选择最权威的信息
### 报告生成
使用标准的Markdown格式生成报告,确保信息完整、格式清晰。
## 注意事项
1. **信息验证**:对于关键信息(如CVSS评分、影响版本),尽量从多个源验证
2. **中文支持**:CNVD/CNNVD信息优先使用中文源,确保报告为中文
3. **POC处理**:如果存在公开POC,提供链接但不要直接执行或提供完整攻击代码
4. **安全边界**:仅用于安全研究和应急响应,不得用于非法用途
5. **信息时效性**:注明信息获取时间,提醒用户漏洞信息可能更新
## 示例
### 示例输入1:
"分析CVE-2021-44228漏洞"
### 示例输出1:
```
漏洞编号:CVE-2021-44228
GHSA ID:GHSA-jfh8-c2jp-5v3q
产品名称:Apache Log4j
语言生态:JAVA
漏洞描述:Apache Log4j2 2.0-beta9到2.15.0版本存在远程代码执行漏洞,攻击者可通过构造恶意日志信息触发JNDI注入,导致远程代码执行。
漏洞类型:RCE (Remote Code Execution)
CVSS评分:10.0 (Critical)
影响版本:Apache Log4j2 2.0-beta9 到 2.15.0 (不包括2.15.0)
修复版本:2.16.0 及以上版本
官方公告:Apache官方已发布安全公告,建议用户立即升级到2.16.0或更高版本。
POC/EXP:
是否存在:存在
POC代码:https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce
参考信息:
1. NVD: https://nvd.nist.gov/vuln/detail/CVE-2021-44228
2. MITRE CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
3. Apache安全公告: https://logging.apache.org/log4j/2.x/security.html
4. GitHub Advisory: https://github.com/advisories/GHSA-jfh8-c2jp-5v3q
```
**注意**:这是一个符合模板格式的正确示例。所有字段都按照模板顺序排列,没有额外的格式或结构变化。
## 故障处理
1. **查询失败**:如果一个源查询失败,尝试其他备用源
2. **信息不全**:标记缺失信息,并说明哪些源未提供该信息
3. **格式错误**:如果漏洞编号格式不正确,提示用户并提供正确格式示例
4. **网络问题**:如果所有源都不可用,建议用户手动查询并提供查询链接
## 更新记录
- 2024-04-13: 初始版本创建,支持CVE/CNVD/CNNVD/GHSA漏洞查询
scripts/validate_vuln_id.py
#!/usr/bin/env python3
"""
漏洞编号验证脚本
用于验证CVE、CNVD、CNNVD、GHSA编号格式
"""
import re
import sys
from typing import Dict, Optional, Tuple
class VulnerabilityIDValidator:
"""漏洞编号验证器"""
# 正则表达式模式
PATTERNS = {
'CVE': r'^CVE-\d{4}-\d{4,}$', # CVE-YYYY-NNNN+
'CNVD': r'^CNVD-\d{4}-\d{5,}$', # CNVD-YYYY-NNNNN+
'CNNVD': r'^CNNVD-\d{4}-\d{6,}$', # CNNVD-YYYY-NNNNNN+
'GHSA': r'^GHSA-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}$', # GHSA-xxxx-xxxx-xxxx
}
@classmethod
def validate(cls, vuln_id: str) -> Tuple[bool, Optional[str], Optional[str]]:
"""
验证漏洞编号格式
Args:
vuln_id: 漏洞编号字符串
Returns:
Tuple[是否有效, 编号类型, 错误信息]
"""
vuln_id = vuln_id.strip().upper()
# 检查每种格式
for vuln_type, pattern in cls.PATTERNS.items():
if re.match(pattern, vuln_id):
return True, vuln_type, None
# 如果没有匹配的格式
error_msg = (
f"无效的漏洞编号格式: {vuln_id}\n"
f"支持的格式:\n"
f" - CVE: CVE-YYYY-NNNN+ (例如: CVE-2021-44228)\n"
f" - CNVD: CNVD-YYYY-NNNNN+ (例如: CNVD-2021-12345)\n"
f" - CNNVD: CNNVD-YYYY-NNNNNN+ (例如: CNNVD-2021-123456)\n"
f" - GHSA: GHSA-xxxx-xxxx-xxxx (例如: GHSA-jfh8-c2jp-5v3q)"
)
return False, None, error_msg
@classmethod
def extract_from_text(cls, text: str) -> Optional[str]:
"""
从文本中提取漏洞编号
Args:
text: 包含漏洞编号的文本
Returns:
提取到的漏洞编号,如果没有找到则返回None
"""
# 尝试匹配所有模式
all_patterns = '|'.join(cls.PATTERNS.values())
match = re.search(all_patterns, text.upper())
if match:
return match.group(0)
return None
@classmethod
def get_query_urls(cls, vuln_id: str, vuln_type: str) -> Dict[str, str]:
"""
根据漏洞编号和类型获取查询URL
Args:
vuln_id: 漏洞编号
vuln_type: 编号类型
Returns:
字典:{源名称: URL}
"""
urls = {}
if vuln_type == 'CVE':
urls = {
'NVD': f'https://nvd.nist.gov/vuln/detail/{vuln_id}',
'MITRE CVE': f'https://cve.mitre.org/cgi-bin/cvename.cgi?name={vuln_id}',
'CVE Details': f'https://www.cvedetails.com/cve/{vuln_id}/'
}
elif vuln_type == 'CNVD':
# 提取CNVD编号中的数字部分
cnvd_num = vuln_id.replace('CNVD-', '')
urls = {
'CNVD官网': f'https://www.cnvd.org.cn/flaw/show/{cnvd_num}',
'CNNVD官网': f'https://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD={vuln_id}'
}
elif vuln_type == 'CNNVD':
urls = {
'CNNVD官网': f'https://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD={vuln_id}'
}
elif vuln_type == 'GHSA':
urls = {
'GitHub Advisory Database': f'https://github.com/advisories/{vuln_id}',
'OSV.dev': f'https://osv.dev/vulnerability/{vuln_id}'
}
return urls
@classmethod
def generate_report_template(cls, vuln_id: str, vuln_type: str) -> str:
"""
生成报告模板
Args:
vuln_id: 漏洞编号
vuln_type: 编号类型
Returns:
报告模板字符串
"""
template = f"""漏洞编号:{vuln_id}
GHSA ID:[GHSA ID编号]
产品名称:[组件名称/软件名称]
语言生态:[JAVA/GO/Python等]
漏洞描述:[漏洞信息描述]
漏洞类型:[RCE/SQLI/XSS等]
CVSS评分:[CVSS评分]
影响版本:[产品受影响版本]
修复版本:[产品漏洞修复版本]
官方公告:[产品官方针对此漏洞的说明信息]
POC/EXP:
是否存在:[漏洞POC/EXP存在/不存在]
POC代码:[POC/EXP代码工程地址 或者 POC/EXP代码信息]
参考信息:
1. [来源1名称]: [URL]
2. [来源2名称]: [URL]
..."""
return template
def main():
"""命令行入口"""
if len(sys.argv) < 2:
print("用法: python validate_vuln_id.py <漏洞编号>")
print("示例: python validate_vuln_id.py CVE-2021-44228")
sys.exit(1)
vuln_id = sys.argv[1]
is_valid, vuln_type, error_msg = VulnerabilityIDValidator.validate(vuln_id)
if is_valid:
print(f"✓ 有效的{vuln_type}编号: {vuln_id}")
print("\n查询URL:")
urls = VulnerabilityIDValidator.get_query_urls(vuln_id, vuln_type)
for source, url in urls.items():
print(f" {source}: {url}")
else:
print(f"✗ {error_msg}")
sys.exit(1)
if __name__ == "__main__":
main()随后我们将生成的SKILL放到.claude中并使用Claude来进行漏洞情报分析

随后我们打开CMD并调用Claude Code来查看目前有那些SKILL,确保我们的SKILL又被正确加载进去

随后进行漏洞情报分析,效果的话勉勉强强,还有很多优化的地方,这里仅是一个示例而已,大家后续有兴趣可以自己尝试一下看看
漏洞分析 CVE-2026-39363
本篇文章我们主要介绍了SKILL的目录结构以及其渐进式纰漏设计,随后我们介绍了关于如何手动和借助工具(现有的SKILL创建工具来创建SKILL),在SKILL的设计过程中我们可以将自己当做是产品经理来告诉模型我这个SKILL要解决什么问题,它的工作流程是怎么样子的,它中间需要工具如何去找,它最终输出的结果需要满足什么样子的格式或者条件,后续我们将继续分享关于SKILL在企业应用安全建设方面的一些比较好的设计和落地经验,敬请期待~
推 荐 阅 读





横向移动之RDP&Desktop Session Hija
