Идентификация источников заражения в программе распространения заражения

В анализе заражений источник заражения — это место в программе или оператор, который может создавать ненадежные или внешние входные данные.

Моя цель. Выявление всех внешних пользовательских входных данных в программу, таких как cmdline-input, чтение файла, переменные среды и сети, с помощью динамического анализа (предпочтительно) и распространения заражения.

Я прочитал это руководство - http://shell-storm.org/blog/Taint-analysis-and-pattern-matching-with-Pin/, который перехватывает системные вызовы чтения с использованием PIN-кода Intel и распространяет taint. Я хочу расширить то же самое, включив в него различные внешние входы, упомянутые выше. (Для начала, для C-scanf, gets, fopen и т. д.)

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


person G Ashwin    schedule 16.03.2016    source источник


Ответы (1)


Я предполагаю, что вы ориентируетесь только на Linux.

Как правило, программа получает внешние входные данные через контакт с операционной системой, используя системные вызовы. Вы говорите о функциях libc. Это более высокий уровень абстракции. Я бы рекомендовал смотреть на входные данные на уровне системного вызова.

Кроме того, еще одним входом для программы являются переменные среды и аргументы командной строки, которые находятся в стеке при запуске программы.

Еще одна вещь, которую следует учитывать, — это общая память во всех ее видах и проявлениях.

person nitzanms    schedule 26.03.2016
comment
Дело в подходе с системным вызовом заключается в том, что я не уверен, как расширить его на такие функции, как scanf, поскольку то, как scanf использует системный вызов чтения, довольно сложно. С тем же PIN-кодом я получаю странные результаты, если программа использует scanf вместо прямого вызова read(). Итак, для начала я решил отметить все функции libc, а также несколько функций, специфичных для предметной области (ненадежный ввод), например a = f1(). Всякий раз, когда вызывается f1, помечать a как tainted. Считаете ли вы, что инструмент статического анализа, такой как clang, лучше подходит для этого случая? - person G Ashwin; 28.03.2016
comment
Я думаю, что у вас могут быть проблемы с правильным распространением заражения, но я не могу сказать наверняка. - person nitzanms; 29.03.2016
comment
Таким образом, можно ли в том же случае использовать инструменты инструментирования, такие как PIN, с хорошим эффектом для выбора определенных функций libc в рутинном инструментировании? В другом случае a = f1() , как получить адрес 'a' в инструментарии PIN? - person G Ashwin; 29.03.2016
comment
Пин не работает на уровне исходного кода, поэтому ваш вопрос не имеет смысла. На уровне, на котором работает булавка, на это есть ответ в статье, на которую вы ссылаетесь (это распространение заражения). Если вы спрашиваете, как связать инструкцию, в которой это произошло, с исходной строкой, посмотрите pin_getsourcelocation - person nitzanms; 03.04.2016