Шифруем скрипты. Часть 3 — 10 июля 2026 г. в 10:00:05.868
Шифруем скрипты. Часть 3 👋 Приветствую в мире цифровой безопасности! В прошлыхпостах разобрали как Obash шифрует скрипты и как их можно вскрыть через FIFO-перехват и подмену интерпретатора. Сегодня - как эти же дыры закрывают на практике. ⏺Первая проблема, которую мы использовали - временный FIFO-файл в /tmp с расшифрованным содержимым. Закрывается переносом передачи данных в анонимный pipe вместо именованного: int pipefd[2]; pipe(pipefd); write(pipefd[1], decrypted_script, len); // передаём pipefd[0] дочернему процессу через exec, а не через путь в файловой системе Анонимный pipe не имеет пути в /tmp который можно перехватить между записью и удалением - дескриптор существует только в рамках процессов которые его явно унаследовали. ⏺Вторая проблема - подмена интерпретатора через PATH. Закрывается жёстким указанием абсолютного пути вместо поиска через переменную окружения: execve("/bin/bash", argv, envp); // вместо execvp("bash", ...) execve с абсолютным путём игнорирует PATH полностью - атакующий может сколько угодно класть fake_interpreter в текущую директорию, бинарник его просто не увидит. ⏺Третья защита - очистка окружения перед запуском интерпретатора, чтобы LD_PRELOAD и другие механизмы инъекции не сработали: char *clean_env[] = { "PATH=/usr/bin:/bin", NULL }; execve("/bin/bash", argv, clean_env); Если LD_PRELOAD не передаётся в новое окружение - хук из предыдущей части просто не подгрузится, потому что сам механизм LD_PRELOAD работает через переменную окружения которой больше нет. ⏺Четвёртая мера - самопроверка процесса на предмет активного ptrace, потому что дамп памяти через gdb требует именно его: #include <sys/ptrace.h> if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) { // процесс уже под трассировкой — кто-то пытается прицепиться отладчиком exit(1); } PTRACE_TRACEME успешно вызывается только один раз на процесс. Если к моменту вызова уже есть активный трейсер - вызов провалится, и это сигнал что дебаггер уже прицеплен снаружи. ⏺Почему это всё равно не решает проблему целиком: расшифрованный скрипт в какой-то момент обязан существовать в памяти процесса в читаемом виде, иначе интерпретатор не сможет его выполнить. Все перечисленные меры повышают порог входа и требуют больше усилий от аналитика, но фундаментальный принцип “если код должен выполниться - его можно достать” никуда не девается. 🤖Бесплатный ChatGPT

