I ran into an issue where FlowDroid misses a leak if some statements that don't affect the propagation are added.
Please consider the following example-code where FlowDroid misses the sink at the end of onCreate:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> taint_list = new ArrayList<String>();
taint_list.add(source());
Integer unused = -1; // If this is removed (or changed to an int >= 0), the leak is detected
List<Boolean> unused2 = new ArrayList<Boolean>(); // If this is removed, the leak is detected
sink(taint_list);
}
public String source(){
return "Secret";
}
public void sink(List<String> param){
}
As annotated, if one of the two statements not related to the taint path is removed (or changed), FlowDroid finds the leak.
I run FlowDroid via the command-line tool with
java -jar ./soot-infoflow-cmd-2.13.0-jar-with-dependencies.jar \
-a {path-to-apk} \
-s ./SourcesAndSinks.xml \
-o ./out.xml \
-p {path-to-android-platforms-folder} \
--mergedexfiles
If relevant, my SourcesAndSinks.xml looks like this
<sinkSources>
<category id="NO_CATEGORY">
<method signature="com.example.testapp.MainActivity: java.lang.String source()">
<return type="java.lang.String">
<accessPath isSource="true" isSink="false">
</accessPath>
</return>
</method>
<method signature="com.example.testapp.MainActivity: void sink(java.util.List)">
<param index="0" type="java.util.List">
<accessPath isSource="false" isSink="true"/>
</param>
</method>
</category>
</sinkSources>
I ran into an issue where FlowDroid misses a leak if some statements that don't affect the propagation are added.
Please consider the following example-code where FlowDroid misses the sink at the end of
onCreate:As annotated, if one of the two statements not related to the taint path is removed (or changed), FlowDroid finds the leak.
I run FlowDroid via the command-line tool with
If relevant, my SourcesAndSinks.xml looks like this