Очевидная и действенная мера.
В РНР нет способа штатными средствами защититься от атак RCE через вызов exec консольных утилит, которые парсят параметры.
То есть escapeshellarg
корректно делает из строки один консольный параметр, но не мешает этому параметру быть ключом команды!
Вот глядите:
unzip a.zip -d123
unzip a.zip -d 123
unzip a.zip '-d123'
unzip умеет брать путь распаковки и из 1 и из двух аргументов, если первый равен -d.
Теперь код распаковщика с уязвимостью:
Код:
$cmd="unzip -nj ".escapeshellarg($_GET['name'])." *.ext -d /tmp";
казалось бы, все хорошо экранируется, но реально подумайте что будет делать сейчас unzip:
Код:
unzip -nj '-d/var/www/' *.ext -d /tmp
он будет распаковывать *.ext как ZIP-архивы и класть результаты распаковки по пути /var/www
причем из архивов будут браться только файлы, перечисленные а аргументах, то есть "-d" "/tmp" и все что развернет шелл из *.ext кроме первого файла - он будет самим именем архива.
Все это потому, что после того как unzip увидит существующий файл (первый из *.ext), все остальное он рассматривает как файлы для извлечения.
Таким образом, мы получаем неплохой вектор атаки

На деле можно прокинуть симлинк на файл, который хочется прочитать в /var/www, например.
Думаю, про ограничения этой атаки говорить не приходиться, как и про то, где она может пригодиться.
Пока пишется блогпост можно использовать на свое усмотрение