Debian CVE Tracker 上记录了很多安全漏洞,有些 Debian
会在当前版本修复,但有些不会。由于 deepin
会在当前版本上停留很久,所以需要修复这些安全漏洞。
这就需要自行追踪 CVE Bug
的状态和添加 patch
,因此写了个程序 deepin-cve-tracker 来管理。
本文将介绍 deepin-cve-tracker
的使用方法和 patch
的添加方法。
deepin-cve-tracker
设计用来追踪 Debain CVE Bug
,会先将 Debian
中的数据爬入自己的数据库中,然后做标记来追踪 bug
的处理状态。
提供 HTTP
接口供用户使用,使用 docker
部署。
因为需要导入 Debian CVE Tracker
的数据,所以这里先介绍下。 Debian
中 Bug
标记有严重级别(urgency
),每种级别下又有 scope
标记。
high_urgency
: 高级medium_urgency
: 中级low_urgency
: 低级unimportant_urgency
: 不重要unassigned_urgency
: 未指派endoflife_urgency
: 已终止
remote
: 隐藏remote
为yes
的bug
locale
: 隐藏remote
为no
的bug
unclear
: 隐藏remote
为?
的bug
undetermined_issues
: 显示未检测的bug
nodsa
: 显示未公布的bug
noignored
: 显示忽略的bug
nopostponed
: 显示推迟的bug
结构如下:
CREATE TABLE IF NOT EXISTS "packages" (
"package" varchar(255),
"source" varchar(255),
"version" varchar(255),
"architecture" varchar(255),
"source_version" varchar(255) ,
PRIMARY KEY ("package"));
结构如下:
CREATE TABLE IF NOT EXISTS "cves" (
"id" varchar(255),
"package" varchar(255),
"urgency" varchar(255),
"remote" varchar(255),
"status" varchar(255),
"patch" varchar(255),
"description" varchar(255),
"pre_installed" bool,
"archived" bool,
"created_at" datetime,
"updated_at" datetime,
"deleted_at" datetime ,
PRIMARY KEY ("id"));
status
的可用值为:
unprocessed
: 还未处理的bug
,默认状态processing
: 已处理但未完成的bug
,原因可能是没有提交或者提交的改动太大,等待之后继续处理postpone
: 延后处理,一般不可重现但有patch
或者可重现但无patch
时标记为此状态hold
: 搁置,一般可重现但无patch
时标记为此状态canceled
: 尝试各种测试方法均为未重现的bug
fixed
: 已添加了patch
的bug
GET /v0/logs
POST /v0/session/login
DELETE /v0/session/logout
GET /v0/cves/:version
GET /v0/cves/:version/:id
PATCH /v0/cves/:version/:id
POST /v0/versions
GET /v0/versions
GET /v0/versions/:version
PATCH /v0/versions/:version
DELETE /v0/versions/:version
POST /v0/tools/debian/:version
POST /v0/tools/package/:version
其中除了 GET
接口不需要 token
,其它接口都需要在 HTTP Header
中设置 Access-Token
, token
通过 LDAP
登录后获取。
接口中的 id
指 CVE Bug
的 id
,如: CVE-2018-14404
, PATCH/POST
请求的数据为 JSON
格式,需要在 HTTP Header
中设置 Content-Type:application/json
。
version
为 deepin
的版本,如 15.5sp2
, v20
等。
下面将简单描述每个接口的功能:
获取操作日志,可用的查询参数为: operator
和 target
。
operator
: 用户名target
: 只可为version
或者cve id
如查询用户 deepin
对 v20
的操作记录:
curl -X GET -H 'Content-Type:application/json' <host>/v0/logs?operator=deepin&target=v20
登录,需要在 body
中传入 username
和 password
,如:
curl -X POST -H 'Content-Type:application/json' <host>/v0/session/login -d '{"username:"deepin","password":"123456"}'
登录成功后会在响应头中设置 Access-Token
。
注销,需要在头部设置 Access-Token
。
获取 CVE Bug
列表,默认返回第一页的数据,每页数据的大小为 15
可用的查询参数为: package, remote, pre_installed, archived, page, count, sort, status, filters
,说明如下:
package
: 源码包名remote
: 是否为远程漏洞,值可为:yes, no, ?
pre_installed
:ISO
中是否预装archived
: 是否已归档,当bug
在package
更新后验证通过,则将其归档page
: 当前页count
: 每页的数据大小sort
: 排序字段,默认升序,如果传入的是updated_at
则降序,可用字段为cves
表中的所有字段status
: 当前bug
的状态,可设置多个值,以,
分割filters
: 当前bug
的urgency
,可设置多个值,以,
分割
接口返回时会在 Response Header
中设置以下值:
X-Current-Page
: 当前页面X-Resource-Total
: 当前查询参数下的结果总数X-Page-Size
: 当前每页显示的大小
这里给出几个例子:
- 查询
v20
中状态为fixed
和cancelled
的bug
curl -X GET -H 'Content-Type:application/json' <host>/v0/cves/v20?status=fixed,cancelled
- 查询
v20
中urgency
为high_urgency
和medium_urgency
并且预装的bug
curl -X GET -H 'Content-Type:application/json' <host>/v0/cves/v20?pre_installed=true&filters=high_urgency,medium_urgency
查询指定 version
中 CVE Bug ID
的信息
修改指定 version
中 CVE Bug ID
的信息
添加新版本,如 v15.5sp2
:
curl -X POST -H 'Content-Type:application/json' -H 'Access-Token:<token>' <host>/v0/versions \
-d '{"version":"v15.5sp2","debian_version":"stretch","tracker_url":"https://security-tracker.debian.org/tracker", "release_tracker":"https://security-tracker.debian.org/tracker/status/release/oldstable", "debian_seq":9}'
获取列表
获取指定 version
的信息
修改指定 version
的信息
导入 Debian CVE Tracker
上的 bug
,如导入 buster
中全部的高级 bug
:
curl -X POST -H 'Content-Type:application/json' -H 'Access-Token:<token>' \
<host>/v0/tools/debian/v20?filters=high_urgency,undetermined_issues,nodsa,noignored,nopostponed=
初始化时应导入全部的 bug
。
初始化预装的安装包信息,需要上传包列表文件。
预装包信息由命令 dpkg-query -f '${Package},${Architecture},${Version},${Source}\n' -W> packages.list
生成。
如初始化 v20
的预装包数据:
curl -H 'Access-Token:<token>' <host>/v0/tools/package/v20 -F 'packages=@./packages.list'
详细的流程参见: 安全更新流程 。
对 bug
打 patch
时请按照以下步骤操作:
- 安装
package
的编译依赖sudo apt-get build-dep <package>
- 下载源码
apt-get source <package>
- 清理源码包
清理应用的
patch
:quilt pop -af
,有些package
不是直接使用patch
而是自行处理的,在debian/rules
中会指明。 如python2.7
就需要使用./debian/rules unpatch
来清理。清理编译残留的文件 :
./debian/rules clean
- 初始化
git init && git add . && git commit -m "Init"
- 切换分支开始
patch
以
CVE Bug ID
创建新分支git checkout -b cve/<id>
,然后应用之前的patch
:dpkg-source -b ./
, 同样有些packages
是在debian/rules
指定了patch
应用方法,如python2.7
就是./debian/rules update-patches
应用完
patch
后执行git add .
,此时就准备好了源码环境,执行patch -p1 < <CVE Bug ID>.diff
来应用,最后编译测试bug
是否解决。测试无误后就清除所有修改的文件,删除此分支,并切会
master
。 - 提交
patch
在
debian/patches/
目录以<CVE Bug ID>.patch
为名创建patch
,并修改debian/patches/series
文件添加此patch
。然后提交
git add . && git commit -m "patch: <CVE Bug ID>"
对于已在 debian-patch 创建了的 package
则直接 clone
然后打 patch
。
对于 github/gitlab
上的提交,可在其提交的 url
的后面加上 .diff
来获取 diff
文件,添加 .patch
来获取 patch
文件。
最后提供一份简单的 patch
模板:
From: the author for this patch
Subject: the patch summary
Origin: the upstream commit or the patch source
Some descriptions
Bug: the bug in this project
Bug-Debian: the bug in debian
Last-Update: 2019-08-12
---
diff info