Есть ли способы проверить, что вы на самом деле выполняете из bash-скрипта?
Предположим, что ваш Баш скрипт звонит несколько команд (например: tar
, mail
, scp
, mysqldump
) , и вы готовы , чтобы убедиться , что tar
фактическая, реальная tar
, которая может быть определена с помощью root
пользователя , являющегося владельцем файла и родительский каталог и только один с правами записи а не некоторые /tmp/surprise/tar
с www-data
или apache2
быть владельцем.
Конечно, я знаю об PATH
окружающей среде, мне любопытно узнать, можно ли это дополнительно проверить из запущенного сценария bash и, если да, то как именно?
Пример: (псевдокод)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Милош Чаконович
источник
источник
which
неправильному сообщению, чтоtar
будет делать, ответ xhiennels
может быть взломан, чтобы вернуть ложную информацию о файле (ах), если таковые имеются. Такжеgrep
может быть взломан, чтобы вернуть ложную информацию; этого можно избежать, используя вместо этого сопоставление оболочки, но тогда можно будет взломать оболочку. И оболочка может быть взломана, чтобы дать неправильные результаты,type
во-первых, или полностью заменена, поскольку возможность замены оболочки была важным нововведением Unix по сравнению с 50-летними ОС. См. Адрес Тьюринга Кена Томпсона 1984 года. Это черепахи все время вниз.TE
), который имеет базу данных с сигнатурами (т. Е. Более обширную, чем контрольная сумма MD5. Когда TE активен, а файл находится в базе данных, вы можете выбрать запускается ли программа - или только предупреждает о том, что она не соответствует базе данных. Кроме того, есть два других параметра:TEP
(доверенное выполнение PATH) иTLP
(доверенное LIBrary PATH). Могут выполняться только программы в TEP, а библиотеки могут загружаться только с каталог включен в TLP. В Linux I есть кое-что под названием «AppArmor», которое может вам помочьОтветы:
Вместо проверки исполняемых файлов, которые вы собираетесь выполнить, вы можете запустить нужные двоичные файлы с самого начала. Например, если вы хотите убедиться, что не собираетесь запускаться
/tmp/surprise/tar
, просто запустите/usr/bin/tar
ваш скрипт. В качестве альтернативы, установите$PATH
в здравом уме значение, прежде чем запускать что-либо.Если вы не доверяете файлам
/usr/bin/
и другим системным каталогам, восстановить их невозможно. В вашем примере вы проверяете владельцаls
, но откуда вы знаете, что можете доверятьls
? Тот же аргумент применим к другим решениям, таким какmd5sum
иstrace
.Там, где требуется высокая уверенность в целостности системы, используются специализированные решения, такие как IMA . Но это не то, что вы могли бы использовать из сценария: вся система должна быть настроена особым образом с концепцией неизменяемых файлов.
источник
/bin
вместо/usr/bin
.$PATH
Затем установите оба этих пути, если требуется поддержка множественного распространения.Если злоумышленник получил доступ к вашей системе и может изменить вашу
$PATH
(что не должно включать/tmp
ни при каких обстоятельствах), тогда уже слишком поздно беспокоиться о владельцах исполняемых файлов.Вместо этого вы должны прочитать о том, как бороться с вторжением .
Лучше сосредоточиться на том, чтобы вообще избежать вторжения.
Если у вас есть система, в которой такие вещи имеют значение, то может быть хорошей идеей изолировать ее части, которые должны быть общедоступными, от частей, которые должны быть частными, а также выполнить аудит способов коммуникации между этими.
источник
Это возможно в некоторой степени путем проверки
md5sum
файла. Таким образом, в системах, которые используютapt
управление пакетами - в моем конкретном случае, Ubuntu 16.04 - есть файл/var/lib/dpkg/info/tar.md5sums
, в котором хранятся суммы md5 всех файлов, полученных вtar
ходе установки. Таким образом, вы можете написать простое выражение if, которое проверяет, является ли выводmd5sum /bin/tar
совпадает тем, что находится в этом файле.Это, конечно, предполагает, что сам файл не был подделан. Это, конечно, может произойти только тогда, когда злоумышленник получил права root / sudo, и в этот момент все ставки отключены.
источник
/usr/bin/md5sum
?/bin/tar
или/usr/bin/tar
, весьма вероятно, что он также может просто заменитьmd5sum
или/var/lib/dpkg/info/tar.md5sums
. Или$SHELL
.tar
указывает на другой двоичный файл, это будет работать. Когда система скомпрометирована на корневом уровне, у вас есть один вариант - сбросить ее с орбитыДа, есть метод: встроенный
type
. В отличие отwhich
команды, которая выполняет поиск только в вашей переменной PATH,type
вы узнаете, является ли имя команды зарезервированным ключевым словом, встроенным, псевдонимом, функцией или дисковым файлом.Кроме того
type -a
, вам будут предоставлены все кандидаты в вашу команду (от первого до последнего выбора):Наконец, если вас интересуют только двоичные файлы на вашем диске, вы можете использовать
type -Pa
для получения всех двоичных файлов в вашем PATH (в том же порядке, что и выше):Тем не менее,
type
один не скажет вам точно, какая команда будет вызвана в конце. Например, если у васtar
есть псевдоним, который вызывает двоичный файл (напримерalias tar="/tmp/tar"
), онtype
скажет вам, что этоalias
.источник
type -a
включает все формы (например, псевдоним и внешнюю программу)type
скажет вам inasfar, как знает bash, но если мы находимся под контролем злоумышленника, нет никаких оснований полагать, что то, что bash думает, что оно знает, отражает реальную правду. Для всего, что вы знаете, естьLD_PRELOAD
модуль, который перехватывает каждый вызов C-библиотеки, который вы делаете.which
.enable
раньше. Я воспользовался советом из этих ответов, чтобыtype enable
узнать, встроена ли оболочка, а затемhelp enable
посмотреть, что она делает.Вы можете проверить, какие команды в точности выполняются скриптом, используя
strace
. Например:С помощью следующего скрипта:
strace
скажет вам точный путь к командам, выполняемым при использовании с-e execve
параметром:Параметры (от strace man):
-f
: Трассировка дочерних процессов по мере того, как они создаются отслеживаемыми в настоящее время процессами в результате системных вызовов fork (2), vfork (2) и clone (2). Обратите внимание, что-p PID -f
будут присоединены все потоки PID процесса, если он многопоточный, а не только поток с thread_id = PID.-e trace=file
: Трассировка всех системных вызовов, которые принимают имя файла в качестве аргумента. Вы можете думать об этом как об аббревиатуре, для-e trace=open,stat,chmod,unlink,...
которой полезно видеть, на какие файлы ссылается процесс. Кроме того, использование аббревиатуры гарантирует, что вы не забудете случайно включить в список вызов типа lstat.источник
strace
он сам не был подорван.ОС Linux основана на файлах, и многие команды, выполняемые в Linux, скорее всего, разрешат некоторые изменения в файлах, расположенных на вашем компьютере. Из-за этого, возможно, является лучшим решением для вашей проблемы. Вы можете проверить свои команды на любые изменения в файловой системе перед ее выполнением.
Есть команда 'strace', которая декомпилирует вашу команду по частям ...
Если вы действительно хотите углубиться, вы должны проверить декомпиляторы для сценариев, которые будут выполняться. Другими словами, вы должны проверить интерпретацию ассемблера этой команды. Для Баша есть
objdump -d
. Linux bin скрипты в основном создаются наC
языке программирования, поэтому используйте хорошийC
декомпилятор.источник