@@ -10,8 +10,8 @@ use libafl::{
10
10
} ;
11
11
use libafl_bolts:: { rands:: StdRand , tuples:: tuple_list} ;
12
12
use libafl_qemu:: modules:: {
13
- asan:: AsanModule , asan_guest:: AsanGuestModule , cmplog:: CmpLogModule , DrCovModule ,
14
- InjectionModule ,
13
+ asan:: AsanModule , asan_guest:: AsanGuestModule , cmplog:: CmpLogModule ,
14
+ utils :: filters :: StdAddressFilter , DrCovModule , InjectionModule ,
15
15
} ;
16
16
17
17
use crate :: {
@@ -111,6 +111,17 @@ impl Client<'_> {
111
111
. client_description ( client_description)
112
112
. extra_tokens ( extra_tokens) ;
113
113
114
+ let asan_filter = if let Some ( include_asan) = & self . options . include_asan {
115
+ log:: info!( "ASAN includes: {include_asan:#x?}" ) ;
116
+ StdAddressFilter :: allow_list ( include_asan. to_vec ( ) )
117
+ } else if let Some ( exclude_asan) = & self . options . exclude_asan {
118
+ log:: info!( "ASAN excludes: {exclude_asan:#x?}" ) ;
119
+ StdAddressFilter :: deny_list ( exclude_asan. to_vec ( ) )
120
+ } else {
121
+ log:: info!( "ASAN no additional filter" ) ;
122
+ StdAddressFilter :: default ( )
123
+ } ;
124
+
114
125
if self . options . rerun_input . is_some ( ) {
115
126
if is_drcov {
116
127
// Special code path for re-running inputs with DrCov and Asan.
@@ -123,7 +134,13 @@ impl Client<'_> {
123
134
. filename( drcov. clone( ) )
124
135
. full_trace( true )
125
136
. build( ) ,
126
- unsafe { AsanModule :: builder( ) . env( & env) . asan_report( ) . build( ) }
137
+ unsafe {
138
+ AsanModule :: builder( )
139
+ . env( & env)
140
+ . filter( asan_filter)
141
+ . asan_report( )
142
+ . build( )
143
+ }
127
144
) ;
128
145
129
146
instance_builder. build ( ) . run ( args, modules, state)
@@ -133,7 +150,7 @@ impl Client<'_> {
133
150
. filename( drcov. clone( ) )
134
151
. full_trace( true )
135
152
. build( ) ,
136
- AsanGuestModule :: default ( & env) ,
153
+ AsanGuestModule :: new ( & env, asan_filter ) ,
137
154
) ;
138
155
139
156
instance_builder. build ( ) . run ( args, modules, state)
@@ -146,12 +163,17 @@ impl Client<'_> {
146
163
instance_builder. build ( ) . run ( args, modules, state)
147
164
}
148
165
} else if is_asan {
149
- let modules =
150
- tuple_list ! ( unsafe { AsanModule :: builder( ) . env( & env) . asan_report( ) . build( ) } ) ;
166
+ let modules = tuple_list ! ( unsafe {
167
+ AsanModule :: builder( )
168
+ . env( & env)
169
+ . filter( asan_filter)
170
+ . asan_report( )
171
+ . build( )
172
+ } ) ;
151
173
152
174
instance_builder. build ( ) . run ( args, modules, state)
153
175
} else if is_asan_guest {
154
- let modules = tuple_list ! ( AsanGuestModule :: default ( & env) ) ;
176
+ let modules = tuple_list ! ( AsanGuestModule :: new ( & env, asan_filter ) ) ;
155
177
156
178
instance_builder. build ( ) . run ( args, modules, state)
157
179
} else {
@@ -165,7 +187,7 @@ impl Client<'_> {
165
187
args,
166
188
tuple_list ! (
167
189
CmpLogModule :: default ( ) ,
168
- AsanModule :: builder( ) . env( & env) . build( ) ,
190
+ AsanModule :: builder( ) . env( & env) . filter ( asan_filter ) . build( ) ,
169
191
injection_module,
170
192
) ,
171
193
state,
@@ -175,7 +197,7 @@ impl Client<'_> {
175
197
args,
176
198
tuple_list ! (
177
199
CmpLogModule :: default ( ) ,
178
- AsanModule :: builder( ) . env( & env) . build( )
200
+ AsanModule :: builder( ) . env( & env) . filter ( asan_filter ) . build( )
179
201
) ,
180
202
state,
181
203
)
@@ -186,36 +208,44 @@ impl Client<'_> {
186
208
args,
187
209
tuple_list ! (
188
210
CmpLogModule :: default ( ) ,
189
- AsanGuestModule :: default ( & env) ,
211
+ AsanGuestModule :: new ( & env, asan_filter ) ,
190
212
injection_module
191
213
) ,
192
214
state,
193
215
)
194
216
} else {
195
217
instance_builder. build ( ) . run (
196
218
args,
197
- tuple_list ! ( CmpLogModule :: default ( ) , AsanGuestModule :: default ( & env) , ) ,
219
+ tuple_list ! (
220
+ CmpLogModule :: default ( ) ,
221
+ AsanGuestModule :: new( & env, asan_filter) ,
222
+ ) ,
198
223
state,
199
224
)
200
225
}
201
226
} else if is_asan {
202
227
if let Some ( injection_module) = injection_module {
203
228
instance_builder. build ( ) . run (
204
229
args,
205
- tuple_list ! ( AsanModule :: builder( ) . env( & env) . build( ) , injection_module) ,
230
+ tuple_list ! (
231
+ AsanModule :: builder( ) . env( & env) . filter( asan_filter) . build( ) ,
232
+ injection_module
233
+ ) ,
206
234
state,
207
235
)
208
236
} else {
209
237
instance_builder. build ( ) . run (
210
238
args,
211
- tuple_list ! ( AsanModule :: builder( ) . env( & env) . build( ) ) ,
239
+ tuple_list ! ( AsanModule :: builder( ) . env( & env) . filter ( asan_filter ) . build( ) ) ,
212
240
state,
213
241
)
214
242
}
215
243
} else if is_asan_guest {
216
- instance_builder
217
- . build ( )
218
- . run ( args, tuple_list ! ( AsanGuestModule :: default ( & env) ) , state)
244
+ instance_builder. build ( ) . run (
245
+ args,
246
+ tuple_list ! ( AsanGuestModule :: new( & env, asan_filter) ) ,
247
+ state,
248
+ )
219
249
} else if is_cmplog {
220
250
if let Some ( injection_module) = injection_module {
221
251
instance_builder. build ( ) . run (
0 commit comments