Skip to content

Latest commit

 

History

History
60 lines (46 loc) · 6.92 KB

19_app_graphs.md

File metadata and controls

60 lines (46 loc) · 6.92 KB

Приложение 5. Графы взаимодействия помеченных процессов и модулей

Natch позволяет получить историю распространения помеченных данных между процессами и модулями. Если инструмент не работает в облегченном режиме (подробнее в разделе Облегченный режим работы Natch), эта опция включена по умолчанию. Для управления функцией построения графов используется секция [TaintedTask] в основном конфигурационном файле.

Для определения взаимодействий Natch выделяет дополнительную теневую память объемом в два раза больше, чем объем основной памяти, выделенной гостевой системе. В эту память для каждого физического адреса записывается идентификатор процесса, который последним записал помеченные данные на этот адрес. Взаимодействие определяется, когда процесс читает помеченные данные из ячейки памяти, записанной другим процессом. Взаимодействия имеют веса, соответствующие количеству передаваемых данных. Следует отметить, что когда процесс читает 100 байт из другого процесса и когда читает 1 байт 100 раз, имеют один и тот же вес. Граф модулей строится теми же методами, что и граф процессов.

Все взаимодействия записываются в лог-файлы в формате JSON и могут быть выгружены либо с помощью SNatch CI/CD, либо в веб-интерфейсе SNatch с помощью кнопки JSON на вкладке соответствующего графа.

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

  • icount -- описывает диапазон времени, в которое происходила передача данных
  • source и destination -- описывают узлы, между которыми происходит передача помеченных данных
  • score -- содержит количество передаваемых байт между процессами

У некоторых ребер присутствует поле extra, которое содержит описание способа передачи данных. Описание способа передачи состоит из одного поля type, которое может принимать значения shared-memory для передач через разделяемую память и private-memory для передач через приватную память (например, передача данных от родительского процесса к дочернему во время вызова fork).

Описание узла графа имеет поле type, определяющее тип узла. Поле id у файлов содержит уникальный идентификатор, который Natch присваивает файловым дескрипторам. Если узел является источником помеченных данных, то его описание содержит поле taint_source в значении true.

Описание каждого типа узлов графа и его параметров:

  • file -- обычный файл. Поле name содержит полное имя файла.
  • tcp, udp, tcpv6, udpv6 -- сетевые сокеты TCP и UDP для IPv4 и IPv6 соответственно. Поля ip и port содержат соответственно ip адрес и порт сокета.
  • unix -- unix сокет. Поле name содержит имя файла из параметров сокета. Если сокет создан системным вызовом socketpair, то у него нет имени.
  • netlink -- netlink сокет.
  • socket -- остальные виды сокетов. Поле name содержит название типа сокета. Наличие такого узла в графе говорит о том, что обработка параметров данного типа сокетов в настоящее время не реализована.
  • pipe -- неименованный канал.
  • network -- сеть, источник помеченных данных. Поле protocol описывает номер ip протокола в сетевых пакетах.
  • user-process -- процесс. Поле proc содержит уникальный id процесса.
  • module -- модуль (только для module_graph). Поле name содержит имя модуля, поле address -- адрес модуля.
  • kernel -- ядро в module_graph. При наличии отладочных символов поле name содержит имя исполняемого файла ядра.

Пример выходного файла:

{"icount": {"start": 13557580656, "final": 13557582746}, "source": {"port": 80, "ip": "172.217.168.228", "type": "tcp", "id": 219}, "destination": {"proc": 20, "type": "user-process"}, "score": 1642},
{"icount": {"start": 14161961429, "final": 14161966494}, "source": {"proc": 20, "type": "user-process"}, "destination": {"name": "/home/nat/bin/scripts/index.html", "type": "file", "id": 2035}, "score": 2058},
{"icount": {"start": 14161961429, "final": 14161966494}, "source": {"name": "/home/nat/bin/scripts/index.html", "type": "file", "id": 2035}, "destination": {"proc": 196, "type": "user-process"}, "score": 2048},
{"icount": {"start": 14167892352, "final": 14167896186}, "extra": {"type": "shared-memory"}, "source": {"proc": 196, "type": "user-process"}, "destination": {"proc": 198, "type": "user-process"}, "score": 100},

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