Explicação
O que você descreveu é uma parte de um backdoor PHP conhecido. O código PHP principal é obscurecido pela codificação base64 para que não seja tão facilmente detectável. O código que você mostrou normalmente está oculto no cabeçalho Exif Model
e outra parte importante (PCRE /.*/e
) está normalmente no cabeçalho Make
.
O código do Exif é executado por outra parte do backdoor - chamando preg_replace($exif['Make'],$exif['Model'],'');
nos dados Exif da imagem. Para obter detalhes, consulte, por exemplo, Malware oculto dentro de cabeçalhos JPIF EXIF ou Escondendo o código backdoor do WebShell em arquivos de imagem .
Solução
Você pode corrigir as imagens infectadas removendo os cabeçalhos relevantes do Exif. Primeiro, verifique se as strings problemáticas estão nos cabeçalhos Make
e Model
:
exiftool file.jpg
Depois, você pode remover os cabeçalhos:
find /directory/with/images -iname '*.jpg' -exec exiftools -Make= -Model= {} +
Este código removerá os dois cabeçalhos de todos os arquivos .jpg
, independentemente do conteúdo dos cabeçalhos. Se você quiser remover apenas os cabeçalhos infectados, o código seria consideravelmente mais complicado. O script para fazer isso está abaixo no final desta resposta.
Após verificar se os resultados estão corretos, você pode remover os backups criados por exiftool
:
find /directory/with/images -iname '*.jpg_original' -delete
Tenha em mente que a outra parte do backdoor também deve ser removida. Está no código PHP no servidor e normalmente se parece com:
$exif = exif_read_data('/path/to/an/image.jpg');
preg_replace($exif['Make'],$exif['Model'],'');
Script para remoção mais precisa
O script a seguir detecta em quais cabeçalhos do Exif há o código de malware. Armazenar o código em um arquivo, por exemplo rm-jpg-backdoor
, em seguida, ative a execução: chmod a+x rm-jpg-backdoor
. Ao chamar o script, você pode passar diretórios de arquivos para limpar como argumentos. Exemplo: ./rm-jpg-backdoor /directory/with/images
#!/bin/sh
suff=jpg # problematic file suffix
# extended regex signatures of malware code
badregex1='eval\( *base64_decode\( *'\'
badregex2='/.+/e'
script="$0" # this script name for recursion
for f in "$@" ; do
if test -d "$f" ; then
echo "=== recursing directory $f"
find "$f" -type f -iname "*.$suff" -exec "$script" {} +
elif test -f "$f" ; then
echo "-- cleaning file $f"
hdr1="$( exiftool "$f" | grep -E ".+ +: +$badregex1" | sed -r 's/^([a-zA-Z /]*[a-zA-Z]) +: +.*$//' )"
test -n "$hdr1" && { echo "removing $hdr1" ; exiftool "-$hdr1=" "$f" ; }
hdr2="$( exiftool "$f" | grep -E ".+ +: +$badregex2" | sed -r 's/^([a-zA-Z /]*[a-zA-Z]) +: +.*$//' )"
test -n "$hdr2" && { echo "removing $hdr2" ; exiftool "-$hdr2=" "$f" ; }
fi
done