go-cvss パッケージ v1.4.2 をリリースした

no extension

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:H1 など)のバリデーションを厳密に行うようにした。 今までベクタ文字列の 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 をリリースした

またバグ報告があったので修正版をリリースした。 とほほ…

今回のついでにスコアの計算周りのリファクタリングを行った。 ちょっとスッキリ!

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)

photo
初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
Jon Bodner (著), 武舎 広幸 (翻訳)
オライリージャパン 2022-09-26
単行本(ソフトカバー)
4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
評価     

2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。

reviewed by Spiegel on 2022-10-11 (powered by PA-APIv5)

photo
実用 Go言語 ―システム開発の現場で知っておきたいアドバイス
渋川 よしき (著), 辻 大志郎 (著), 真野 隼記 (著)
オライリージャパン 2022-04-22
単行本(ソフトカバー)
4873119693 (ASIN), 9784873119694 (EAN), 4873119693 (ISBN)
評価     

版元のデジタル版を購入。 Go で躓きやすい点を解説していくのが最初の動機らしい。「◯◯するには」を調べる際にこの本を調べるといいかも。

reviewed by Spiegel on 2022-10-26 (powered by PA-APIv5)