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的buglocale: 隐藏remote为no的bugunclear: 隐藏remote为?的bugundetermined_issues: 显示未检测的bugnodsa: 显示未公布的bugnoignored: 显示忽略的bugnopostponed: 显示推迟的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: 尝试各种测试方法均为未重现的bugfixed: 已添加了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的bugcurl -X GET -H 'Content-Type:application/json' <host>/v0/cves/v20?status=fixed,cancelled - 查询
v20中urgency为high_urgency和medium_urgency并且预装的bugcurl -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