Демонстрация проверки ввода и целостности кода

CompTIABeginner
Практиковаться сейчас

Введение

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

Вы изучите эти концепции на практике. Сначала вы создадите простой скрипт оболочки (shell script), который намеренно уязвим для инъекций команд. Затем вы воспользуетесь этой уязвимостью, чтобы понять риск. После этого вы защитите скрипт, реализовав надлежащую очистку входных данных (input sanitization). Наконец, вы узнаете, как использовать криптографические хэши для проверки целостности вашего скрипта, гарантируя, что он не был подделан.

Создание простого скрипта с пользовательским вводом

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

Сначала используйте редактор nano для создания нового файла с именем check_file.sh в каталоге ~/project.

nano ~/project/check_file.sh

Теперь добавьте следующий код в файл. Этот скрипт запросит имя файла, прочитает ввод в переменную с именем filename и затем выполнит ls -l для этого имени файла, используя команду eval. Обратите внимание, что использование eval с пользовательским вводом является серьезной уязвимостью безопасности.

#!/bin/bash

echo "Please enter a filename to check:"
read filename
echo "Checking details for: $filename"
eval "ls -l $filename"

Нажмите Ctrl+X, затем Y и Enter, чтобы сохранить файл и выйти из nano.

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

chmod +x ~/project/check_file.sh

Теперь давайте запустим скрипт, чтобы увидеть его в действии. Мы будем использовать testfile.txt, который был создан для вас в лабораторной среде.

./check_file.sh

Скрипт запросит у вас ввод. Введите testfile.txt и нажмите Enter.

Please enter a filename to check:
testfile.txt
Checking details for: testfile.txt
-rw-rw-r-- 1 labex labex 0 Aug  4 15:19 testfile.txt

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

Симуляция базовой атаки инъекции команд

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

Наш скрипт уязвим, потому что он использует eval для выполнения команды, которая включает пользовательский ввод ($filename), без предварительной проверки безопасности ввода. Команда eval обрабатывает всю строку как команду для выполнения, что делает ее особенно опасной. Злоумышленник может использовать это, предоставляя ввод, который включает дополнительные команды оболочки.

Давайте снова запустим скрипт.

./check_file.sh

На этот раз, когда будет предложено ввести имя файла, введите следующую строку. Точка с запятой (;) является специальным символом в оболочке, который разделяет команды.

testfile.txt; whoami

После нажатия Enter вы увидите следующий вывод:

Please enter a filename to check:
testfile.txt; whoami
Checking details for: testfile.txt; whoami
-rw-rw-r-- 1 labex labex 0 Aug  4 15:19 testfile.txt
labex

Обратите внимание, что произошло. Скрипт сначала выполнил ls -l testfile.txt, как и ожидалось. Однако из-за точки с запятой и использования eval оболочка затем выполнила вторую команду, whoami, которая вывела имя текущего пользователя (labex). Это демонстрирует успешную инъекцию команд. Команда eval сделала это возможным, обрабатывая весь ввод как исполняемый код. Злоумышленник мог бы использовать эту уязвимость для выполнения гораздо более опасных команд.

Примечание: Если бы вы использовали ls -l $filename без eval (как в исходной версии), атака не сработала бы, потому что оболочка интерпретировала бы testfile.txt; whoami как отдельные аргументы для ls, что привело бы к сообщениям об ошибках, таким как "cannot access 'testfile.txt;'" и "cannot access 'whoami'". Команда eval является тем, что делает инъекцию команд возможной в этом примере.

Реализация очистки ввода для предотвращения инъекций

На этом шаге вы модифицируете скрипт для предотвращения атак с использованием инъекции команд путем очистки пользовательского ввода и удаления опасной команды eval. Очистка ввода (input sanitization) — это процесс очистки или фильтрации ввода для удаления или нейтрализации потенциально вредоносных символов.

Наша стратегия будет заключаться в следующем:

  1. Удалить опасную команду eval и использовать прямое выполнение команды с правильным экранированием.
  2. Проверить, содержит ли введенное имя файла только разрешенные символы. Для обычного имени файла мы можем создать белый список символов, таких как буквы, цифры, подчеркивания, дефисы и точки. Мы отклоним любой ввод, содержащий другие символы, например точку с запятой.

Снова откройте скрипт check_file.sh с помощью nano.

nano ~/project/check_file.sh

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

#!/bin/bash

echo "Please enter a filename to check:"
read filename

## Input sanitization: only allow alphanumeric characters, underscores, hyphens, and dots.
if [[ "$filename" =~ ^[a-zA-Z0-9_.-]+$ ]]; then
  echo "Checking details for: $filename"
  ls -l "$filename"
else
  echo "Error: Invalid filename. Malicious input detected."
fi

Ключевые изменения:

  1. Удаление опасной команды eval.
  2. Добавление правильного экранирования вокруг "$filename" в команде ls.
  3. Оператор if с проверкой ввода. Выражение [[ "$filename" =~ ^[a-zA-Z0-9_.-]+$ ]] проверяет, содержит ли переменная filename только символы из указанного набора от начала (^) до конца ($).

Нажмите Ctrl+X, Y и Enter, чтобы сохранить изменения.

Теперь давайте снова попробуем ту же атаку. Запустите скрипт:

./check_file.sh

Введите вредоносный ввод testfile.txt; whoami и нажмите Enter.

Please enter a filename to check:
testfile.txt; whoami
Error: Invalid filename. Malicious input detected.

Как вы видите, скрипт теперь обнаруживает недопустимые символы и выводит сообщение об ошибке вместо выполнения вредоносной команды whoami. Атака успешно предотвращена.

Проверка целостности скрипта с помощью хеширования

На этом шаге вы узнаете, как проверить целостность вашего скрипта с помощью криптографической хеш-суммы. Это гарантирует, что скрипт не был изменен или подделан злоумышленником после того, как вы его обезопасили. Мы будем использовать утилиту sha256sum, которая вычисляет хеш SHA-256.

Сначала сгенерируем хеш для нашего безопасного скрипта check_file.sh и сохраним его в файл. Этот файл будет служить нашей "известной хорошей" сигнатурой.

sha256sum ~/project/check_file.sh > ~/project/check_file.sha256

Эта команда вычисляет хеш SHA-256 для check_file.sh и перенаправляет вывод в новый файл с именем check_file.sha256. Давайте посмотрим содержимое этого файла.

cat ~/project/check_file.sha256

Вы увидите длинную строку символов, за которой следует имя файла. Эта строка является уникальным хешем вашего скрипта.

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  /home/labex/project/check_file.sh

(Примечание: Ваше значение хеша будет отличаться.)

Теперь давайте сымитируем несанкционированное изменение. Мы добавим простой комментарий в конец скрипта. Даже такое небольшое изменение должно полностью изменить хеш.

echo "## A harmless comment" >> ~/project/check_file.sh

Скрипт теперь изменен. Чтобы проверить его целостность, мы можем использовать sha256sum с опцией -c (check), которая считывает хеш из нашего файла сигнатуры и сравнивает его с текущим хешем скрипта.

sha256sum -c ~/project/check_file.sha256

Команда сообщит о сбое, поскольку файл был изменен.

/home/labex/project/check_file.sh: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

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

Резюме

Поздравляем с завершением этой лабораторной работы! Вы получили практический опыт работы с двумя критически важными принципами безопасности.

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

Вы также узнали, как обеспечить целостность кода с помощью криптографических хеш-сумм. Сгенерировав контрольную сумму SHA-256 для вашего скрипта, вы смогли создать проверяемую подпись, которая может обнаружить любые несанкционированные изменения.

Эти навыки являются основополагающими для написания безопасного кода и поддержания безопасности любой системы.