Обзор
Оболочка – это мощный инструмент, который служит интерфейсом между пользователем и операционной системой.
Она позволяет пользователям взаимодействовать с системой с помощью команд и скриптов.
Bash и POSIX (/bin/sh) – две популярные оболочки Linux.
Скрипты оболочки удобны для ИТ-специалистов, поскольку они помогают автоматизировать повторяющиеся задачи.
Несмотря на то, что они облегчают нам различные задачи, при создании скриптов оболочки важно уделять первостепенное внимание безопасности.
В этом руководстве мы рассмотрим, почему кавычки переменных в скриптах Bash имеют решающее значение, и какие риски для безопасности несет их отсутствие.
Важность цитирования переменных
Мы можем рассматривать переменные как контейнеры, в которых хранится информация для последующего использования.
При разработке скриптов Bash/POSIX пренебрежение кавычками переменной приводит к тому, что shell-скрипты расширяют переменную, что впоследствии интерпретируется как несколько аргументов.
Давайте напишем скрипт example.sh, в котором переменная хранит сообщение без кавычек:
#!/bin/bash message=$1 echo $message
Когда мы выполняем следующую команду в Bash, мы можем ожидать, что она выведет «Hello World» в терминале в той же строке, однако этого не происходит:
В примере выше мы видим, что скрипт использует команду echo дважды: один раз для «Hello» и второй раз для «World».
Следовательно, он рассматривает переменную как два отдельных ввода вместо одного.
Если заключить переменную message в строке echo в кавычки, например echo «$message», скрипт будет интерпретировать все, что находится внутри кавычек, как один аргумент, независимо от его содержания.
Риски безопасности и стратегия их снижения
Невозможность заключить переменные в кавычки может привести к различным рискам безопасности.
В этом разделе мы рассмотрим, как это может привести к таким проблемам, как раскрытие информации и выполнение произвольного кода.
Раскрытие информации
Злоумышленник может использовать переменные без кавычек для перечисления каталогов или доступа к конфиденциальным файлам, что может привести к раскрытию конфиденциальной информации.
Рассмотрим сценарий Bash с именем read_file.sh, в котором используются переменные без кавычек, что приводит к раскрытию информации:
#!/bin/bash if [ "${1##*.}" != "txt" ]; then echo "Only text files allowed" exit 1 fi filename=$1 contents=$(cat $filename) echo "$contents"
В представленном коде ${1##*.} извлекает расширение файла из его имени.
Затем проверяется, имеет ли имя файла расширение txt; если нет, то скрипт завершает работу.
Скрипт ожидает аргумент «имя файла» из командной строки.
При получении имени файла с расширением txt он выводит его содержимое с помощью команды echo:
Как показано выше, он выводит содержимое файла.
Однако передача неверных аргументов вызывает сообщение об отказе:
В предыдущем примере мы не смогли получить прямой доступ к секретному файлу.
Однако, передав аргумент с пробелом, скрипт позволил разделить аргумент:
Как показано выше, мы успешно загрузили секретный файл.
Наличие файла itsecforu.txt с правильным расширением txt удовлетворяет требованиям скрипта.
Более того, пробел в ‘secret itsecforu.txt’ приводит к тому, что сценарий интерпретирует его как два отдельных аргумента, что позволяет нам получить доступ к секретному файлу.
Выполнение произвольного кода
Это можно считать одним из самых серьезных последствий использования переменной без кавычек.
Злоумышленник может использовать такие переменные без кавычек для инъекции команд, что приведет к несанкционированному доступу или компрометации системы.
Давайте проиллюстрируем это на примере.
Сначала создадим файл filename.txt со следующим содержимым:
a b c
d e f
g h i
Далее давайте определим переменную char_to_search для хранения символа, который мы хотим искать в первом столбце файла filename.txt, и воспользуемся командой awk для поиска шаблона:
Приведенная выше команда ищет a в первом столбце и выводит соответствующую строку:
a b c
Теперь давайте посмотрим, как злоумышленник может использовать переменную без кавычек для выполнения произвольного кода:
В приведенном выше примере мы можем наблюдать, как команда whoami непреднамеренно выполняется из-за незакавыченной переменной user_input, что приводит к выводу ekuta.
Это возможно потому, что такие команды, как awk и find, могут выполнять другие команды.
Сначала скрипт проверяет наличие a, а затем, из-за отсутствия кавычек в user_input, рассматривает пробел как разделитель и интерпретирует часть BEGIN{system(«whoami»)} как отдельный аргумент.
Это приводит к тому, что она выполняется как команда awk, что приводит к выполнению произвольной команды.
Стратегия устранения
Наиболее простым способом устранения этой уязвимости является использование переменных, заключенных в кавычки.
Однако если есть причины не использовать кавычки, необходимо правильно проверять вводимые пользователем данные.
Это включает в себя проверку на наличие специальных символов, использование массивов для хранения каждого слова и последующую индивидуальную проверку того, выполняет ли пользователь намеченные действия или совершает вредоносные операции.
Заключение
В этой статье мы обсудили, почему важно ставить кавычки вокруг переменных в сценариях оболочки и какие риски связаны с их пропуском.
Использование кавычек вокруг переменных – это фундаментальный аспект написания безопасного и надежного кода.
Если мы оставляем уязвимости в безопасности при разработке скрипта, это помогает злоумышленникам на различных этапах взлома, одним из которых является повышение привилегий.
В общем, очень важно использовать кавычки в переменных при создании shell-скриптов.
см. также:
- 💣 Проверьте, уязвим ли сервер к ошибке Shellshock\
- 👀 Тестирование уязвимостей, связанных с инъекцией Host Header
- 🐧 Неправильная конфигурация контейнеров Linux
- 💣 Что такое уязвимость Regex DoS
- Утечка Microsoft раскрыла секретные функций Windows 11
- 🌐 Как разрешить в Apache только методы GET и POST
- 🐳 Популярные ошибки в конфигурации, которые делают контейнерные приложения уязвимыми для атак