第一章:Go语言ATT&CK战术映射工具集发布(v3.2)概述
Go语言ATT&CK战术映射工具集(Go-ATT&CK-Mapper)v3.2 是面向红蓝对抗与威胁建模场景的轻量级开源工具套件,专为安全工程师、威胁情报分析人员及自动化检测平台开发者设计。本版本全面升级对MITRE ATT&CK v14框架的支持,覆盖全部14项战术(Tactics)、190+技术(Techniques)及子技术(Sub-techniques),并新增对云原生攻击面(如 AWS、Azure、Kubernetes)的扩展映射能力。
核心特性演进
- 零依赖二进制分发:编译为单文件可执行程序,支持 Linux/macOS/Windows,无需 Go 环境即可运行;
- YAML/JSON 双格式策略驱动:通过声明式配置定义战术规则,支持动态加载自定义映射逻辑;
- 实时战术覆盖率分析:内置
coverage子命令,一键生成战术覆盖热力图与缺失技术清单; - 集成 CI/CD 友好接口:提供 REST API 模式(
--serve)与 CLI 批处理模式,适配 SOAR 工作流。
快速启动示例
下载并验证 v3.2 二进制(以 Linux x64 为例):
# 下载并赋予执行权限
curl -L https://github.com/securego/go-attck-mapper/releases/download/v3.2/go-attck-mapper-linux-amd64 -o mapper && chmod +x mapper
# 列出当前支持的所有战术(按 ATT&CK ID 排序)
./mapper tactics --format table
# 生成本地战术覆盖报告(输出 HTML + JSON)
./mapper coverage --input ./rules/enterprise.yaml --output ./report/
映射能力对比(v3.1 → v3.2)
| 能力维度 | v3.1 | v3.2 |
|---|---|---|
| 支持战术数量 | 12 | 14(新增 Impact、Credential Access) |
| 云技术覆盖 | 无 | 37 个云相关子技术(含 AWS IAM Abuse、K8s Pod Escape) |
| 规则热重载 | 需重启进程 | --watch 参数支持 YAML 文件变更自动生效 |
工具默认采用 MITRE 官方 STIX 数据源(https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json),首次运行时自动缓存至 ~/.go-attck/cache/,后续调用离线可用,保障内网环境可用性。
第二章:Go语言实现核心架构与工程实践
2.1 ATT&CK战术域模型的Go结构体建模与泛型化封装
ATT&CK战术(Tactic)是攻击生命周期的抽象阶段,如Execution、Persistence等。为支撑多源威胁情报融合,需构建类型安全、可扩展的Go模型。
核心结构体设计
type TacticID string // e.g., "TA0002"
type Tactic[T any] struct {
ID TacticID `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Metadata T `json:"metadata,omitempty"` // 泛型承载战术特有上下文(如MITRE版本、映射关系)
}
Tactic[T]通过泛型参数T解耦战术元数据与核心语义,避免为每类战术(如含STIX扩展字段 vs 简洁API响应)重复定义结构体。
战术分类对照表
| ID | Name | 示例技术数量 |
|---|---|---|
| TA0001 | Initial Access | 12 |
| TA0002 | Execution | 28 |
数据同步机制
graph TD
A[原始JSON战术数据] --> B[Unmarshal into Tactic[map[string]any]]
B --> C[Validate via custom UnmarshalJSON]
C --> D[Store in generic cache: map[TacticID]Tactic[STIXMeta]]
泛型封装使同一战术实体可无缝适配不同数据源——无需类型断言或反射,编译期即保障字段一致性。
2.2 基于AST解析的Go源码静态分析引擎设计与实战
Go语言的go/ast包提供了完整的抽象语法树(AST)构建能力,是静态分析的核心基础设施。引擎设计以ast.Inspect为遍历主干,结合自定义Visitor结构体实现节点级语义捕获。
核心遍历机制
采用深度优先遍历策略,通过闭包携带上下文状态(如当前作用域、函数名栈),避免全局变量污染。
关键代码示例
func (v *Analyzer) Visit(node ast.Node) ast.Visitor {
switch n := node.(type) {
case *ast.FuncDecl:
v.recordFunc(n.Name.Name, n.Type.Params.List) // 记录函数签名
case *ast.CallExpr:
if ident, ok := n.Fun.(*ast.Ident); ok {
v.reportCall(ident.Name, n.Pos()) // 检测未导出函数调用
}
}
return v
}
逻辑分析:Visit方法接收任意AST节点,类型断言精准匹配目标节点;recordFunc提取函数名与参数列表用于接口契约检查;reportCall结合Pos()定位问题位置,支撑IDE实时诊断。
| 分析维度 | 检查项 | 触发节点类型 |
|---|---|---|
| 接口合规 | 参数数量/类型匹配 | *ast.FuncDecl |
| 安全风险 | fmt.Printf未校验格式符 |
*ast.CallExpr |
graph TD
A[ParseFiles] --> B[Build AST]
B --> C[Run Visitor]
C --> D[Collect Findings]
D --> E[Generate Report]
2.3 多级战术标签自动推理算法:从函数调用链到TA0001–TA0043全域映射
核心思想
将静态调用图与ATT&CK战术语义空间对齐,通过传播式标签注入实现细粒度战术归因。
推理流程
def propagate_tactic_labels(call_graph, seed_nodes, tactic_map):
# call_graph: NetworkX DiGraph,节点为函数名,边为调用关系
# seed_nodes: 初始已标注TAxxxy的入口函数集合(如win32api.CreateProcess → TA0002)
# tactic_map: {func_name: [TA0002, TA0005]},支持多标签叠加
for node in nx.topological_sort(call_graph):
if node in seed_nodes:
continue
# 聚合所有父节点战术标签并去重合并
parents = list(call_graph.predecessors(node))
tactic_map[node] = list(set(
sum([tactic_map.get(p, []) for p in parents], [])
))
return tactic_map
该函数基于拓扑序遍历调用图,确保子函数总能继承其所有直接调用者(父节点)的战术标签;sum([...], []) 实现标签扁平化聚合,set() 消除重复战术ID,最终支持同一函数归属多个战术(如TA0002+TA0005)。
映射覆盖验证
| TA编号 | 对应战术 | 典型函数示例 |
|---|---|---|
| TA0002 | 执行 | os.system, subprocess.run |
| TA0005 | 防御规避 | ctypes.windll.kernel32.VirtualAlloc |
| TA0011 | 信标与C2 | requests.post + 域名硬编码 |
graph TD
A[CreateProcess] --> B[LoadLibrary]
B --> C[GetProcAddress]
C --> D[VirtualAlloc]
A -->|TA0002| A
D -->|TA0005| D
A -.->|传播| B
B -.->|传播| C
C -.->|传播| D
2.4 MITRE Navigator Layer JSON生成器:支持战术覆盖率热力图与指标关联
MITRE ATT&CK Navigator Layer JSON 是可视化红蓝对抗覆盖度的核心载体。生成器需将检测规则、告警事件或测试用例映射至战术(Tactic)与技术(Technique),并注入color, comment, metadata等字段以驱动热力图渲染。
核心字段语义
techniqueID: 如T1059.001(PowerShell 子技术)score: 覆盖强度值(0–100),决定色阶深浅comment: 关联的Sigma规则ID或MITRE D3FEND反制编号
示例生成代码
layer = {
"name": "EDR Coverage Q3-2024",
"domain": "enterprise-attack",
"version": "4.4",
"techniques": [
{
"techniqueID": "T1059.001",
"score": 85,
"comment": "Sigma rule winlogbeat-powershell-suspicious-args"
}
]
}
该字典结构严格遵循 Navigator Layer Schema v4.4;score 驱动热力图色带(#ff6b6b → #4ecdc4),comment 字段在点击技术卡片时展示溯源线索。
支持的指标关联类型
| 关联类型 | 示例值 | 用途 |
|---|---|---|
| Sigma Rule ID | winlogbeat-powershell-suspicious-args |
检测能力溯源 |
| D3FEND Mapping | D3-PS |
映射反制技术层级 |
| MITRE CAR ID | car-2019-04-003 |
行为分析逻辑链 |
graph TD
A[原始告警日志] --> B(ETL提取TTP特征)
B --> C{匹配ATT&CK技术ID}
C -->|命中| D[注入score/comment]
C -->|未命中| E[触发人工标注流程]
D --> F[序列化为Layer JSON]
2.5 高并发模块扫描框架:goroutine池调度与上下文取消机制实战
在高并发模块扫描场景中,无节制的 goroutine 创建易引发内存暴涨与调度开销。采用 ants 池化库可精准控流:
pool, _ := ants.NewPoolWithFunc(100, func(payload interface{}) {
module := payload.(*Module)
module.Scan(context.Background()) // 实际扫描逻辑
})
defer pool.Release()
逻辑分析:
NewPoolWithFunc(100, ...)创建容量为 100 的复用 goroutine 池;payload类型需显式断言确保安全;Scan()应内部支持快速失败,否则阻塞将耗尽池资源。
上下文取消协同设计
扫描任务必须响应父级上下文终止信号:
| 字段 | 作用 | 示例值 |
|---|---|---|
ctx.Done() |
取消通知通道 | <-ctx.Done() |
ctx.Err() |
错误原因 | context.Canceled |
调度流程可视化
graph TD
A[启动扫描] --> B{是否超时/取消?}
B -- 是 --> C[立即返回error]
B -- 否 --> D[从池获取goroutine]
D --> E[执行Module.Scan]
E --> F[归还goroutine]
关键实践要点
- 所有
Scan()方法签名须接收context.Context - 池大小应基于 CPU 核心数 × 2~4 动态估算
- 避免在池函数内启动新 goroutine(破坏池控)
第三章:渗透场景下的战术归因方法论
3.1 攻击模块行为语义提取:IO、网络、进程、注册表等API调用模式识别
恶意模块的行为本质由其系统调用序列刻画。需从原始API日志中剥离噪声,还原高阶语义模式。
核心API类别与语义标签映射
- IO类:
CreateFileW,WriteFile→FILE_WRITE_SENSITIVE - 网络类:
connect,send→C2_COMMUNICATION - 进程类:
CreateProcessW,WriteProcessMemory→CODE_INJECTION - 注册表类:
RegSetValueExW(路径含Run)→PERSISTENCE_REG
典型调用序列模式识别(Python伪代码)
def extract_semantic_pattern(api_calls: List[dict]) -> str:
# 提取连续3个API调用窗口,匹配预定义语义模板
for i in range(len(api_calls) - 2):
triplet = [c["name"] for c in api_calls[i:i+3]]
if triplet == ["CreateProcessW", "WriteProcessMemory", "ResumeThread"]:
return "REMOTE_THREAD_INJECTION" # 行为语义标签
return "UNKNOWN"
该函数滑动扫描三元组,仅当CreateProcessW启动目标进程、WriteProcessMemory写入shellcode、ResumeThread激活线程时,才触发注入语义判定;参数api_calls需含标准化的name、args字段,确保跨样本可比性。
行为模式置信度评估(简化版)
| 模式类型 | 最小调用频次 | 关键参数约束 | 权重 |
|---|---|---|---|
| C2_COMMUNICATION | ≥2 | connect()后send()含HTTP/HTTPS |
0.9 |
| PERSISTENCE_REG | ≥1 | RegSetValueExW路径含Software\Microsoft\Windows\CurrentVersion\Run |
0.7 |
graph TD
A[原始API日志] --> B[归一化:统一命名/参数结构]
B --> C[滑动窗口提取N-gram序列]
C --> D{匹配语义模板库?}
D -->|是| E[输出行为标签+置信度]
D -->|否| F[降级为低层原子行为]
3.2 混淆与反射代码的战术还原技术:运行时符号重建与动态污点追踪
当Android应用经ProGuard或R8深度混淆后,Class.forName("a.b.c")与Method.invoke()等反射调用常导致静态分析失效。此时需在运行时重建符号语义。
运行时类名/方法名重建
通过Instrumentation注册ClassFileTransformer,拦截defineClass并解析字节码常量池,提取原始类名(如com.example.MainActivity)映射至混淆名(a.a.a):
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) {
if (className.equals("com/example/OriginalActivity")) { // 原始类名(调试时注入)
return rebuildSymbolTable(classfileBuffer); // 注入符号表字段
}
return null;
}
该钩子在类加载前介入,className为JVM内部格式(斜杠分隔),classfileBuffer含完整字节码;返回非空则替换加载类,用于植入运行时符号索引。
动态污点追踪协同还原
结合Android Debug Bridge注入TaintDroid式插桩,在invoke()入口标记参数污点,并沿调用链传播至目标方法体,最终关联到重建的符号表。
| 污点源 | 传播路径 | 关联符号重建点 |
|---|---|---|
Intent.getStringExtra() |
Bundle → invoke() → onHandleIntent() |
onHandleIntent原始方法签名 |
graph TD
A[Intent.getStringExtra] --> B[污点标记value]
B --> C[Method.invoke target]
C --> D{是否命中符号映射表?}
D -->|是| E[还原为 com.example.Service.handleData]
D -->|否| F[触发动态重采样]
3.3 红队Go载荷典型模式库构建与战术指纹匹配验证
红队Go载荷的标准化建模是实现自动化战术识别的基础。模式库需覆盖C2通信、进程注入、凭证转储等核心TTPs,并为每类载荷提取可区分的静态与动态指纹。
指纹特征维度设计
- 静态层:编译元信息(GOOS/GOARCH)、符号表熵值、TLS回调函数存在性
- 动态层:DNS请求模式、HTTP User-Agent熵、内存中字符串正则匹配结果
典型载荷模式示例(Cobalt Strike Beacon Lite)
// beacon_lite.go —— 模拟轻量级Beacon心跳逻辑
func heartbeat() {
u := "https://api." + strings.ToLower(randStr(8)) + ".com/alive"
req, _ := http.NewRequest("GET", u, nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") // 固定UA指纹
client := &http.Client{Timeout: 15 * time.Second}
client.Do(req)
}
该代码体现三类关键指纹:固定User-Agent字符串(低熵)、硬编码HTTPS域名结构(
api.{8-lowercase}.com)、无证书校验的HTTP客户端。这些特征被纳入模式库的beacon_http_v1模板,用于匹配检测引擎中的规则集。
战术指纹匹配验证流程
graph TD
A[原始二进制] --> B[提取GO元数据+字符串]
B --> C[生成静态指纹向量]
C --> D[运行时沙箱捕获网络/内存行为]
D --> E[动态指纹聚合]
E --> F[与模式库多维相似度比对]
F --> G[输出ATT&CK战术标签:TA0011]
| 模式ID | 对应战术 | 静态置信阈值 | 动态行为覆盖率 |
|---|---|---|---|
go_c2_http |
Command and Control | 0.82 | 94% |
go_lsass_dump |
Credential Access | 0.91 | 87% |
第四章:企业级集成与实战赋能体系
4.1 与Sliver/Cobalt Strike Beacon联动:Go implant战术元数据自动上报
数据同步机制
Go implant通过HTTP POST向C2服务器周期性上报结构化元数据,包含进程名、架构、权限等级及网络接口信息。
// 构建并加密上报载荷
payload := map[string]interface{}{
"implant_id": uuid.New().String(),
"arch": runtime.GOARCH,
"elevated": isElevated(),
"interfaces": getActiveInterfaces(),
"timestamp": time.Now().Unix(),
}
encrypted, _ := aes.Encrypt([]byte(json.Marshal(payload)), c2Key)
http.Post("https://c2.example.com/beacon", "application/octet-stream", bytes.NewReader(encrypted))
逻辑分析:使用AES-256-CBC加密JSON载荷,避免明文暴露敏感字段;isElevated()通过检查os.Geteuid()(Linux/macOS)或token.IsElevated()(Windows)判定提权状态;getActiveInterfaces()过滤掉lo和docker0等非物理接口。
兼容性适配表
| C2框架 | Beacon协议版本 | 支持的元数据字段 |
|---|---|---|
| Sliver | v2.3+ | implant_id, arch, elevated |
| Cobalt Strike | 4.8+ | implant_id, arch, interfaces |
上报流程
graph TD
A[Go implant启动] --> B[采集本地元数据]
B --> C[序列化+AES加密]
C --> D[HTTP POST至C2 endpoint]
D --> E{响应码200?}
E -->|是| F[更新心跳时间]
E -->|否| G[指数退避重试]
4.2 CI/CD流水线嵌入式检测:GitHub Actions中自动化ATT&CK合规性门禁
在构建安全可信的交付链时,将MITRE ATT&CK框架能力验证前置至CI/CD阶段,可实现对恶意行为模拟与防御覆盖的实时校验。
检测逻辑设计
基于mitre-attack-python库提取TTPs,结合静态规则匹配与动态沙箱报告比对,形成双模验证门禁。
GitHub Actions配置示例
- name: Run ATT&CK Compliance Gate
uses: security-team/attck-gate-action@v1.3
with:
matrix-path: 'threat-intel/enterprise-attack.json' # 官方ATT&CK数据源
coverage-threshold: '85' # 要求至少85%战术层覆盖
exclude-techniques: 'T1059.001,T1566.001' # 允许豁免已知低风险子技
该Action自动拉取最新ATT&CK知识图谱,解析当前代码变更所触发的检测规则集,并校验其是否覆盖Tactic(如Execution、Persistence)维度。coverage-threshold参数定义最小合规率,exclude-techniques支持按ID临时豁免,适配红蓝对抗演练场景。
合规性反馈机制
| 检查项 | 通过条件 | 失败响应 |
|---|---|---|
| Tactic覆盖率 | ≥阈值 | 阻断PR合并并标记缺失项 |
| Technique映射一致性 | 与最新ATT&CK v14.1完全对齐 | 输出差异Diff链接 |
graph TD
A[PR Trigger] --> B[Checkout Code]
B --> C[Scan Build Artifacts]
C --> D{ATT&CK Coverage ≥85%?}
D -- Yes --> E[Allow Merge]
D -- No --> F[Post Comment + Block]
4.3 SOC平台对接:将战术映射结果注入Elastic SIEM并触发MITRE ATT&CK告警规则
数据同步机制
通过Elasticsearch REST API批量写入映射后的threat.tactic与threat.technique.id字段,确保SIEM索引支持ATT&CK语义检索。
POST /logs-endpoint.alerts/_doc
{
"event": { "kind": "alert" },
"threat": {
"tactic": { "name": "Execution" },
"technique": { "id": "T1059", "name": "Command and Scripting Interpreter" }
},
"@timestamp": "2024-06-15T08:22:10.123Z"
}
该文档注入后,触发预置的Elastic Detection Rule(基于threat.technique.id匹配),参数threat.technique.id为规则核心上下文键,@timestamp驱动时间窗聚合。
告警规则联动
Elastic SIEM内置MITRE ATT&CK规则集自动关联:
| Rule Name | MITRE ID | Trigger Condition |
|---|---|---|
| PowerShell Execution | T1059.001 | process.name : "powershell.exe" AND threat.technique.id : "T1059.001" |
| Scheduled Task Creation | T1053.005 | event.action : "task created" AND threat.tactic.name : "Execution" |
流程编排
graph TD
A[战术映射引擎输出] --> B{Elastic Bulk API}
B --> C[SIEM索引写入]
C --> D[Detection Engine扫描]
D --> E[匹配MITRE规则]
E --> F[生成含ATT&CK元数据的告警事件]
4.4 渗透测试报告增强:自动生成含战术热力图、TTP覆盖矩阵与缓解建议的PDF报告
报告生成核心流程
使用 ReportGenerator 类统合 MITRE ATT&CK 数据与扫描结果,驱动 PDF 渲染引擎:
from reportlab.platypus import SimpleDocTemplate, Table, Spacer
from mitreattack.stix20 import MitreAttackData
# 加载 ATT&CK v13.1 数据并构建 TTP 映射索引
attack_data = MitreAttackData("enterprise-attack.json")
ttp_matrix = attack_data.get_ttp_matrix() # 返回 {technique_id: {tactic: [...]}}
doc = SimpleDocTemplate("pentest_report.pdf")
elements = [Spacer(1, 24)]
# 后续插入热力图图表与矩阵表格...
该段初始化 ATT&CK 数据源并建立战术-技术双向索引,
get_ttp_matrix()返回结构化字典,支撑后续 TTP 覆盖率统计与热力图坐标映射。
关键输出组件
- 战术热力图:基于检测到的 technique 数量,按 tactic 归类着色(红→黄→绿)
- TTP 覆盖矩阵:行=战术(Tactic),列=阶段(Initial Access → Impact),单元格标注命中技术数
| Tactic | Initial Access | Execution | Persistence | Impact |
|---|---|---|---|---|
| Execution | 0 | 3 | 1 | 0 |
| Persistence | 0 | 0 | 2 | 0 |
缓解建议注入机制
通过规则引擎匹配 technique ID,自动关联 CIS 控制项与 NIST SP 800-53 修订版建议。
第五章:开源协作与未来演进方向
开源社区驱动的Kubernetes生态升级
2023年,CNCF(云原生计算基金会)主导的SIG-Network工作组协同Istio、Cilium与eBPF社区,联合重构了Service Mesh数据平面。Cilium 1.14版本通过eBPF程序动态注入实现了零配置Sidecar卸载,某金融客户在生产环境将服务间延迟降低42%,CPU开销下降27%。该能力直接源于GitHub上超过380名贡献者提交的621个PR,其中37%由非核心维护者提交——体现跨组织协作的实质性技术产出。
跨仓库自动化协同工作流
以下为典型CI/CD流水线中触发多仓库联动的GitHub Actions YAML片段:
# .github/workflows/sync-release.yml
on:
release:
types: [published]
jobs:
sync-to-docs-and-examples:
runs-on: ubuntu-latest
steps:
- name: Trigger docs update
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.PAT }}
repository: k8s-observability/docs
event-type: release-sync
client-payload: '{"version":"${{ github.event.release.tag_name }}"}'
该机制已在Prometheus Operator项目中落地,确保主仓库发布后5分钟内,配套Helm Chart仓库与示例仓库同步更新镜像标签与CRD版本。
多语言SDK协同演进案例
OpenTelemetry SDK采用“统一规范+分语言实现”模式,其Trace API v1.22规范由Java、Go、Python三组维护者共同签署RFC文档。当Go SDK引入SpanContext.WithRemote()方法时,Python SDK在48小时内完成等效实现,并通过跨语言互操作测试矩阵验证:
| 测试项 | Java → Go | Python → Java | Go → Python |
|---|---|---|---|
| TraceID传播 | ✅ | ✅ | ✅ |
| Baggage透传 | ✅ | ✅ | ✅ |
| W3C TraceContext兼容性 | ✅ | ✅ | ✅ |
可观测性协议的标准化博弈
OpenMetrics与Prometheus文本格式的兼容性争议持续三年,最终通过# TYPE metric_name counter语法扩展达成妥协。2024年Q1,Grafana Labs与Red Hat联合发布prom2openmetrics转换器,支持将旧版Exporter输出实时映射为OpenMetrics标准响应头,已部署于全球127家SaaS厂商的监控采集链路中。
企业级开源治理实践
某头部云厂商建立“双轨制”贡献模型:内部团队向上游提交安全补丁(如CVE-2024-23897修复),同时通过kubernetes-sigs/kubebuilder仓库发布企业定制插件(如aws-iam-annotator)。其贡献看板显示,2024年上半年向k8s主干提交PR 142个,合并率89%;衍生插件仓库Star数增长210%,形成正向反馈闭环。
模块化架构催生新协作范式
Kubernetes 1.30起启用--feature-gates=DynamicKubeletConfig=false,推动Kubelet配置从单体二进制转向独立Operator管理。社区孵化的kubelet-config-operator项目采用GitOps方式托管节点配置,其CRD定义被18家公有云厂商集成进安装脚本,配置变更审计日志自动同步至SIEM平台。
eBPF工具链的跨项目复用
libbpf-go库已成为Cilium、Falco、Pixie等项目的底层依赖。当libbpf-go v1.3.0修复bpf_map_update_elem内存越界漏洞时,上述三个项目均在24小时内发布热修复版本。这种“基础层漏洞→多项目同步响应”的机制,使平均修复窗口从72小时压缩至3.8小时。
社区基础设施的韧性建设
CNCF集群采用多云部署策略:CI节点分布在AWS us-east-1、Google Cloud us-central1及Azure eastus区域。当2024年3月AWS区域故障导致CI中断时,GitHub Actions自动将test-integration作业路由至GCP节点,构建成功率维持99.98%,未影响Kubernetes v1.31 Release Candidate发布节奏。
