CVSSv3 用の node.js モジュールを作ってみた

- [spiegel-im-spiegel/cvss3](https://github.com/spiegel-im-spiegel/cvss3)

とりあえず基本評価基準（Base Metrics）のみ実装。続きは後日。

## インストールと実行

[cvss3] の中身は単純なロジックのみなので特に依存パッケージはない。

```shell
C:>npm install cvss3
cvss3@0.0.1 node_modules\cvss3
```

動作確認用のコードはこんな感じ。

```javascript:app.js
var cvss3 = require('cvss3');

var vector_cve_2013_1937 = "AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N";
var base = (new cvss3.BaseMetrics()).importVector(vector_cve_2013_1937);
console.log('CVE-2013-1937 : Vector : '+base.getVector());
console.log('                Score  : '+base.getScore());
```

これを実行してこんな感じの結果が出れば OK。

```shell
C:>node app.js
CVE-2013-1937 : Vector : AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
                Score  : 6.1
```

## 参考にしたもの

いやぁ， [node.js] は他人様のを利用するばっかりで自分で書くことはほとんどないので，けっこう時間がかかってしまった。

以下，参考にしたもの。

### 行儀のよいコード？

- [最近の行儀のよい JavaScript の書き方 - Qiita](http://qiita.com/kaiinui/items/22a75d2adc56a40da7b7)
- [WebModulePattern · uupaa/WebModule Wiki](https://github.com/uupaa/WebModule/wiki/WebModulePattern)

モジュールの書き方には色々作法があるようで，今回は上記リンクの記事を参考にした。ただし， [node.js] 以外の環境ではまだ試していない。最低でもブラウザでクライアント側でちゃんと動作するかは確認する予定。

- [node.js の CVSS v3 モジュールを使ってデモページを作ってみた - Qiita](http://qiita.com/spiegel-im-spiegel/items/f2db3759b957206d4521)

### テストを書く

[mocha] と [should] でテスト・コードが書けるようだ。

- [node.jsのいろいろなモジュール22 – mochaでテストを書こう ｜ Developers.IO](http://dev.classmethod.jp/server-side/node-mocha/)
- [mocha - node.jsでこんなのもテストしたい!! という話 - Qiita](http://qiita.com/fnobi/items/14c9f298d88fc2a2e53d)

[mocha] では色々なことができるみたいだが，今回はロジックしかないのでごく簡単な機能のみ使っている。

```shell
C:>npm install -g mocha
C:\Users\username\AppData\Roaming\npm\_mocha -> C:\Users\username\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
C:\Users\username\AppData\Roaming\npm\mocha -> C:\Users\username\AppData\Roaming\npm\node_modules\mocha\bin\mocha
mocha@2.2.5 C:\Users\username\AppData\Roaming\npm\node_modules\mocha
├── escape-string-regexp@1.0.2
├── growl@1.8.1
├── commander@2.3.0
├── supports-color@1.2.1
├── diff@1.4.0
├── jade@0.26.3 (commander@0.6.1, mkdirp@0.3.0)
├── debug@2.0.0 (ms@0.6.2)
├── mkdirp@0.5.0 (minimist@0.0.8)
└── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)

C:>npm install should --save-dev
should@7.0.2 node_modules\should
├── should-type@0.2.0
├── should-equal@0.5.0
└── should-format@0.3.0

C:>mocha --reporter list
```

[Travis CI] と組み合わせるには以下のページが参考になる。まぁ `package.json` さえちゃんと書いておけば特にハマるところはない。

- [Node.js + Mocha + Travis CI + GitHub で快適ビルド環境 - Qiita](http://qiita.com/exKAZUu/items/7b482047da8d2af46787)

### npm に publish する

[npm] に publish には [npm] のアカウントを作る必要がある。アカウントを作ったら `npm` コマンドでアカウント情報を登録する。

```shell
C:>npm adduser
Username: username
Password:
Email: (this IS public) username@example.com
```

以後の作業は以下のページを参考にした。

- [node.jsモジュール作成と配布(npm) | Node.js技術](http://nodejs.osser.jp/npm/npm-publish/)
- [Node.js - 3分でできるnpmモジュール - Qiita](http://qiita.com/fnobi/items/f6b1574fb9f4518ed520)
- [3時間でできるnpmモジュール - Qiita](http://qiita.com/cognitom/items/75736e27cc7de151a7d5)

まぁ `package.json` さえちゃんと書いておけば...

### ライセンス

そうそう，ライセンスだけど，例によって CC0 にした（最近書いてるコードはほぼ CC0 で公開している）。 CVSS のロジックをどうやって実装するか，その実証コードみたいなものなので，権利は特に主張しません。利用したいという奇特な方がいらっしゃるならご自由にどうぞ。

`package.json` で記述できるライセンスは以下が参考になる。

- [SPDX License List | SPDX](http://spdx.org/spdx-license-list)
	- [SPDX License List](http://spdx.org/licenses/)

## 参考

- [Common Vulnerability Scoring System (CVSS-SIG)](http://www.first.org/cvss)
    - [CVSS v3.0 User Guide](http://www.first.org/cvss/user-guide)
    - [CVSS v3.0 Specification Document](http://www.first.org/cvss/specification-document)
    - [CVSS v3.0 Calculator](http://www.first.org/cvss/calculator/3.0)
- [共通脆弱性評価システムCVSS v3概説：IPA 独立行政法人 情報処理推進機構](http://www.ipa.go.jp/security/vuln/CVSSv3.html)
- [CVSS に関するメモ — Baldanders.info](http://www.baldanders.info/spiegel/log2/000290.shtml)
- [CVSS に関するメモ 2 — Baldanders.info](http://www.baldanders.info/spiegel/log2/000334.shtml)
- [CVSS に関するメモ 3 — Baldanders.info](http://www.baldanders.info/spiegel/log2/000864.shtml)
- [Demo for CVSS](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)

[cvss3]: https://github.com/spiegel-im-spiegel/cvss3
[node.js]: https://nodejs.org/ "Node.js"
[mocha]: http://mochajs.org/ "Mocha - the fun, simple, flexible JavaScript test framework"
[should]: https://www.npmjs.com/package/should "should"
[Travis CI]: https://travis-ci.org/ "Travis CI - Test and Deploy Your Code with Confidence"
[npm]: https://www.npmjs.com/ "npm"