Linux Skill - Освой Linux c нуля до DevOps
10.7K subscribers
59 photos
76 videos
436 links
Освой Linux c нуля до DevOps
Подробный гайд по Linux и море других уроков для системных администраторов

📩 По всем вопросам: @chorapov

РКН https://vk.cc/cMUwm4
Download Telegram
🚨 НИКОГДА не редактируй bash-скрипт во время его выполнения!

Привет, повелитель терминала! 👋

Знаешь, что может превратить безобидный скрипт в оружие массового уничтожения данных? Всего одно неосторожное редактирование.

💣 Смотри, какая бомба:

#!/bin/bash
sleep 30
#rm -rf --no-preserve-root /
echo "Time's up!"


Выглядит безопасно? Команда rm закомментирована, скрипт просто ждёт 30 секунд. Но стоит тебе отредактировать его во время выполнения...

Что происходит:
1. Запускаешь скрипт → bash начинает читать его частями
2. Меняешь sleep 30 на sleep 3 в редакторе
3. Сохраняешь файл → смещение байтов сбивается
4. BOOM! → bash читает rm -rf / вместо комментария

🔍 Доказательство через strace:

# Открытие скрипта
openat(AT_FDCWD, "delay.sh", O_RDONLY) = 3

# Парсинг первой строчки (до 80 символов)
read(3, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 80) = 64

# Возврат к началу
lseek(3, 0, SEEK_SET) = 0

# Переключение на на файловый дескриптор 255
dup2(3, 255) = 255

# Чтение 64-байтового куска файла, чтобы получить команду
read(255, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 64) = 64

# Поместить курсор обратно в конец команды, которую мы собираемся выполнить
# Offset 21 is the `#`
lseek(255, -43, SEEK_CUR) = 21

# Приостановка выполнения, уход в sleep
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2072

# До возвращения wait4 файл редактируется с `30` на `3`

# Чтение 64-байтового куска файла, чтобы получить следующую команду
# В этом демо я заменил опасную команду на echo
read(255, "echo \"Don't execute me\"\necho \"Ti"..., 64) = 42

# Bash решает выполнить оба echo одновременно без нового чтения
# Очевидно, что-то идёт не так
write(1, "Don't execute me\n", 17) = 17
write(1, "Time's up!\n", 11) = 11

# Чтение следующего фрагмента и обнаружение конца файла
read(255, "", 64) = 0


🛡️ Как защититься:
Копируй скрипт перед редактированием
Останови выполнение перед правками
Используй блокировки файлов
Тестируй на копиях важных скриптов

💡 Вывод
Bash читает скрипт блоками по 64 байта и отслеживает позицию. Удаление символов сдвигает содержимое, но не позицию чтения!

🌐 Источник: https://habr.com/ru/articles/500832/
____________________

Дополнительный материал:
🧠 - GRUB Files Unveiled: Путеводитель по конфигурационным файлам
🧠 - Как настроить автоматическое включение вашего компьютера с помощью RTC
🧠 - GRUB Rescue Ops: Как оживить систему, замершую на grub>

#Linux_Mastery #Linux #Bash #Security #DevOps #SysAdmin #ScriptSafety
👍21