JavaScript Injection
次に示す関数を不適切に利用すると攻撃者が任意のコードを実行できます。
第一引数に文字列を指定することができますが、セキュリティ上問題があります
Node.jsでは文字列を指定しても動かないようになっています
node:vm モジュールの関数群
例
code: calc.js
const { Client } = require("discord.js");
const client = new Client({
allowedMentions: {
parse: []
}
});
const prefix = "!";
const token = process.env.DISCORD_TOKEN;
async function onMessage(message) {
if (!message.guild) {
return;
}
if (l1 === prefix + "calc") {
const result = eval(lines.join("\n"));
await message.channel.send(String(result));
}
}
client.on("message", (message) => {
onMessage(message).catch((err) => console.error(err));
});
client.login(token);
以下のような攻撃が可能です。
すでにこのトークンは無効化済みですtig.icon
https://gyazo.com/d4ccc92879b604b892521357b6fd8abd
対策
公開されるコマンドでは危険な関数を使用しない
実行者の検証を行う
関連