From ac23afd6e685093662bac3d0fa12b0cafe254244 Mon Sep 17 00:00:00 2001
From: xwzQmxx <1499273991@qq.com>
Date: Mon, 9 May 2022 18:58:12 +0800
Subject: [PATCH 1/2] support display hole patch
---
cve-vulner-manager/common/common.go | 11 +++-
cve-vulner-manager/controllers/upload.go | 4 +-
cve-vulner-manager/models/modeldb.go | 13 +++-
cve-vulner-manager/models/uploadcve.go | 65 ++++++++++++++++++-
cve-vulner-manager/taskhandler/common.go | 79 ++++++++++++++++++++----
5 files changed, 155 insertions(+), 17 deletions(-)
diff --git a/cve-vulner-manager/common/common.go b/cve-vulner-manager/common/common.go
index 318c934..64d58e5 100644
--- a/cve-vulner-manager/common/common.go
+++ b/cve-vulner-manager/common/common.go
@@ -343,6 +343,7 @@ type CveOriginData struct {
FixSuggest CveFixSuggest `json:"fixSuggest"`
Version string `json:"version"`
Credibility int `json:"credibility"`
+ Patch []CveOriginPatch `json:"patch"`
}
type UploadData struct {
@@ -369,6 +370,14 @@ type CveOriginDetailData struct {
FixSuggest CveFixSuggest `json:"fixSuggest"`
}
+type CveOriginPatch struct {
+ Package string `json:"package"`
+ FixVersion string `json:"fixversion"`
+ FixPatch string `json:"fix_patch"`
+ BreakPatch string `json:"break_patch"`
+ Source string `json:"source"`
+}
+
func GetRepoOrg() (string, error) {
BConfig, err := config.NewConfig("ini", "conf/app.conf")
if err != nil {
@@ -474,7 +483,7 @@ func SliceRemoveDup(req interface{}) (ret []interface{}) {
}
value := reflect.ValueOf(req)
for i := 0; i < value.Len(); i++ {
- if i > 0 && reflect.DeepEqual(value.Index(i - 1).Interface(), value.Index(i).Interface()) {
+ if i > 0 && reflect.DeepEqual(value.Index(i-1).Interface(), value.Index(i).Interface()) {
continue
}
ret = append(ret, value.Index(i).Interface())
diff --git a/cve-vulner-manager/controllers/upload.go b/cve-vulner-manager/controllers/upload.go
index 48e9fac..35c40eb 100644
--- a/cve-vulner-manager/controllers/upload.go
+++ b/cve-vulner-manager/controllers/upload.go
@@ -164,7 +164,7 @@ func (u *UserUploadController) Post() {
return
}
//Judge whether it is legal
- if uploaddata.Token == "" {
+ /*if uploaddata.Token == "" {
resp["errno"] = errcode.RecodeSessionErr
resp["errmsg"] = errcode.RecodeText(errcode.RecodeSessionErr)
resp["body"] = []ResultData{}
@@ -182,7 +182,7 @@ func (u *UserUploadController) Post() {
u.RetData(resp)
return
}
- }
+ }*/
if uploaddata.CveData == nil || len(uploaddata.CveData) == 0 {
resp["errno"] = errcode.RecodeNodata
resp["errmsg"] = errcode.RecodeText(errcode.RecodeNodata)
diff --git a/cve-vulner-manager/models/modeldb.go b/cve-vulner-manager/models/modeldb.go
index 154a222..228bee4 100644
--- a/cve-vulner-manager/models/modeldb.go
+++ b/cve-vulner-manager/models/modeldb.go
@@ -391,6 +391,17 @@ type OriginUpstreamImpact struct {
Impact string `orm:"size(32);column(impact);null" description:"包含v2,v3评分数据"`
}
+type OriginUpstreamPatch struct {
+ ID int64 `orm:"PK;auto;column(id)"`
+ OID string `orm:"size(256);column(o_id)" description:"OriginUpstream 外键"`
+ CveNum string `orm:"size(256);column(cve_num);index" description:"cve编号"`
+ Package string `orm:"size(256);column(package)" description:"影响的软件包"`
+ FixVersion string `orm:"size(64);column(fix_version)" description:"修复版本"`
+ FixPatch string `orm:"size(256);column(fix_patch)" description:"修复补丁"`
+ BreakPatch string `orm:"size(256);column(break_patch)" description:"问题引入补丁"`
+ Source string `orm:"size(64);column(source)" description:"来源"`
+}
+
type OriginUpstreamImpactScore struct {
ScoreId int64 `orm:"pk;auto;column(score_id)"`
ImpactId int64 `orm:"index;column(impact_id)" description:"OriginUpstreamImpact 外键"`
@@ -1054,7 +1065,7 @@ func CreateDb() bool {
new(MindSporeBrandTags), new(OriginUpstreamRecord),
new(OpenLookengSecurityReviewer), new(OpenLookengYaml),
new(IssueCommunityStatistics), new(CommunityYamlConfig),
- new(IssueDeleteRecord), new(AuthTokenInfo),
+ new(IssueDeleteRecord), new(AuthTokenInfo), new(OriginUpstreamPatch),
)
logs.Info("table create success!")
errosyn := orm.RunSyncdb("default", false, true)
diff --git a/cve-vulner-manager/models/uploadcve.go b/cve-vulner-manager/models/uploadcve.go
index c870a53..0deeb2f 100644
--- a/cve-vulner-manager/models/uploadcve.go
+++ b/cve-vulner-manager/models/uploadcve.go
@@ -73,7 +73,7 @@ func QueryOriginRepo(pkgName string) (GiteRepo, bool) {
}
}
-func QueryOrgAllRepo(org string) ([]GiteRepo) {
+func QueryOrgAllRepo(org string) []GiteRepo {
o := orm.NewOrm()
var gr []GiteRepo
num, err := o.Raw("select * from cve_gite_repo where org_path = ? and status = ?", org, 0).QueryRows(&gr)
@@ -228,6 +228,7 @@ func CreateOriginCve(CveData common.CveOriginData, ou *OriginUpstream, od *Origi
o.Rollback()
return 0, err
}
+
od.CveId = num
lod := OriginUpstreamDesc{CveId: num}
o.Delete(&lod, "CveId")
@@ -238,6 +239,11 @@ func CreateOriginCve(CveData common.CveOriginData, ou *OriginUpstream, od *Origi
o.Rollback()
return 0, err
}
+
+ if err := resetOriginPatch(&CveData, o, ou.Ids); err != nil {
+ logs.Error("reset origin patch fail", err)
+ }
+
ous.CveId = num
lous := OriginUpstreamConfig{CveId: num}
err := o.Read(&lous, "CveId")
@@ -591,6 +597,11 @@ func CreateOriginCve(CveData common.CveOriginData, ou *OriginUpstream, od *Origi
o.Rollback()
return 0, err
}
+
+ if err := resetOriginPatch(&CveData, o, ou.Ids); err != nil {
+ logs.Error("reset origin patch fail", err)
+ }
+
num := ouse.CveId
od.CveId = num
lod := OriginUpstreamDesc{CveId: num}
@@ -947,6 +958,58 @@ func CreateOriginCve(CveData common.CveOriginData, ou *OriginUpstream, od *Origi
return 0, nil
}
+func resetOriginPatch(cveData *common.CveOriginData, o orm.Ormer, oid string) error {
+ if cveData == nil {
+ return nil
+ }
+
+ delPatch := &OriginUpstreamPatch{OID: oid, CveNum: cveData.CveNum}
+ _, _ = o.Delete(delPatch, "o_id", "cve_num")
+
+ if cveData.UpdateType == "delete" {
+ return nil
+ }
+
+ var patches []OriginUpstreamPatch
+ for _, v := range cveData.Patch {
+ patches = append(patches, OriginUpstreamPatch{
+ OID: oid,
+ CveNum: cveData.CveNum,
+ Package: v.Package,
+ FixVersion: v.FixVersion,
+ FixPatch: v.FixPatch,
+ BreakPatch: v.BreakPatch,
+ Source: v.Source,
+ })
+ }
+
+ bulk := len(patches)
+ if len(patches) == 0 {
+ return nil
+ }
+
+ _, err := o.InsertMulti(bulk, patches)
+
+ return err
+}
+
+func QueryCveOriginPatchInfo(cveNum string) ([]OriginUpstreamPatch, error) {
+ if cveNum == "" {
+ return nil, nil
+ }
+
+ sql := "select package,fix_version,fix_patch,break_patch,source from cve_origin_upstream_patch where o_id = ?"
+ o := orm.NewOrm()
+ var res []OriginUpstreamPatch
+
+ _, err := o.Raw(sql, cveNum).QueryRows(&res)
+ if err != nil {
+ return nil, err
+ }
+
+ return res, nil
+}
+
func QueryCveErrorInfo(issueStatus int8, startDate, endDate string) ([]IssueTemplate, bool) {
o := orm.NewOrm()
var it []IssueTemplate
diff --git a/cve-vulner-manager/taskhandler/common.go b/cve-vulner-manager/taskhandler/common.go
index 2139195..649b5e8 100644
--- a/cve-vulner-manager/taskhandler/common.go
+++ b/cve-vulner-manager/taskhandler/common.go
@@ -57,6 +57,9 @@ const bodyTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
+
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -85,6 +88,8 @@ const bodyUpTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -113,6 +118,8 @@ const bodySecLinkTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -168,6 +175,8 @@ const gaussBodyTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -194,6 +203,8 @@ const SporeBodyTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -220,6 +231,8 @@ const gaussBodyUpTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -247,6 +260,8 @@ const SporeBodyUpTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -273,6 +288,8 @@ const LooKengBodyTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -298,6 +315,8 @@ const LooKengBodyUpTpl = `一、漏洞信息
%v
漏洞数据来源:
%v
+ 漏洞补丁信息:
+ %s
二、漏洞分析结构反馈
影响性分析说明:
%v
@@ -945,16 +964,16 @@ func CreateIssueBody(accessToken, owner, path, assignee string,
if its.Status == 3 && len(its.SecLink) > 3 && cve.OrganizationID == 1 {
body = fmt.Sprintf(bodySecLinkTpl, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion, its.SecLink)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion, its.SecLink)
} else {
if cve.OrganizationID == 1 {
body = fmt.Sprintf(bodyUpTplx, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion)
} else {
body = fmt.Sprintf(bodyUpTplx, cveNumber, cveRepo, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion)
}
}
requestBody = fmt.Sprintf(`{
@@ -975,11 +994,11 @@ func CreateIssueBody(accessToken, owner, path, assignee string,
if cve.OrganizationID == 1 {
body = fmt.Sprintf(bodyTplx, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion, abiVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion, abiVersion)
} else {
body = fmt.Sprintf(bodyTplx, cveNumber, cveRepo, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion)
}
requestBody = fmt.Sprintf(`{
"access_token": "%s",
@@ -1000,11 +1019,11 @@ func CreateIssueBody(accessToken, owner, path, assignee string,
if cve.OrganizationID == 1 {
body = fmt.Sprintf(bodyTplx, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion, abiVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion, abiVersion)
} else {
body = fmt.Sprintf(bodyTplx, cveNumber, cveRepo, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion)
}
requestBody = fmt.Sprintf(`{
"access_token": "%s",
@@ -1025,16 +1044,16 @@ func CreateIssueBody(accessToken, owner, path, assignee string,
if its.Status == 3 && len(its.SecLink) > 3 && cve.OrganizationID == 1 {
body = fmt.Sprintf(bodySecLinkTpl, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion, its.SecLink)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion, its.SecLink)
} else {
if cve.OrganizationID == 1 {
body = fmt.Sprintf(bodyUpTplx, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion, abiVersion)
} else {
body = fmt.Sprintf(bodyUpTplx, cveNumber, cveRepo, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, oVector, affectedVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, oVector, affectedVersion)
}
}
requestBody = fmt.Sprintf(`{
@@ -1055,11 +1074,11 @@ func CreateIssueBody(accessToken, owner, path, assignee string,
if cve.OrganizationID == 1 {
body = fmt.Sprintf(bodyTplx, cveNumber, cvePkg, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion, abiVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion, abiVersion)
} else {
body = fmt.Sprintf(bodyTplx, cveNumber, cveRepo, cve.CveVersion, scoreType, nveScore, nveVector,
cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, holeSource(cve.DataSource),
- cveAnalysis, openEulerScore, affectedVersion)
+ genPatchInfo(cve.CveNum), cveAnalysis, openEulerScore, affectedVersion)
}
requestBody = fmt.Sprintf(`{
"access_token": "%s",
@@ -1084,6 +1103,42 @@ func holeSource(sourceCode int8) string {
return "其它"
}
+func genPatchInfo(cveNum string) string {
+ tpl := `
+详情
+
+%s
+ `
+
+ info, err := models.QueryCveOriginPatchInfo(cveNum)
+ if err != nil {
+ logs.Error("QueryCveOriginPatchInfo error: ", err)
+ }
+
+ content := genPathInfoContent(info)
+
+ return fmt.Sprintf(tpl, content)
+}
+
+func genPathInfoContent(info []models.OriginUpstreamPatch) string {
+ if len(info) == 0 {
+ return "无"
+ }
+
+ th := `| 影响的包 | 修复版本 | 修复补丁 | 问题引入补丁 | 来源 |
+| ------- | -------- | ------- | -------- | --------- |
+`
+ tc := `| %s | %s | %s | %s | %s |
+`
+
+ table := th
+ for _, v := range info {
+ table = table + fmt.Sprintf(tc, v.Package, v.FixVersion, v.FixPatch, v.BreakPatch, v.Source)
+ }
+
+ return table
+}
+
func AffectVersion(affectedVersion string) int {
affectBranchsxList := make([]string, 0)
affectValue := make([]string, 0)
--
Gitee
From e5755b803c2aeeb4b837bc098bdcc19d9871746b Mon Sep 17 00:00:00 2001
From: xwzQmxx <1499273991@qq.com>
Date: Tue, 17 May 2022 09:57:51 +0800
Subject: [PATCH 2/2] fix review
---
cve-vulner-manager/controllers/upload.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cve-vulner-manager/controllers/upload.go b/cve-vulner-manager/controllers/upload.go
index 35c40eb..48e9fac 100644
--- a/cve-vulner-manager/controllers/upload.go
+++ b/cve-vulner-manager/controllers/upload.go
@@ -164,7 +164,7 @@ func (u *UserUploadController) Post() {
return
}
//Judge whether it is legal
- /*if uploaddata.Token == "" {
+ if uploaddata.Token == "" {
resp["errno"] = errcode.RecodeSessionErr
resp["errmsg"] = errcode.RecodeText(errcode.RecodeSessionErr)
resp["body"] = []ResultData{}
@@ -182,7 +182,7 @@ func (u *UserUploadController) Post() {
u.RetData(resp)
return
}
- }*/
+ }
if uploaddata.CveData == nil || len(uploaddata.CveData) == 0 {
resp["errno"] = errcode.RecodeNodata
resp["errmsg"] = errcode.RecodeText(errcode.RecodeNodata)
--
Gitee