Последнее время появилась острая необходимость проверять, что прилетело с очередными обновлениями кода в папку /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)


  1. Resurrected
    16.04.2022 16:06

    А если там обфускация кода, то все?


    1. tbon Автор
      16.04.2022 16:08
      -1

      Да, но для поверхностного быстрого анализа за минуту на простейшие вещи достаточно. Для историй с обфускацией и бинарниками нужны уже тяжелые решения.


  1. gecube
    16.04.2022 16:11
    +4

    не надо так делать, это из разряда вредные советы. Касательно поиска вредоносов... Ну, есть еще более простой способ - пиши полностью весь код сам ))) без зависимостей


    1. tbon Автор
      16.04.2022 16:19
      -1

      Не все возможно написать самому. Как вы напишите на Flask или Laravel с нуля?

      Речь же не идет о замене Kali со всем инструментарием на три строчки bash кода. Или замену акунетиксу и тд. Но примитивная проверка, если ее нет совсем никакой, происходит. В какой то степени решение расширяется в зависимости от ситуации.


      1. gecube
        16.04.2022 16:37
        +1

        Ну, тогда ответьте на вопрос - а что сразу не искать semgrep’ом? Его установить по сути два клика или одна команда?

        Не все возможно написать самому. Как вы напишите на Flask или Laravel с нуля?

        Возможно все. Другой вопрос - экономическая целесообразность


        1. tbon Автор
          16.04.2022 16:54
          +1

          Semgrep это полноценный статичсекий анализатор на Python. Не думаю, что стоит сравнивать. Его может не оказаться по разным причинам, как техническим так и иным. Месяц назад все можно было поставить, а сегодня удалают репы крупных компаний из гитхаба, и ES не доступен с определенных IP.

          Grep xargs и bash есть в любой системе. Не требует установки, изучения правил Semgrep и тд.

          Деньги - не единственный фактор. Еще есть время. Не уверен, что при любых деньгах стоит писать свой SHA512 или драйвер bluetooth. Так придется идти до ядра и своего железа с нуля.


          1. gecube
            16.04.2022 16:59

            ES не доступен с определенных IP.

            И что?

            Его может не оказаться по разным причинам, как техническим так и иным.

            Точно так же можно дорассуждаться до того, что bash/grep/xargs станут недоступны на т-и отдельных гос-в.

            К примеру - базовый образ docker alpine - Баша там нет, только голый Sh

            Вы же сами утверждаете, что Фласк и ларавель берете готовые… или это другое?


            1. tbon Автор
              16.04.2022 17:10

              Я не пытаюсь с Вами спорить. Если у вас есть уже semgrep и вы его используете, вы маловероятно будете решать задачу грепом. Но если ничего кроме грепа у вас нет, то это решение.


  1. randomsimplenumber
    16.04.2022 16:53
    +2

    Есть хоть один пример нахождения этим скриптом чего то вредоносного?


    1. tbon Автор
      16.04.2022 17:04

      https://gist.github.com/MidSpike/f7ae3457420af78a54b38a31cc0c809c

      вставляйте в словарь любые признаки и все найдет

      ipgeolocation
      deleteFile
      heartUtf8


  1. Resurrected
    16.04.2022 17:27

    Мне кажется, что все же нужно внимательно изучать каждую новую версию, прежде чем ее устанавливать, нужна она или нет, а то получится, как патчами от университета Миннесоты https://habr.com/ru/news/t/556106


    1. amarao
      16.04.2022 17:42

      И вы действительно изучаете каждую новую версию? И как вам там, читая патч к ядру и код новой версии браузера?


      1. Resurrected
        16.04.2022 18:01

        Очевидно, что вы хотите услышать ответ "нет". Но да, изучаю. Это плохо или возбраняется?

        В браузерах я вообще не гонюсь за новизной.


        1. amarao
          16.04.2022 18:49

          А за исправлениями узявимостей? Успеваете всё это читать и понимать что оно меняет?


  1. vilgeforce
    16.04.2022 19:21

    Кажется, вы "изобрели" YARA


  1. gleb_l
    16.04.2022 22:35
    +1

    Помните document.write(‘<scr’ + ‘ipt>’ + …?


    1. tbon Автор
      16.04.2022 22:45
      -3

      Безусловно. Коллеги выше верно писали и про обфускацию. Да - тремя строчками и грепом, такое уже не ищется. Для этого есть уже другие инструменты @gecube заметил выше хороший инструмент semgrep.

      Но последнее время злоумышленники не паряться и втыкают код как есть не запариваять даже ‘<scr’ + ‘ipt>’. Примеров тысячи. Сюда кидать не буду. А то тут опять набегут хейтеры провокаторы и диванные бойцы топить мою карму.


      1. gleb_l
        16.04.2022 22:57
        -1

        Правильный подход - не топить, а наоборот, повышать карму оппоненту. Чтобы хоть немного отогнать бронепоезд от станции Холивар к станции Диспут.

        Просто считать, что враг наивен - не менее наивно. В настоящей борьбе обе стороны всегда используют максимум своих возможностей - иначе нет смысла тратить силы вообще.

        Зачем вахтёр, который проверяет пропуск, но если нет, то «пускает и так»? Он только съедает деньги и нервы ;)


  1. tictac17
    17.04.2022 16:58

    Мне почему-то сразу вспомнился "известный" антивирус "Иммунитет" от Алексея Бабушкина. Тоже на скриптах был)