Проверка командных двоичных файлов перед выполнением

13

Есть ли способы проверить, что вы на самом деле выполняете из 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...
Милош Чаконович
источник
2
Если вы такой параноик, тогда используйте свои собственные двоичные файлы!
Ипор Сирсер
8
В дополнение к whichнеправильному сообщению, что tarбудет делать, ответ xhienne lsможет быть взломан, чтобы вернуть ложную информацию о файле (ах), если таковые имеются. Также grepможет быть взломан, чтобы вернуть ложную информацию; этого можно избежать, используя вместо этого сопоставление оболочки, но тогда можно будет взломать оболочку. И оболочка может быть взломана, чтобы дать неправильные результаты, typeво-первых, или полностью заменена, поскольку возможность замены оболочки была важным нововведением Unix по сравнению с 50-летними ОС. См. Адрес Тьюринга Кена Томпсона 1984 года. Это черепахи все время вниз.
dave_thompson_085
2
Я не могу ответить на этот вопрос для Linux - только AIX - с компонентом Trusted Execution ( TE), который имеет базу данных с сигнатурами (т. Е. Более обширную, чем контрольная сумма MD5. Когда TE активен, а файл находится в базе данных, вы можете выбрать запускается ли программа - или только предупреждает о том, что она не соответствует базе данных. Кроме того, есть два других параметра: TEP(доверенное выполнение PATH) и TLP(доверенное LIBrary PATH). Могут выполняться только программы в TEP, а библиотеки могут загружаться только с каталог включен в TLP. В Linux I есть кое-что под названием «AppArmor», которое может вам помочь
Майкл Фелт
1
Вы можете иметь такую ​​безопасность, но не из сценария - к тому времени, когда ваш сценарий выполняется в неконтролируемой среде, уже слишком поздно. Все, что вы знаете, все, что вы видите, - это chroot, созданный атакующим.
Чарльз Даффи
2
... если вы хотите, чтобы система была полностью надежной, вам нужно использовать подход ChromeOS: ваша прошивка подписана ключом, встроенным в ваше оборудование; ваш загрузчик / ядро ​​проверено прошивкой; ваш корневой раздел ОС только для чтения, используя для проверки подписи на уровне блоков; и т. д. Существуют также подходы, аналогичные тем, которые обсуждает @MichaelFelt, - см. Архитектура измерения целостности - но влияние на производительность выше, а уровень целостности снижен (поскольку проверка двоичных сигнатур не помогает при атаках с помощью неисполняемых файлов). содержание).
Чарльз Даффи

Ответы:

24

Вместо проверки исполняемых файлов, которые вы собираетесь выполнить, вы можете запустить нужные двоичные файлы с самого начала. Например, если вы хотите убедиться, что не собираетесь запускаться /tmp/surprise/tar, просто запустите /usr/bin/tarваш скрипт. В качестве альтернативы, установите $PATHв здравом уме значение, прежде чем запускать что-либо.

Если вы не доверяете файлам /usr/bin/и другим системным каталогам, восстановить их невозможно. В вашем примере вы проверяете владельца ls, но откуда вы знаете, что можете доверять ls? Тот же аргумент применим к другим решениям, таким как md5sumи strace.

Там, где требуется высокая уверенность в целостности системы, используются специализированные решения, такие как IMA . Но это не то, что вы могли бы использовать из сценария: вся система должна быть настроена особым образом с концепцией неизменяемых файлов.

Дмитрий Григорьев
источник
Который ломается, когда разные дистрибутивы предпочитают ставить двоичные файлы /binвместо /usr/bin.
Дамиан Йеррик
IMA - это один из двух готовых к работе подходов к этому, другой - подход dm-verity, используемый ChromeOS для проверки корневых файлов на уровне блоков.
Чарльз Даффи
@DamianYerrick Справедливое замечание. $PATHЗатем установите оба этих пути, если требуется поддержка множественного распространения.
Дмитрий Григорьев
AIX TE (с или без RBAC) будет третьим "готовым к работе" встроенным в ядро ​​ядром, который достигнет этого - возможно, большего. TE, будучи включенным, чтобы быть более чем пассивным, предотвратит открытие файлов и / или выполнение программ. Кроме того, приложения и использование библиотеки могут быть установлены исключительно на TEP (доверенный путь выполнения) или TLP (доверенный путь к библиотеке). См. Ibm.com/support/knowledgecenter/en/ssw_aix_61/… для получения основной информации
Майкл Фелт
6

Если злоумышленник получил доступ к вашей системе и может изменить вашу $PATH(что не должно включать /tmpни при каких обстоятельствах), тогда уже слишком поздно беспокоиться о владельцах исполняемых файлов.

Вместо этого вы должны прочитать о том, как бороться с вторжением .

Лучше сосредоточиться на том, чтобы вообще избежать вторжения.

Если у вас есть система, в которой такие вещи имеют значение, то может быть хорошей идеей изолировать ее части, которые должны быть общедоступными, от частей, которые должны быть частными, а также выполнить аудит способов коммуникации между этими.

Кусалананда
источник
4

Это возможно в некоторой степени путем проверки md5sumфайла. Таким образом, в системах, которые используют aptуправление пакетами - в моем конкретном случае, Ubuntu 16.04 - есть файл /var/lib/dpkg/info/tar.md5sums, в котором хранятся суммы md5 всех файлов, полученных в tarходе установки. Таким образом, вы можете написать простое выражение if, которое проверяет, является ли выводmd5sum /bin/tar совпадает тем, что находится в этом файле.

Это, конечно, предполагает, что сам файл не был подделан. Это, конечно, может произойти только тогда, когда злоумышленник получил права root / sudo, и в этот момент все ставки отключены.

Сергей Колодяжный
источник
8
Но как вы оцениваете /usr/bin/md5sum?
Дмитрий Григорьев
Если злоумышленник может заменить /bin/tarили /usr/bin/tar, весьма вероятно, что он также может просто заменить md5sumили /var/lib/dpkg/info/tar.md5sums. Или $SHELL.
Йонас Шефер
1
Я думаю, что уже упоминал в предыдущем абзаце, что для того, чтобы это произошло, злоумышленнику необходимо получить root-доступ к системе, и на этом этапе все возможно. В тех случаях, когда злоумышленник не имеет корневого доступа, но может изменить переменную PATH для пользователя или создать псевдоним, где он tarуказывает на другой двоичный файл, это будет работать. Когда система скомпрометирована на корневом уровне, у вас есть один вариант - сбросить ее с орбиты
Сергей Колодяжный
3

Да, есть метод: встроенный type. В отличие от whichкоманды, которая выполняет поиск только в вашей переменной PATH, typeвы узнаете, является ли имя команды зарезервированным ключевым словом, встроенным, псевдонимом, функцией или дисковым файлом.

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

Кроме того type -a, вам будут предоставлены все кандидаты в вашу команду (от первого до последнего выбора):

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

Наконец, если вас интересуют только двоичные файлы на вашем диске, вы можете использовать type -Paдля получения всех двоичных файлов в вашем PATH (в том же порядке, что и выше):

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

Тем не менее, typeодин не скажет вам точно, какая команда будет вызвана в конце. Например, если у вас tarесть псевдоним, который вызывает двоичный файл (например alias tar="/tmp/tar"), он typeскажет вам, что это alias.

xhienne
источник
type -aвключает все формы (например, псевдоним и внешнюю программу)
dave_thompson_085
Спасибо @dave, это действительно интересно, я обновил свой ответ
xhienne
1
typeскажет вам inasfar, как знает bash, но если мы находимся под контролем злоумышленника, нет никаких оснований полагать, что то, что bash думает, что оно знает, отражает реальную правду. Для всего, что вы знаете, есть LD_PRELOADмодуль, который перехватывает каждый вызов C-библиотеки, который вы делаете.
Чарльз Даффи
1
@CharlesDuffy Вы, конечно, правы. Я не хотел отвечать в сторону безопасности. Я просто предлагаю ответ на вопрос вверху: «Есть ли какие-либо методы, чтобы проверить, что вы на самом деле выполняете из bash-скрипта?» И предложил альтернативу which.
xhienne
Я никогда не видел enableраньше. Я воспользовался советом из этих ответов, чтобы type enableузнать, встроена ли оболочка, а затем help enableпосмотреть, что она делает.
Джо
3

Вы можете проверить, какие команды в точности выполняются скриптом, используя strace. Например:

strace -f -e execve ./script.sh

С помощью следующего скрипта:

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

straceскажет вам точный путь к командам, выполняемым при использовании с -e execveпараметром:

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

Параметры (от 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.

Зумо де Видрио
источник
3
Это никоим образом не используется сценарием для выполнения автоматического тестирования, и нет особой причины полагать, что straceон сам не был подорван.
Чарльз Даффи
0

ОС Linux основана на файлах, и многие команды, выполняемые в Linux, скорее всего, разрешат некоторые изменения в файлах, расположенных на вашем компьютере. Из-за этого, возможно, является лучшим решением для вашей проблемы. Вы можете проверить свои команды на любые изменения в файловой системе перед ее выполнением.

введите описание изображения здесь

Есть команда 'strace', которая декомпилирует вашу команду по частям ...

введите описание изображения здесь

Если вы действительно хотите углубиться, вы должны проверить декомпиляторы для сценариев, которые будут выполняться. Другими словами, вы должны проверить интерпретацию ассемблера этой команды. Для Баша есть objdump -d. Linux bin скрипты в основном создаются на Cязыке программирования, поэтому используйте хороший Cдекомпилятор.


источник