📃 Риски безопасности переменных без кавычек в Bash и POSIX |

📃 Риски безопасности переменных без кавычек в Bash и POSIX

Закрытие уязвимостей

Обзор

Оболочка – это мощный инструмент, который служит интерфейсом между пользователем и операционной системой.

Она позволяет пользователям взаимодействовать с системой с помощью команд и скриптов.

Bash и POSIX (/bin/sh) – две популярные оболочки Linux.

Скрипты оболочки удобны для ИТ-специалистов, поскольку они помогают автоматизировать повторяющиеся задачи.

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

В этом руководстве мы рассмотрим, почему кавычки переменных в скриптах Bash имеют решающее значение, и какие риски для безопасности несет их отсутствие.

Важность цитирования переменных

Мы можем рассматривать переменные как контейнеры, в которых хранится информация для последующего использования.

При разработке скриптов Bash/POSIX пренебрежение кавычками переменной приводит к тому, что shell-скрипты расширяют переменную, что впоследствии интерпретируется как несколько аргументов.

Давайте напишем скрипт example.sh, в котором переменная хранит сообщение без кавычек:

#!/bin/bash
message=$1
echo $message

Когда мы выполняем следующую команду в Bash, мы можем ожидать, что она выведет «Hello World» в терминале в той же строке, однако этого не происходит:

./example.sh “Hello World”
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:

./read_file.sh itsecforu.txt
---Baeldung.txt---
You are currently viewing itsecforu file.
---End of itsecforu.txt---

Как показано выше, он выводит содержимое файла.

Однако передача неверных аргументов вызывает сообщение об отказе:

./read_file.sh secret
Only text files allowed

В предыдущем примере мы не смогли получить прямой доступ к секретному файлу.

Однако, передав аргумент с пробелом, скрипт позволил разделить аргумент:

./read_file.sh ‘secret itsecforu.txt’
***Disclaimer: You are accessing secret. Please be sure you are authorized***
Hey! this is a sensitive file.
***End of Secret***
---Baeldung.txt---
You are currently viewing itsecforufile.
---End of itsecforu.txt---

Как показано выше, мы успешно загрузили секретный файл.

Наличие файла itsecforu.txt с правильным расширением txt удовлетворяет требованиям скрипта.

Более того, пробел в ‘secret itsecforu.txt’ приводит к тому, что сценарий интерпретирует его как два отдельных аргумента, что позволяет нам получить доступ к секретному файлу.

Выполнение произвольного кода

Это можно считать одним из самых серьезных последствий использования переменной без кавычек.

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

Давайте проиллюстрируем это на примере.

Сначала создадим файл filename.txt со следующим содержимым:

a b c
d e f
g h i

Далее давайте определим переменную char_to_search для хранения символа, который мы хотим искать в первом столбце файла filename.txt, и воспользуемся командой awk для поиска шаблона:

char_to_search='a'
awk -v var=$char_to_search '$1 == var' filename.txt

Приведенная выше команда ищет a в первом столбце и выводит соответствующую строку:

a b c

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

user_input='a BEGIN{system("whoami")}'
awk -v char_to_search=$user_input '$2 == char_to_search' filename.txt
ekuta

В приведенном выше примере мы можем наблюдать, как команда whoami непреднамеренно выполняется из-за незакавыченной переменной user_input, что приводит к выводу ekuta.

Это возможно потому, что такие команды, как awk и find, могут выполнять другие команды.

Сначала скрипт проверяет наличие a, а затем, из-за отсутствия кавычек в user_input, рассматривает пробел как разделитель и интерпретирует часть BEGIN{system(«whoami»)} как отдельный аргумент.

Это приводит к тому, что она выполняется как команда awk, что приводит к выполнению произвольной команды.

Стратегия устранения

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

Однако если есть причины не использовать кавычки, необходимо правильно проверять вводимые пользователем данные.

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

Заключение

В этой статье мы обсудили, почему важно ставить кавычки вокруг переменных в сценариях оболочки и какие риски связаны с их пропуском.

Использование кавычек вокруг переменных – это фундаментальный аспект написания безопасного и надежного кода.

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

В общем, очень важно использовать кавычки в переменных при создании shell-скриптов.

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий