Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017)

Материал из 0x1.tv

Докладчик
Эдгар Казиахмедов

Утилита strace предназначена для диагностики и отладки программ, написанных под ОС Linux. За годы работы, инструмент приобрел уникальную в своем роде базу системных вызовов для различных архитектур, таких как microblaze, riscv, avr32, всем известная x86 и т.д.

Утилита asinfo в свою очередь оперирует с данной базой системных вызовов и предоставляет любую информацию о них в наиболее удобном формате.

Видео

on youtube

Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.

Презентация

Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017).pdf

Thesis

Введение и обзор проблемы

Год за годом strace становится все более мощным инструментом для отладки приложений, написанных под Linux. Помимо этого, инструмент собирается под огромное количество архитектур. Прежде всего, при добавлении очередной платформы необходимо предоставить список системных вызовов, что представляет собой довольно трудоемкий процесс, так как каждому системному вызову необходимо задать такие свойства как группа и количество входных аргументов. В силу этого, на данный момент база системных вызовов, предоставляемая strace не имеет аналогов. Для наглядности рассмотрим объявление для системного вызова open для архитектуры x86_64:

<source lang="C"> [ 2] = { 3, TD|TF, SEN(open), "open" }, </source>

Как видно, объявление этого системного вызова требует человеческого вмешательства, так как генерация объявлений не может быть унифицирована путем обработки скриптом исходных кодов ядра Linux. Несмотря на обширность данной базы, она все еще не может нести дескриптивного характера для конечного пользователя. Попросту говоря, необходим дополнительный слой абстракции в виде программы-оператора. Поэтому была поставлена задача - разработать программу asinfo, которая могла бы работать с массивами системных вызовов для каждой поддерживаемой strace архитектуры и выводить о них доступную информацию.

Существующие решения

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

<source lang="bash"> auditctl -a exit,always -S listen </source>

Теперь оказалось, что у нас 64/32-битное пользовательское окружение. В таком случае хотелось бы, чтобы listen улавливался в обоих случаях. По сути, для этого необходимо лишь убедиться, что номер системного вызова одинаков и там и там. На сегодняшний день вариантов всего два:

  • Воспользоваться программой ausyscall[1], входящей в пакет auditd;
  • Найти номер в исходных кодах ядра.

Стоит отметить, что ausyscall предоставляет довольно скудный набор архитектур и не поддерживает возможные двоичные интерфейсы приложения. Так или иначе, даже не принимая во внимания данных фактов, существующие решения не позволяют получить необходимую информацию о системных вызовах за один раз с возможностью гибкой настройки входных параметров. Таким образом, этот факт лишь еще раз доказывает необходимость реализации утилиты asinfo.

Архитектура программы

На основе проведенного анализа, к программе asinfo были выдвинуты следующие требования:

  • Предоставлять краткую информацию об архитектуре;
  • Учитывать существующие двоичные интерфейсы приложений;
  • Печатать название системного вызова по его номеру и наоборот;
  • Предоставлять возможность поиска точных совпадений и по вхождению (название системного вызова);
  • Предоставлять возможность использования regex;
  • Выводить системные вызовы по группам: network, desc, file и т.д.;
  • Предоставлять возможность работы с несколькими архитектурами за раз, для наблюдения расхождений в параметрах;
  • Определять по возможности двоичный интерфейс окружения;
  • Использовать форматированный/сырой формат вывода.

На основе данных требований программа приобрела архитектуру, показанную на рис:

Архитектура программы asinfo.png

Как видно, программа представляет собой конвейер. На первом этапе command_dispacher занимается тем, что обрабатывает входные параметры и проверяет их корректность, тем самым гарантируя отсутствие ошибок последующим блокам. Далее, arch_dispatcher разворачивает сжатый формат описания архитектур architecture и, основываясь на входных данных reqs, заполняет arch_list. На данном этапе, arch_list включает в себя все возможные двоичные интерфейсы, поэтому abi_dispatcher занимается тем, что отфильтровывает arch_list, основываясь либо на окружении, либо на входных данных. В последнюю очередь включается syscall_dispatcher, цель которого уже для маркированных бинарных интерфейсов отметить указанный набор системных вызовов. Стоит отметить, что syscall_dispatcher в своем составе использует заимствованную из strace фильтрацию системных вызовов. Таким образом, например, мы можем вывести все системные вызовы, работающие с файловым дескриптором для архитектуры x86_64 с 64-битным и x32 интерфейсами и посмотреть расхождения в номерах одной командой:

<source lang="bash"> asinfo --set-arch x86_64,x86_64 --set-abi 64bit,x32 --get-sname %desc </source>

Текущее состояние

На данный момент проведены все подготовки в кодовой базе strace для слияния кода asinfo[2] и выполнены поставленные задачи. Из не сделанного — отсутствие готовых к слиянию тестов.

Ссылки

  • ausyscall(8) — Linux man page, ([1])
  • GSoC 2017: Work product submission,([2])

Примечания и ссылки

Расширенный инструмент для вывода информации о системных вызовах (Эдгар Казиахмедов, OSSDEVCONF-2017)!.jpg

Plays:256   Comments:0