Приведите пример уязвимости при обработке входных данных в программе на Bash или Python (команда с подстановкой), объясните риски исполнения команд и предложите безопасные альтернативы
Пример уязвимости + объяснение рисков и безопасные альтернативы. Bash — уязвимый пример - Уязвимый код: ``` #!/bin/bash pattern="$1" # опасно: eval исполнит любую вставку из $pattern eval "grep -n $pattern /var/log/syslog" ``` - Пример атаки: при `pattern='; rm -rf /'` будет выполнена команда `rm -rf /`. - Риски: произвольное выполнение команд, удаление/эксфильтрация данных, получение контроля над системой. Bash — безопасные альтернативы - Не использовать eval; правильно экранировать/кавычить и использовать `--` для аргументов: ``` pattern="$1" grep -n -- "$pattern" /var/log/syslog ``` - Проверка/валидация/вайтлистинг входа (разрешать только ожидаемые шаблоны). - Если нужно строить список аргументов динамически, используй массивы: ``` args=(grep -n -- "$pattern" /var/log/syslog) "${args[@]}" ``` - Чтение без обработки спецсимволов: `read -r user_input`. Python — уязвимый пример - Уязвимый код: ```python import os user = input("file: ") # опасно: формирование строки для shell os.system("tar -czf backup.tar.gz " + user) ``` - Пример атаки: при вводе `"; rm -rf /"` будет выполнено удаление. Python — безопасные альтернативы - Использовать subprocess без shell и передавать аргументы как список: ```python import subprocess user = input("file: ") subprocess.run(["tar", "-czf", "backup.tar.gz", user], check=True) ``` - Если shell необходим, экранировать аргументы через shlex.quote: ```python import shlex, subprocess safe = shlex.quote(user) subprocess.run("tar -czf backup.tar.gz " + safe, shell=True, check=True) ``` - Дополнительно: валидация/вайтлистинг имён файлов, ограничение прав процесса (least privilege), использование временных директорий и проверка путей (не позволять `..`), явное управление правами доступа. Краткие правила безопасности - Никогда не подставлять сырые пользовательские строки в команды shell (особенно через eval или shell=True). - Использовать API, принимающие аргументы как список (subprocess без shell, массивы в bash). - Валидировать/ограничивать входные данные (вайтлист), применять escaping если shell неизбежен. - Минимизировать права процесса и логировать подозрительные вводы.
Bash — уязвимый пример
- Уязвимый код:
```
#!/bin/bash
pattern="$1"
# опасно: eval исполнит любую вставку из $pattern
eval "grep -n $pattern /var/log/syslog"
```
- Пример атаки: при `pattern='; rm -rf /'` будет выполнена команда `rm -rf /`.
- Риски: произвольное выполнение команд, удаление/эксфильтрация данных, получение контроля над системой.
Bash — безопасные альтернативы
- Не использовать eval; правильно экранировать/кавычить и использовать `--` для аргументов:
```
pattern="$1"
grep -n -- "$pattern" /var/log/syslog
```
- Проверка/валидация/вайтлистинг входа (разрешать только ожидаемые шаблоны).
- Если нужно строить список аргументов динамически, используй массивы:
```
args=(grep -n -- "$pattern" /var/log/syslog)
"${args[@]}"
```
- Чтение без обработки спецсимволов: `read -r user_input`.
Python — уязвимый пример
- Уязвимый код:
```python
import os
user = input("file: ")
# опасно: формирование строки для shell
os.system("tar -czf backup.tar.gz " + user)
```
- Пример атаки: при вводе `"; rm -rf /"` будет выполнено удаление.
Python — безопасные альтернативы
- Использовать subprocess без shell и передавать аргументы как список:
```python
import subprocess
user = input("file: ")
subprocess.run(["tar", "-czf", "backup.tar.gz", user], check=True)
```
- Если shell необходим, экранировать аргументы через shlex.quote:
```python
import shlex, subprocess
safe = shlex.quote(user)
subprocess.run("tar -czf backup.tar.gz " + safe, shell=True, check=True)
```
- Дополнительно: валидация/вайтлистинг имён файлов, ограничение прав процесса (least privilege), использование временных директорий и проверка путей (не позволять `..`), явное управление правами доступа.
Краткие правила безопасности
- Никогда не подставлять сырые пользовательские строки в команды shell (особенно через eval или shell=True).
- Использовать API, принимающие аргументы как список (subprocess без shell, массивы в bash).
- Валидировать/ограничивать входные данные (вайтлист), применять escaping если shell неизбежен.
- Минимизировать права процесса и логировать подозрительные вводы.