Symbolic Fuzzing
Автор: Andreas Zeller
Загружено: 2022-05-17
Просмотров: 358
One of the problems with traditional methods of fuzzing is that they fail to exercise all the possible behaviors that a system can have, especially when the input space is large. Quite often the execution of a specific branch of execution may happen only with very specific inputs, which could represent an extremely small fraction of the input space. The traditional fuzzing methods relies on chance to produce inputs they need. However, relying on randomness to generate values that we want is a bad idea when the space to be explored is huge. For example, a function that accepts a string, even if one only considers the first 10 characters, already has 2^80 possible inputs. If one is looking for a specific string, random generation of values will take a few thousand years even in one of the super computers.
In the chapter on concolic testing, we have seen how concolic tracing can offer a way out. We saw how concolic tracing can be implemented using direct information flows using the Python interpreter. However, there are two problems with this approach.
The first is that concolic tracing relies on the existence of sample inputs. What if one has no sample inputs?
Second, direct information flows could be unreliable if the program has indirect information flows such as those based on control flow.
In both cases, static code analysis can bridge the gap. However, that raises the question: Can we determine the complete behavior of the program by examining it statically, and check if it behaves unexpectedly under some (unknown) input or result in an unexpected output?
Symbolic execution is one of the ways that we can reason about the behavior of a program without executing it. A program is a computation that can be treated as a system of equations that obtains the output values from the given inputs. Executing the program symbolically – that is, solving these mathematically – along with any specified objective such as covering a particular branch or obtaining a particular output will get us inputs that can accomplish this task.
In this chapter, we investigate how symbolic execution can be implemented, and how it can be used to obtain interesting values for fuzzing.
Доступные форматы для скачивания:
Скачать видео mp4
-
Информация по загрузке: