IT
October 26

`Shell command` и `CLI command`: в чём разница и почему она важна

Спойлер: для многих переведенных мною авторов разницы нет.

Вот примеры из текущей книги:

Command injection is similar, except user input is able to execute arbitrary CLI commands on the system.
You can use several techniques to defend against these exploits... e.g. using allowlist shell commands or prompts or sandboxing the environment in which shell commands are executed.
Both of these vulnerabilities can be relevant to MCP servers, especially if your server is used to access a database or execute CLI commands.

Если не сильно заморачиваться, то в целом речь идёт о некоем чёрном окошечке, в котором моргает курсор и куда можно вбивать команды.

А вот если все же вникнуть, то разница есть. Будем разбираться.


Для начала надо понять, что такое shell.

Shell (оболочка) — это интерпретатор команд, который принимает ввод и передаёт его на выполнение ядру или другим программам. Оболочка может выполнять как свои внутренние, встроенные команды, так и запускать сторонние программы по команде.

Встроенные команды оболочки — это, как правило, команды, которые выполняются внутри самого процесса оболочки. Эти команды могут изменять состояние самого процесса: например, изменить его рабочий каталог, переменные окружения, таблицу функций и т. д. И эти команды — первое, что проверяет оболочка, когда их в ней запускают. Именно тут речь идёт о shell command — командах оболочки.

А вот запуск из оболочки внешнего файла — например, git, docker или, скажем, python — это явно не встроенные в оболочку команды/инструменты. Это уже будет считаться CLI command.


В этой путанице с точки зрения ИТ, пожалуй, ничего особо страшного нет — ну мало ли, в каком порядке там команды исполняются. А вот с точки зрения ИБ разница более ощутимая: в первом случае компрометируется контроль над всей системой, а во втором — над одним из сторонних файлов/инструментов/утилит внутри системы.

Конечно, многое зависит от критичности этого стороннего файла, но это уже другая тема. А пока, я надеюсь, как смог объяснил разницу между shell command (команда оболочки, команда интерпретатора) и CLI command (терминальная команда, консольная команда, команда CLI, команда интерфейса командной строки — пардон за тавтологию).

.