Визначення бінарних команд перед виконанням


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( TLPдовірене виконання PATH) та (довірене LIBrary PATH). Виконуються лише програми в TEP, а бібліотеки можуть завантажуватися тільки Директорія включена в TLP. У Linux I є щось, що називається "AppArmor", що може вам допомогти.
Майкл Felt

1
Ви можете мати таку безпеку, але не від сценарію - до того часу, коли ваш сценарій буде виконуватися в неконтрольованому середовищі, вже пізно. Все, що ви знаєте, все, що ви можете бачити, - це chroot, встановлений зловмисником.
Чарльз Даффі

2
... якщо ви хочете мати систему, якій довіряєте до кінця, вам потрібно скористатися підходом до ChromeOS: підпишіть свою прошивку ключем, вбудованим у ваше обладнання; ваш завантажувач / ядро, перевірене прошивкою; ваш кореневий розділ ОС, доступний лише для читання, використовуючи підписи рівня блоку для перевірки; тощо. Також існують підходи, схожі на те, що в @MichaelFelt обговорюється - див. Архітектура вимірювання цілісності - але ефективність продуктивності вища, а рівень цілісності знижений (оскільки перевірка бінарних підписів не допомагає вам з атаками через невиконані зміст).
Чарльз Даффі

Відповіді:


24

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

Якщо ви не довіряєте файлам /usr/bin/та іншим системним каталогам, немає можливості відновити довіру. У вашому прикладі ви перевіряєте власника ls, але як ви знаєте, що можете довіряти ls? Цей же аргумент стосується й інших рішень, таких як md5sumі strace.

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


Які перерви, коли різні дистрибутиви вибирають /binзамість них розміщувати бінарні файли /usr/bin.
Damian Yerrick

IMA - це один із двох підготовлених до виробництва підходів до цього - інший - це підхід dm-verity, який застосовується ChromeOS для перевірки рівнів блоків на рівні рівнів.
Чарльз Даффі

Зауваження @DamianYerrick Fair. $PATHТоді встановіть обидва ці шляхи, якщо потрібна підтримка декількох дистрибутивів.
Дмитро Григор’єв

AIX TE (з RBAC або без нього) буде третім "готовим до виробництва" ядром, який виконає це - можливо більше. TE, після активації якого буде більш ніж пасивним - перешкоджатиме відкриттю файлів та / або виконанню програм. Крім того, програми та використання бібліотеки можуть бути встановлені виключно на TEP (шлях довіреного виконання) або TLP (шлях довіреної бібліотеки). Дивіться ibm.com/support/knowledgecenter/en/ssw_aix_61/… для основної інформації
Michael Felt

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
Я думаю, я вже згадував в останньому абзаці, що для того, щоб таке сталося, зловмиснику потрібно було отримати кореневий доступ до системи, і в цей момент все можливо. У випадках, коли зловмисник не має кореневого доступу, але може змінити змінну 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вам скаже, що це "an" alias.


type -aвключає всі форми (наприклад, псевдонім та зовнішню програму)
dave_thompson_085

Дякую @dave, це справді цікаво, я оновив свою відповідь
xhienne

1
typeскаже вам, наскільки баш знає, але якщо ми знаходимось під контролем зловмисного зловмисника, немає підстав вважати, що те, що баш думає, що воно знає, відображає фактичну правду. Для всіх, що ви знаєте, є 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 +++

Параметри (від людини зі страйком):

-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декомпілятор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.