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},
Каждая строка лог-файла описывает передачу данных между двумя процессами, либо между процессом и файлом.