Командный файл ест процессор и оперативную память, используя только echo ^?

tldr: запустил командный файл, содержащий только одну строку: echo ^, Этот файл съедает 70-100% одного ядра и ок. 1к оперативной памяти в секунду...???

Отвечая на этот вопрос, я обнаружил странное поведение в пакетных файлах Windows.

У меня был какой-то забавный пакетный файл, чтобы показать ОП, что вы могли бы иметь ^ в конце строки в командном файле для продолжения строки, например:

файл test.bat:

echo How are ^
you today ^
my good fellow

Будет ли вывод: How are you today my good fellow

Мне было бы интересно, если бы в командной строке отображалось More? из командного файла, похожего на командную строку, если у вас была просто строка в командном файле: echo Do you want some ^

Если бы вы сделали это в командной строке, он будет отображаться More? (что касается большего ввода):

C:\>echo Do you want some ^
More?

Тем не менее, я попробовал эту строку (имея ТОЛЬКО эту строку) в командном файле, и произошло некоторое необъяснимое поведение, поэтому я поиграл со сценарием, чтобы найти, что единственный раз, когда это происходит, когда echo заявление является последней строкой и ^ это последний символ командного файла.

Быстрый файл для воспроизведения:

файл test.bat:

echo ^

Запуск этого пакетного файла на моей 64-битной машине с Windows 7 израсходовал 70-100% одного из моих ядер и потреблял примерно 1 КБ памяти каждую секунду!!

Запуск этого файла также игнорировал все входные данные (кроме CTRL+ нажмите клавишу, чтобы завершить его), хотя после завершения файла ввод все еще сбрасывался на консоль:

C:\>test.bat
(nothing is happening here except CPU/RAM eating)
(I would proceed to type something like "HELLO")
CTRL+C (script ends)
C:\>HELLO
'HELLO' is not recognized an internal .....

Мой 'search-foo' (Stack Oveflow, Stack Exchange, MSDN, Google и Bing) не дал результатов, которые могли бы объяснить это странное поведение в командном файле (только то, что ^ делает в командной строке и командных файлов); Я думаю, что если бы единственная строка в командном файле была echo ^ это просто завершит сценарий и не будет работать, пока я CTRL+C из этого?

Кто-нибудь еще заметил это поведение или мог бы объяснить, что может вызвать это? Также может ли это привести к возможным путям атаки на систему?

Это не главная проблема (у меня нет пакетных файлов, которые заканчиваются echo ^) но мне показалось очень странным, что 1 строка пакета приводит к 1k / s??

(Примечание: я собираюсь опробовать ту же самую ситуацию через некоторые языки программирования [.NET, Java и C/C++] и некоторые веб-скрипты (возможно, JS?), Чтобы увидеть, что происходит в результате)

1 ответ

Решение

Как оказалось, это на самом деле ошибка в том, как в командной строке (более конкретно cmd.exe) анализирует пакетные файлы и может привести к быстрому отказу в атаке типа сервиса; размещение следующей строки в пакетном файле (без новых строк) очень быстро израсходует огромные объемы памяти из-за этой ошибки (в качестве примера):

^ nul<^

Короче говоря, когда каретка находится в конце файла, фактический конец файла "игнорируется", а дескриптор файла "сбрасывается" в 0 (по существу), так что пакет анализируется снова (до бесконечности).

Другие вопросы по тегам