Эти команды awk уязвимы для внедрения кода? - PullRequest
2 голосов
/ 14 июня 2019

Я не был уверен, как правильно написать скрипт конкретной команды awk, использующей переменную оболочки, когда я прочитал ответы на Как использовать переменные оболочки в скрипте awk? .

Принятый ответ демонстрирует, как интерполяция переменной оболочки в команде awk будет склонна к внедрению вредоносного кода, и, хотя мне удалось воспроизвести демонстрационную версию, я не смог найти ту же проблему ни с одной из следующих двух команд :

#HWLINK=enp10s0
ip -o route | awk '/'$HWLINK'/ && ! /default/ {print $1}'
ip -o route | awk "/$HWLINK/"' && ! /default/ {print $1}'

Итак, главный вопрос в том, уязвимы ли какие-либо из них (или оба).

Второстепенный вопрос - какая форма предпочтительнее? Я пытался ip -o route | awk -v hwlink="$HWLINK" '/hwlink/ && ! /default/ {print $1}', но это не работает.

p.s. это рефакторинг; исходная команда была ip -o route | grep $HWLINK | grep -v default | awk '{print $1}'.

Ответы [ 2 ]

4 голосов
/ 14 июня 2019

Конечно, оба уязвимы, первый чуть менее.

Это разрывает вашу вторую строку:

HWLINK="/{}BEGIN{print \"Your mother was a hamster and your father smelt of elderberries\"}/"

Единственная причина, по которой она не нарушает вашу первую строку, это,чтобы иметь возможность быть введенным в первую строку, она не должна содержать пробелов.

HWLINK="/{}BEGIN{print\"Your_mother_was_a_hamster_and_your_father_smelt_of_elderberries\"}/"

Я вижу, вы уже получили правильный синтаксис для использования:)

4 голосов
/ 14 июня 2019

Ваша идея была правильной - позволить переменным оболочки, интерполируемым внутри awk, может позволить внедрить вредоносный код.Как правильно указано, используйте синтаксис -v, но ваша попытка не удалась, поскольку сопоставление с переменной не работает в форме /../, используйте прямое ~ match

ip -o route | awk -v hwlink="$HWLINK" '$0 ~ hwlink && ! /default/ {print $1}'

Рекомендуемый способочистить ваши переменные, переданные в awk, будет использовать массив ARGV или ENVIRON.Переменные, прошедшие этот путь, не подвергаются расширению, выполняемому оболочкой

value='foo\n\n'
awk 'BEGIN {var=ARGV[1]; delete ARGV[1]}' "$value"

Если вы напечатаете значение var внутри awk, это будут буквальные foo\n\n и , а не многострочная строка, которая обычно происходит, когда оболочка ее расширяет.

...