xargs не может найти пути к файлам, предоставленные входным файлом

Прежде всего, я не уверен, что это относится сюда, а не к ServerFault или где-то еще. Если это место там вместо этого, я извиняюсь.

Во всяком случае, вот некоторые сведения о моей проблеме. Я работаю в компании, которая управляет веб-сайтами различных клиентов, и у одного клиента, которого мы взяли, есть веб-сайт с большим количеством вредоносных программ, которые необходимо удалить. Теперь я многому научился за последние несколько недель с точки зрения использования grep, find, xargs и т. д. для поиска и выполнения действий с файлами, которые имеют определенные имена файлов, размеры файлов и которые содержат определенные строки или шаблоны текста.

Одна из проблем, которую мы обнаружили, заключается в том, что в некоторые изображения были внедрены вредоносные данные exif (в основном, атрибут Make имеет значение /.*/e, а атрибут Model — что-то вроде eval(base64_decode(...));, где закодированная строка представляет собой PHP-скрипт, который позволяет злоумышленнику отправить сообщение POST). запрос с определенным атрибутом, а затем запускает ввод из этого атрибута через eval(), а затем они внедрили следующий код в другой PHP-скрипт.

<?php
$exif = exif_read_data('/path/to/image.jpg');
preg_replace($exif['Make'],$exif['Model'],'');
?>

Таким образом, они заменяют регулярное выражение .*, которое соответствует чему угодно (включая пустую тему), кодом PHP, который принимает запрос POST и выполняет заданный код. По сути, это позволяет злоумышленнику выполнить любой PHP-код, который он хочет, на веб-сайте клиента. Во всем очень интересно разбираться, но надоедает исправлять.

В PHP есть инструменты для чтения данных exif (а именно, exif_read_data()), и я использовал их для сканирования всех файлов изображений на веб-сайте клиента и составления списка изображений, которые содержат вредоносные данные exif. Однако в PHP нет способа изменить эти данные. Итак, я провел небольшое исследование и обнаружил, что существует программа для Linux под названием «ExifTools», которая позволяет вам изменять данные exif. Я установил это и выполнил следующую команду:

xargs -a files_with_malicious_exif.txt exiftool -make="" -model=""

Текстовый файл — это просто список путей к файлам, каждый на отдельной строке. Сценарий правильно считывает имя файла, потому что затем выводит кучу сообщений «Ошибка: файл не найден — ./path» (по одному для каждого пути).

Проблема в том, что этот путь действительно существует, и если я выполню следующую команду:

exiftool -make="" -model="" ./path/that/does/exist/and/is/in/the/file/like/this.jpg

Оно работает. Я проверяю файл, и эти два элемента в его данных exif были очищены.

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

Я пытался использовать абсолютный путь, а также удалить «./» из имен файлов. Я запускаю из правильного каталога для работы относительных путей (о чем свидетельствует тот факт, что вторая команда действительно работает с относительным путем), но он все еще не может найти ни один из файлов.

Я что-то забыл сделать или делаю не так?


person imkingdavid    schedule 08.08.2013    source источник
comment
Ваша команда xargs ищет файл и должна работать, если входной файл в порядке. Одно предостережение: все в порядке, если ни в одном из имен файлов нет пробелов.   -  person Ciclamino    schedule 08.08.2013
comment
Я думаю, вы должны предоставить больше информации. Каков результат head -3 files_with_malicious_exif.txt | xargs ls -1?   -  person nosid    schedule 08.08.2013
comment
Я не вижу пробелов ни в одном из имен файлов (и поиск символа пробела в моем текстовом редакторе не дал результатов). @nosid Вывод этой команды : No such file or directory***.org/**.***.org/web/content/images/****.jpg : No such file or directory***.org/**.***.org/web/content/images/multimedia/***.jpg : No such file or directory***.org/**.***.org/web/content/images/***.jpg Я зацензурил часть пути звездочками, потому что это идентифицирует моего клиента. Обратите внимание, что часть сразу после каталога кажется обрезанной в начале (это не полное начало пути).   -  person imkingdavid    schedule 08.08.2013


Ответы (1)


Если вы настроены на использование xargs, мы можем попытаться решить проблему с помощью диагностики, если ваша цель — просто выполнить работу, небольшой цикл ниже будет работать; если у вас есть имена файлов со специальными символами, вам просто нужно изменить $fixfile на «$fixfile».

cat files_with_malicious_exif.txt | while read fixfile; do exiftool -make="" -model="" $fixfile; done
person user2662831    schedule 08.08.2013
comment
Определенно не настроен на использование xargs. Это было единственное, что я смог найти, что позволило бы мне запустить команду. - person imkingdavid; 08.08.2013
comment
Итак, я попытался запустить эту команду, и она все еще не может найти файлы. Я пробовал это с ведущим ./ и без него, а также с использованием абсолютного пути. Я понятия не имею, в чем проблема - person imkingdavid; 08.08.2013
comment
Попробуйте использовать $fixfile вместо $fixfile и дайте мне знать, если это вообще что-то изменит. - person user2662831; 09.08.2013
comment
Не изменил, к сожалению. :/ Я даже пытался использовать PHP-скрипт с exec() для запуска команд, но все равно ничего. Файлы изображений имеют права доступа 0644 и принадлежат пользователю, с которым я пытаюсь выполнить скрипт (я также пробовал с правами root). Если я использую команду file с путем, она показывает путь, а затем данные изображения JPEG, стандарт JFIF 1.01. Так что файл определенно существует. Я могу просто загрузить соответствующие изображения и внести изменения вручную. Этот вопрос отнимает слишком много времени. В любом случае, спасибо за помощь до сих пор! - person imkingdavid; 09.08.2013