Skip to content

kyrie-z/tracker

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Debian CVE Tracker

Debian CVE Tracker 上记录了很多安全漏洞,有些 Debian 会在当前版本修复,但有些不会。由于 deepin 会在当前版本上停留很久,所以需要修复这些安全漏洞。 这就需要自行追踪 CVE Bug 的状态和添加 patch ,因此写了个程序 deepin-cve-tracker 来管理。

本文将介绍 deepin-cve-tracker 的使用方法和 patch 的添加方法。

Deepin CVE Tracker

deepin-cve-tracker 设计用来追踪 Debain CVE Bug ,会先将 Debian 中的数据爬入自己的数据库中,然后做标记来追踪 bug 的处理状态。 提供 HTTP 接口供用户使用,使用 docker 部署。

核心数据接口

Bug Filters

因为需要导入 Debian CVE Tracker 的数据,所以这里先介绍下。 DebianBug 标记有严重级别(urgency),每种级别下又有 scope 标记。

urgency

  • high_urgency : 高级
  • medium_urgency : 中级
  • low_urgency : 低级
  • unimportant_urgency : 不重要
  • unassigned_urgency : 未指派
  • endoflife_urgency : 已终止

scope

  • remote : 隐藏 remoteyesbug
  • locale : 隐藏 remotenobug
  • unclear : 隐藏 remote?bug
  • undetermined_issues : 显示未检测的 bug
  • nodsa : 显示未公布的 bug
  • noignored : 显示忽略的 bug
  • nopostponed : 显示推迟的 bug

packages

结构如下:

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"));

cves

结构如下:

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 : 已添加了 patchbug

接口

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-Tokentoken 通过 LDAP 登录后获取。

接口中的 idCVE Bugid ,如: CVE-2018-14404PATCH/POST 请求的数据为 JSON 格式,需要在 HTTP Header 中设置 Content-Type:application/json

versiondeepin 的版本,如 15.5sp2v20 等。

下面将简单描述每个接口的功能:

GET /v0/logs

获取操作日志,可用的查询参数为: operatortarget

  • operator : 用户名
  • target : 只可为 version 或者 cve id

如查询用户 deepinv20 的操作记录:

curl -X GET  -H 'Content-Type:application/json' <host>/v0/logs?operator=deepin&target=v20

POST /v0/session/login

登录,需要在 body 中传入 usernamepassword ,如:

curl -X POST -H 'Content-Type:application/json' <host>/v0/session/login -d '{"username:"deepin","password":"123456"}'

登录成功后会在响应头中设置 Access-Token

DELETE /v0/session/logout

注销,需要在头部设置 Access-Token

GET /v0/cves/:version

获取 CVE Bug 列表,默认返回第一页的数据,每页数据的大小为 15

可用的查询参数为: package, remote, pre_installed, archived, page, count, sort, status, filters ,说明如下:

  • package : 源码包名
  • remote : 是否为远程漏洞,值可为: yes, no, ?
  • pre_installed : ISO 中是否预装
  • archived : 是否已归档,当 bugpackage 更新后验证通过,则将其归档
  • page : 当前页
  • count : 每页的数据大小
  • sort : 排序字段,默认升序,如果传入的是 updated_at 则降序,可用字段为 cves 表中的所有字段
  • status : 当前 bug 的状态,可设置多个值,以 , 分割
  • filters : 当前 bugurgency ,可设置多个值,以 , 分割

接口返回时会在 Response Header 中设置以下值:

  • X-Current-Page : 当前页面
  • X-Resource-Total : 当前查询参数下的结果总数
  • X-Page-Size : 当前每页显示的大小

这里给出几个例子:

  • 查询 v20 中状态为 fixedcancelledbug

    curl -X GET -H 'Content-Type:application/json' <host>/v0/cves/v20?status=fixed,cancelled

  • 查询 v20urgencyhigh_urgencymedium_urgency 并且预装的 bug

    curl -X GET -H 'Content-Type:application/json' <host>/v0/cves/v20?pre_installed=true&filters=high_urgency,medium_urgency

GET /v0/cves/:version/:id

查询指定 versionCVE Bug ID 的信息

PATCH /v0/cves/:version/:id

修改指定 versionCVE Bug ID 的信息

POST /v0/versions

添加新版本,如 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}'

GET /v0/versions

获取列表

GET /v0/versions/:version

获取指定 version 的信息

PATCH /v0/versions/:version

修改指定 version 的信息

PATCH /v0/tools/debian/: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

PATCH /v0/tools/package/:version

初始化预装的安装包信息,需要上传包列表文件。

预装包信息由命令 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'

PATCH

详细的流程参见: 安全更新流程

bugpatch 时请按照以下步骤操作:

  1. 安装 package 的编译依赖

    sudo apt-get build-dep <package>

  2. 下载源码

    apt-get source <package>

  3. 清理源码包

    清理应用的 patch : quilt pop -af ,有些 package 不是直接使用 patch 而是自行处理的,在 debian/rules 中会指明。 如 python2.7 就需要使用 ./debian/rules unpatch 来清理。

    清理编译残留的文件 : ./debian/rules clean

  4. 初始化

    git init && git add . && git commit -m "Init"

  5. 切换分支开始 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

  6. 提交 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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 98.0%
  • Dockerfile 1.4%
  • Makefile 0.6%