node.js systeminformation 「CVE-2021-21315」 再現した

脆弱性一覧を見ていたら気になったものがあったので再現してみました。



※この記事で知り得たことを悪用することは禁止とします。

systeminfomationとは?

node.jsのライブラリで、OSの情報を取得するライブラリです。

脆弱なバージョン

5.3.1未満

脆弱性について

パラメータを配列化すると、特殊文字の無効化がされなくなり、リモートでOSコマンドの実行が可能です。

対策

5.3.1以上にアップデートすることです。
5.3.1以降のバージョンでも他にもセキュリティ面での修正などがありますので、最新版にアップデートすることが推奨されます。
www.npmjs.com

アップデートできない時の緩和策としては、以下関数にユーザ入力値を渡す際に特殊文字の無効化を実施することとなります。

si.inetLatency(), si.inetChecksite(), si.services(), si.processLoad()

cve.mitre.org

再現

※検証はローカルで行っています
検証のために使用したソースコードです。

const http = require('http');
const si = require('systeminformation');
var express = require('express');
var app = express();
const port = 8000;
app.get('/api/services', (req, res) => {
const queryData = req.query.name
si.services(queryData).then((data) => {
res.json(data);
});
});
});
app.listen(port, () => console.log('Active'))

修正前

代表としてservices関数を使います。

他の関数も実行の方法は同じでした。

通常使用です。

脆弱性を使用してみます。
攻撃コードが丸見えになってしまうため隠しています。

httpリクエストを送信するコマンドを使用していました。
burpコラボレーターにアクセスが来ていることが確認できます。

修正後

脆弱性を使用してみます。
結果そのものが取得できなくなりました。

burpコラボレーターにもアクセスが来ていません。

この脆弱性から得られること

攻撃側(脆弱性診断士など)

パラメータを配列化することによって変化する挙動を確認する。

防御側(開発者など)

通常時に渡される値だけではなく、イレギュラー時に渡される値も考慮する。

参考

修正コード

おわりに

systeminformationの「CVE-2021-21315」でした。

配列化するのとしないのでなんで挙動が変わるのか調べましたが、全くわかりませんでした。

「何がわからないのがわからない」状態だったので諦めましたが、悔しかったですね。

今回の検証から得られることは多かったので、やってよかったです。

広告
広告
この記事を書いた人
脆弱性を見つける仕事をしています。 Twitter https://twitter.com/Nick_nick310
SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です