Skip to content

Taint propagation is blocked due to a reversed subtype check#214

Description

@yyzzcchh

馃摑 Overall Description

In Tai-e鈥檚 taint analysis, taint propagation across type cast is blocked due to a reversed subtype check in TypeFilter.

private boolean isAssignable(Type from, Type to) {
return (from instanceof NullType)
? to instanceof ReferenceType
: typeSystem.isSubtype(to, from);
}

A type cast such as:

public static void main(String[] args) {
    testTypeCast("test");
}

private static void testTypeCast(Object obj) {
    System.out.println((String) obj);
}

isSubtype(str, obj) fails the type filter, and taint propagation is incorrectly stopped.

The propagation works correctly after changing the code to isSubtype(from, to).

馃幆 Expected Behavior

Points-to sets of all variables
[]:<TypeCast: void main(java.lang.String[])>/%stringconst0 -> [[]:ConstantObj{java.lang.String: "test"}]
[]:<TypeCast: void main(java.lang.String[])>/args -> [[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0},type=java.lang.String[] in <TypeCast: void main(java.lang.String[])>}]
[]:<TypeCast: void testTypeCast(java.lang.Object)>/obj -> [[]:ConstantObj{java.lang.String: "test"}, []:TaintObj{alloc=<TypeCast: void testTypeCast(java.lang.Object)>/0,type=java.lang.Object}]
[]:<TypeCast: void testTypeCast(java.lang.Object)>/temp$0 -> []
[]:<TypeCast: void testTypeCast(java.lang.Object)>/temp$1 -> [[]:ConstantObj{java.lang.String: "test"}, []:TaintObj{alloc=<TypeCast: void testTypeCast(java.lang.Object)>/0,type=java.lang.Object}]

Points-to sets of all static fields
<java.lang.System: java.io.PrintStream out> -> []

Points-to sets of all instance fields

Points-to sets of all array indexes
[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0},type=java.lang.String[] in <TypeCast: void main(java.lang.String[])>}[] -> [[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0}[],type=java.lang.String in <TypeCast: void main(java.lang.String[])>}]

Detected 1 taint flow(s):
TaintFlow{<TypeCast: void testTypeCast(java.lang.Object)>/0 -> <TypeCast: void testTypeCast(java.lang.Object)>[2@L7] invokevirtual temp$0.println(temp$1)/0}

馃悰 Current Behavior

Points-to sets of all variables
[]:<TypeCast: void main(java.lang.String[])>/%stringconst0 -> [[]:ConstantObj{java.lang.String: "test"}]
[]:<TypeCast: void main(java.lang.String[])>/args -> [[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0},type=java.lang.String[] in <TypeCast: void main(java.lang.String[])>}]
[]:<TypeCast: void testTypeCast(java.lang.Object)>/obj -> [[]:ConstantObj{java.lang.String: "test"}, []:TaintObj{alloc=<TypeCast: void testTypeCast(java.lang.Object)>/0,type=java.lang.Object}]
[]:<TypeCast: void testTypeCast(java.lang.Object)>/temp$0 -> []
[]:<TypeCast: void testTypeCast(java.lang.Object)>/temp$1 -> [[]:ConstantObj{java.lang.String: "test"}]

Points-to sets of all static fields
<java.lang.System: java.io.PrintStream out> -> []

Points-to sets of all instance fields

Points-to sets of all array indexes
[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0},type=java.lang.String[] in <TypeCast: void main(java.lang.String[])>}[] -> [[]:EntryPointObj{alloc=MethodParam{<TypeCast: void main(java.lang.String[])>/0}[],type=java.lang.String in <TypeCast: void main(java.lang.String[])>}]

Detected 0 taint flow(s):

馃攧 Reproducible Example

class TypeCast {
    public static void main(String[] args) {
        testTypeCast("test");
    }

    private static void testTypeCast(Object obj) {
        System.out.println((String) obj);
    }
}

taint-config:

sources:
  - { kind: param, method: "<TypeCast: void testTypeCast(java.lang.Object)>", index: 0 }

sinks:
  - { method: "<java.io.PrintStream: void println(java.lang.String>", index: 0 }

call-site-mode: true

run args:
-cp classes -m TypeCast -ap -pp -a pta=taint-config:taint-config.yml;implicit-entries:false;only-app:true;

鈿欙笍 Tai-e Arguments

馃攳 Click here to see Tai-e Options
{{The content of 'output/options.yml' file}}
馃攳 Click here to see Tai-e Analysis Plan
{{The content of 'output/tai-e-plan.yml' file}}

馃摐 Tai-e Log

馃攳 Click here to see Tai-e Log
{{The content of 'output/tai-e.log' file}}

鈩癸笍 Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions