go-cvss パッケージ v1.4.2 をリリースした
CVSS ベクタ文字列を可視化したいという軽い動機で作った,拙作の github.com/goark/go-cvss
パッケージだが,微妙に使って頂いてるようで,バグ報告をいくつか頂いたため,修正版をリリースした。
CVSS のベクタ文字列(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
1 など)のバリデーションを厳密に行うようにした。
今までベクタ文字列の parse はかなり緩くしていて, metric 名が重複してても(後勝ちで)有効にしてたし,大文字小文字も関係なく有効にしていたが,仕様的にあかんやろ,ということで。
これに伴い,古いコードは drop した(コード管理が煩雑になるので)。
使い方は今までと変わらず
package main
import (
"flag"
"fmt"
"io"
"os"
"github.com/goark/go-cvss/v3/metric"
"github.com/goark/go-cvss/v3/report"
"golang.org/x/text/language"
)
var template = "- `{{ .Vector }}`" + `
- {{ .SeverityName }}: {{ .SeverityValue }} (Score: {{ .BaseScore }})
| {{ .BaseMetrics }} | {{ .BaseMetricValue }} |
|--------|-------|
| {{ .AVName }} | {{ .AVValue }} |
| {{ .ACName }} | {{ .ACValue }} |
| {{ .PRName }} | {{ .PRValue }} |
| {{ .UIName }} | {{ .UIValue }} |
| {{ .SName }} | {{ .SValue }} |
| {{ .CName }} | {{ .CValue }} |
| {{ .IName }} | {{ .IValue }} |
| {{ .AName }} | {{ .AValue }} |
`
func main() {
flag.Parse()
if flag.NArg() < 1 {
fmt.Fprintln(os.Stderr, "Set CVSS vector")
return
}
bm, err := metric.NewBase().Decode(flag.Arg(0))
if err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
return
}
r, err := report.NewBase(bm, report.WithOptionsLanguage(language.Japanese)).ExportWithString(template)
if err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
return
}
if _, err := io.Copy(os.Stdout, r); err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
}
}
などとしておけば
$ go run main.go "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
- `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`
- 深刻度: 緊急 (Score: 9.8)
| 基本評価基準 | 評価値 |
|--------|-------|
| 攻撃元区分 | ネットワーク |
| 攻撃条件の複雑さ | 低 |
| 必要な特権レベル | 不要 |
| ユーザ関与レベル | 不要 |
| スコープ | 変更なし |
| 機密性への影響 | 高 |
| 完全性への影響 | 高 |
| 可用性への影響 | 高 |
と出力される。
この github.com/goark/go-cvss
パッケージってコードの半分くらい貰いものだし,さらに今回は fuzzing テストまでしてもらって,ホンマに「マジすんません」って感じである。ありがたや 🙇
でも CVSS ってあくまでもリスクの「評価基準」のひとつであって,そこから「どうする」ってのはまた別の話なんだよね。 個人なら CVSS の Base metrics 情報を見て都度判断すればいいけど,組織では SSVC (Stakeholder-Specific Vulnerability Categorization) なんかと組み合わせる必要があるかもしれない。
道具は適材適所で使いましょう,ということで。
【2022-01-29 追記】 v1.4.4 をリリースした
またバグ報告があったので修正版をリリースした。 とほほ…
今回のついでにスコアの計算周りのリファクタリングを行った。 ちょっとスッキリ!
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
- Jon Bodner (著), 武舎 広幸 (翻訳)
- オライリージャパン 2022-09-26
- 単行本(ソフトカバー)
- 4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
- 評価
2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。
- 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス
- 渋川 よしき (著), 辻 大志郎 (著), 真野 隼記 (著)
- オライリージャパン 2022-04-22
- 単行本(ソフトカバー)
- 4873119693 (ASIN), 9784873119694 (EAN), 4873119693 (ISBN)
- 評価
版元のデジタル版を購入。 Go で躓きやすい点を解説していくのが最初の動機らしい。「◯◯するには」を調べる際にこの本を調べるといいかも。
-
CVE-2022-3515 より ↩︎