В чем разница между символическим исполнением и анализом заражения?

Недавно я прочитал статью под названием «Все, что вы когда-либо хотели знать о динамическом анализе заражения и прямом символическом исполнении (но Возможно, боялся спросить) " Dr. Э. Дж. Шварц. В своей статье он в основном говорил об их приложениях в контексте безопасности двоичного уровня.

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

Насколько я могу судить, анализ помеченных данных отслеживает потоки информации от объекта x (источник) к объекту y (приемник) всякий раз, когда информация, хранящаяся в x, передается в объект y. Поэтому основная проблема заключается в том, на какой объект может транзитивно воздействовать источник. В то время как символьное выполнение обрабатывает некоторые входные данные как символьные значения и пытается выразить другие переменные с помощью символьных значений; тем самым он отвечает, на каких условиях символьный ввод влияет на последующие программы.

Я вижу, что на двоичном уровне анализ заражения часто упоминается с уязвимостью, вызванной перезаписью адреса возврата; в то время как символьное выполнение может иметь дело с большим количеством типов уязвимых проблем, таких как целочисленное переполнение, ошибки утверждения времени выполнения, утечка ресурсов (например, утечка памяти, файл открыть / закрыть), переполнение буфера.

Однако кажется, что современный анализ заражения включает не только анализ потока данных, большинство из них отслеживает условия потока управления; а в нескольких сценариях обнаружения уязвимостей испорченный ввод также представляется как символическое значение и распространяется так же, как и при символьном выполнении. С другой стороны, механизмы символьного исполнения не могут полностью использовать символьные значения, разделенные различными условиями пути, из-за ограничений базовых решателей ограничений и среды выполнения выполнения / интерпретации; таким образом, они не могут достичь ожидаемого высокого покрытия ветвления или пути.

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


person Hongxu Chen    schedule 02.03.2015    source источник
comment
Возможно, стоит попытаться опубликовать этот вопрос на StackExchange Computer Science или StackExchange Reverse Engineering.   -  person gogo_gorilla    schedule 26.02.2016


Ответы (4)


Интересный вопрос! Вот мои 2 цента: символическое выполнение использует своего рода анализ заражения для построения ограничений пути. В символьном исполнении также используется решатель SMT / SAT для генерации конкретных значений переменных и / или входных данных, чтобы удовлетворялось определенное ограничение пути.

Поскольку анализ помеченных данных не использует решатель SMT / SAT, я бы сказал, что это не разновидность символьного исполнения. Можно сказать, что анализ заражения - это часть символического исполнения.

Это всего лишь мнение. Пожалуйста, не стесняйтесь оспаривать это.

person Benny    schedule 16.12.2015

Я согласен с @Benny, это действительно интересный вопрос. Вы, вероятно, многому научитесь, формулируя такие вопросы, и даже больше, когда попытаетесь на них ответить.

Я хотел бы добавить к ответу Бенни:

Чтобы реализовать отслеживание заражения и символьное выполнение, необходимо определить семантику языка (например, сборку x86 в случае двоичных файлов). Например, нужно описать, что

add eax, ebx

'означает', то есть делает по отношению к государству. Определение семантики отслеживания заражения можно рассматривать как своего рода подмножество семантики символьного выполнения. Семантика отслеживания заражения закодирована в семантике символического выполнения. Общая часть

  • Если ebx испорчен, то eax испорчен.
  • Если ebx является символическим (i.o.w. содержит формулу SMT, содержащую одну или несколько символьных переменных), тогда eax является символическим

Тем не менее, семантика для символьного выполнения должна содержать дополнительную информацию (например, точную арифметическую операцию): - eax это «все, что было в eax до» + «все, что было в ebx до»

Прокомментируйте или поправьте меня!

person gogo_gorilla    schedule 26.02.2016

На мой взгляд, чтобы ответить на ваш вопрос, мы должны ответить на следующий вопрос: i) имеет ли символьное выполнение потенциал для поиска всех путей выполнения, которые может испортить анализ, и многое другое; ii) имеет ли анализ заражения потенциал для обнаружения всех путей выполнения, которые может выполнять символическое выполнение, и многое другое; iii) обладают ли они одинаковым потенциалом поиска одинаковых путей выполнения; iv) могут ли они оба вычислить пути выполнения, которые другой не может.

На мой взгляд, пункт iv) правильный, что означает, что он не является подмножеством. Однако я согласен с тем, что действительно существует большое совпадение.

Мы можем исключить варианты i) и iii), потому что символьное выполнение находит только возможные пути выполнения, тогда как анализ помеченных данных может находить недопустимые, при этом не прибегает к решению ограничений.

Чтобы исключить вариант ii), я думаю (поправьте меня, если я ошибаюсь), что есть пути выполнения, которые могут быть обнаружены при символьном выполнении, а анализ на искажении не может. Например:

for(int i=0;i<3;i++) {
   if(someString.charAt(i)=='4')
       //do something
   else
       //do something else
}

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

person João Matos    schedule 24.11.2016
comment
если мы ограничим пути выполнения только теми, которые являются выполнимыми, пути, найденные taint, всегда будут подмножеством путей, найденных символическим выполнением, верно? - person Hongxu Chen; 25.11.2016

Я думаю, что ключевое различие заключается в том, является ли выполнение конкретным или символическим - заинтересованы ли вы в распространении заражения (для проверки утечки информации или перехвата потока управления) при единственном конкретном выполнении или если вы хотите изучить другие возможности такого распространения, используя возможности решающих программ. Достоинство динамического анализа заражения заключается в его низких накладных расходах и, следовательно, подходит для мониторинга во время выполнения. С другой стороны, (чистое / динамическое) символьное выполнение способно исследовать пути, отличные от конкретного, и, таким образом, подходит для автономного анализа интересующих вас свойств безопасности.

person Taejoon Byun    schedule 25.06.2017