Атакующие часто маскируют вредоносы под легитимные системные процессы, подменяя своё отображаемое имя через
argv[0]Пример можно найти в отчете
👨💻 Как это может работать?
🔤Процесс запускается как
/tmp/.malware🔤При старте проверяет
argv[0]🔤Если имя не совпадает с ожидаемым - перезапускает себя через
execve с поддельным argv[0], например: /usr/lib/systemd/systemd-updateВ результате ps, top, htop отображают процесс как легитимный, скрывая его реальное расположение.
💀 Простой пример:
#define _GNU_SOURCE
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[], char *envp[]) {
const char *fake = "/usr/lib/systemd/systemd-update";
if (strcmp(argv[0], fake) != 0) {
char *new_argv[] = { (char *)fake, NULL };
execve("/proc/self/exe", new_argv, envp);
}
while(1) sleep(60);
}
argv[0] — это первый элемент массива, который передается при вызове функции execveДля проверки можно использовать скрипт:
for pid in /proc/[0-9]*; do
exe=$(readlink "$pid/exe" 2>/dev/null)
cmdline=$(tr '\0' ' ' < "$pid/cmdline" 2>/dev/null)
if [[ -n "$exe" && -n "$cmdline" ]]; then
exe_name=$(basename "$exe")
cmd_name=$(echo "$cmdline" | cut -d' ' -f1 | xargs basename 2>/dev/null)
if [[ "$exe_name" != "$cmd_name" ]]; then
echo "SUSP: PID $(basename $pid) | exe=$exe | cmdline=$cmdline"
fi
fi
done
Если атакующие удалят файл, то в конце вывода
readlink /proc/207349/exe будет (deleted)#dfir@detectioneasy
#ttp@detectioneasy