Последнее время появилась острая необходимость проверять, что прилетело с очередными обновлениями кода в папку /vendor /venv или любую другую, где лежат исходники внешних зависимостей проекта. (poetry, composer, go install и тд., кто на чем пишет).
Сканеры безопасности решают данный класс задач, но их может не оказаться под рукой или тяжелое решение не подходит. Гугл не дал быстрого готового решения, когда под рукой только консоль.
Часть задач сводится к тому, чтобы найти определенный текст, ключевые слова, хардкод (например ip адрес) или опасный системный вызов. В голову сразу приходит grep. Но мы же хотим не только искать по одному слову и только в одном или группе файлов. Мы хотим проверить весь код по всем возможным словарям, которые определим сами.
Создаем словари
touch words
Обычный текстовый файл, где в каждой строчке будет ключевое слово. Файлов можно создать несколько, для разных логических групп. Мы для простоты оставим один.
Допустим каталог, который мы хотим рекурсивно проверить ./content
Мало кто знает но, grep умеет искать не только по параметру из командной строки, но и умеет использовать набор строк из файла (искать их все).
find ./content -type f | grep -v 'words' | xargs -I % grep -i --with-filename -f words %
Готово! Но как же быть с данными, например IP-адресов, по которым злоумышленник выполняет нужную вредоносную логику. Их в словарь не прописать.
IP-адреса
Все еще проще
find ./content -type f | xargs -I % grep -i --with-filename -E -o "([0-9]{1,3}[.]){3}[0-9]{1,3}" %
Можно ограничить только валидными IPv4
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ips.txt
Дальше можно развивать в зависимости от задачи.
Объединим вместе в scan.sh
#!/bin/bash
echo
echo "Words:"
echo
find ./content -type f | grep -v 'words' | xargs -I % grep -i --with-filename -f words %
echo
echo "IPv4:"
echo
find ./content -type f | grep -v 'words' | xargs -I % grep -i --with-filename -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" %
echo
chmod +x scan.sh
./scan.sh
Обновление словарей
Можно добавлять руками, сортировать, удалять дубли тд. Но можно автоматизировать.
update_dict.sh
#!/bin/bash
awk '{print tolower($0)}' words > tmp && mv tmp words
cat words | sort | uniq > tmp && mv tmp words
Можно запускать отдельно. Или добавить в начало скрипта сканирования. Все слова будут уникализироваться, приводиться к нижнему регистру и сортироваться для удобства.
Итого
В несколько строк мы получили простейший скрипт, который будет почти на любой Linux машине искать прямые вхождения по словарю и IP адерса.
Легко развивается по функционалу. Белые списки, черные, дополнительные группы, настройка алертов, или интеграция в процесс обновления пакетов.
Комментарии (19)
gecube
16.04.2022 16:11+4не надо так делать, это из разряда вредные советы. Касательно поиска вредоносов... Ну, есть еще более простой способ - пиши полностью весь код сам ))) без зависимостей
tbon Автор
16.04.2022 16:19-1Не все возможно написать самому. Как вы напишите на Flask или Laravel с нуля?
Речь же не идет о замене Kali со всем инструментарием на три строчки bash кода. Или замену акунетиксу и тд. Но примитивная проверка, если ее нет совсем никакой, происходит. В какой то степени решение расширяется в зависимости от ситуации.
gecube
16.04.2022 16:37+1Ну, тогда ответьте на вопрос - а что сразу не искать semgrep’ом? Его установить по сути два клика или одна команда?
Не все возможно написать самому. Как вы напишите на Flask или Laravel с нуля?
Возможно все. Другой вопрос - экономическая целесообразность
tbon Автор
16.04.2022 16:54+1Semgrep это полноценный статичсекий анализатор на Python. Не думаю, что стоит сравнивать. Его может не оказаться по разным причинам, как техническим так и иным. Месяц назад все можно было поставить, а сегодня удалают репы крупных компаний из гитхаба, и ES не доступен с определенных IP.
Grep xargs и bash есть в любой системе. Не требует установки, изучения правил Semgrep и тд.
Деньги - не единственный фактор. Еще есть время. Не уверен, что при любых деньгах стоит писать свой SHA512 или драйвер bluetooth. Так придется идти до ядра и своего железа с нуля.
gecube
16.04.2022 16:59ES не доступен с определенных IP.
И что?
Его может не оказаться по разным причинам, как техническим так и иным.
Точно так же можно дорассуждаться до того, что bash/grep/xargs станут недоступны на т-и отдельных гос-в.
К примеру - базовый образ docker alpine - Баша там нет, только голый Sh
Вы же сами утверждаете, что Фласк и ларавель берете готовые… или это другое?
tbon Автор
16.04.2022 17:10Я не пытаюсь с Вами спорить. Если у вас есть уже semgrep и вы его используете, вы маловероятно будете решать задачу грепом. Но если ничего кроме грепа у вас нет, то это решение.
randomsimplenumber
16.04.2022 16:53+2Есть хоть один пример нахождения этим скриптом чего то вредоносного?
tbon Автор
16.04.2022 17:04https://gist.github.com/MidSpike/f7ae3457420af78a54b38a31cc0c809c
вставляйте в словарь любые признаки и все найдет
ipgeolocation deleteFile heartUtf8
Resurrected
16.04.2022 17:27Мне кажется, что все же нужно внимательно изучать каждую новую версию, прежде чем ее устанавливать, нужна она или нет, а то получится, как патчами от университета Миннесоты https://habr.com/ru/news/t/556106
amarao
16.04.2022 17:42И вы действительно изучаете каждую новую версию? И как вам там, читая патч к ядру и код новой версии браузера?
Resurrected
16.04.2022 18:01Очевидно, что вы хотите услышать ответ "нет". Но да, изучаю. Это плохо или возбраняется?
В браузерах я вообще не гонюсь за новизной.
amarao
16.04.2022 18:49А за исправлениями узявимостей? Успеваете всё это читать и понимать что оно меняет?
gleb_l
16.04.2022 22:35+1Помните document.write(‘<scr’ + ‘ipt>’ + …?
tbon Автор
16.04.2022 22:45-3Безусловно. Коллеги выше верно писали и про обфускацию. Да - тремя строчками и грепом, такое уже не ищется. Для этого есть уже другие инструменты @gecube заметил выше хороший инструмент semgrep.
Но последнее время злоумышленники не паряться и втыкают код как есть не запариваять даже ‘<scr’ + ‘ipt>’. Примеров тысячи. Сюда кидать не буду. А то тут опять набегут хейтеры провокаторы и диванные бойцы топить мою карму.
gleb_l
16.04.2022 22:57-1Правильный подход - не топить, а наоборот, повышать карму оппоненту. Чтобы хоть немного отогнать бронепоезд от станции Холивар к станции Диспут.
Просто считать, что враг наивен - не менее наивно. В настоящей борьбе обе стороны всегда используют максимум своих возможностей - иначе нет смысла тратить силы вообще.
Зачем вахтёр, который проверяет пропуск, но если нет, то «пускает и так»? Он только съедает деньги и нервы ;)
tictac17
17.04.2022 16:58Мне почему-то сразу вспомнился "известный" антивирус "Иммунитет" от Алексея Бабушкина. Тоже на скриптах был)
Resurrected
А если там обфускация кода, то все?
tbon Автор
Да, но для поверхностного быстрого анализа за минуту на простейшие вещи достаточно. Для историй с обфускацией и бинарниками нужны уже тяжелые решения.