Выбор ответа Middle Файлы и процессы обновлено

Инъекция команд через exec

Вопрос

Что не так в этом коде?

const { exec } = require('node:child_process');
app.post('/thumb', (req, res) => {
  exec('convert ' + req.body.file + ' -resize 200 out.png', done);
});

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Command injection: a.png; rm -rf выполнится. exec передаёт строку в shell, и спецсимволы вроде ;, &&, $() выполнятся как команды.

Варианты ответа

  1. Ничего, convert сам проверит имя файла перед запуском
  2. Нужно использовать execSync, чтобы дождаться результата
  3. exec не работает внутри HTTP-обработчика Express
  4. Command injection: a.png; rm -rf ~ выполнитсяправильный ответ

Разбор

exec передаёт строку в shell, и спецсимволы вроде ;, &&, $() выполнятся как команды. Исправление: execFile("convert", [file, "-resize", "200", "out.png"]) без shell и проверка, что файл из разрешённой папки.

  • convert получит строку уже после того, как shell выполнит инъекцию.
  • exec работает где угодно.
  • execSync так же уязвим и ещё блокирует цикл.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.