├── .gitignore ├── README.md ├── README ├── image-20201005205535293.png ├── image-20201010164412564.png ├── image-20201010164818964.png ├── image-20201010165207853.png ├── image-20210918173747852.png └── image-20210918174110849.png ├── pom.xml ├── taint-benchmark-code ├── pom.xml └── src │ └── main │ ├── java │ └── top │ │ └── anemone │ │ └── taintbenchmark │ │ ├── Main.java │ │ ├── auxiliary │ │ ├── BadConstructor.java │ │ ├── BadContainer.java │ │ ├── BadPasser.java │ │ ├── BadSink.java │ │ ├── BadStaticSink.java │ │ ├── BadTransformer.java │ │ ├── CommandEngExecutor.java │ │ ├── Container.java │ │ ├── EngExecutor.java │ │ ├── GoodConstructor.java │ │ ├── GoodContainer.java │ │ ├── GoodPasser.java │ │ ├── GoodSink.java │ │ ├── GoodTransformer.java │ │ ├── InputEngExecutor.java │ │ ├── MyException.java │ │ ├── Sink.java │ │ ├── Transformer.java │ │ └── TransformerFactory.java │ │ ├── container │ │ ├── ListBad1.java │ │ ├── ListBad2.java │ │ ├── ListGood1.java │ │ ├── MapBad1.java │ │ ├── MapBad2.java │ │ ├── MapBad3.java │ │ ├── MapBad4.java │ │ ├── MapGood1.java │ │ └── MapGood2.java │ │ ├── contextsensitive │ │ ├── ContextBad1.java │ │ ├── ContextBad2.java │ │ ├── ContextBad3.java │ │ ├── ContextBad4.java │ │ ├── ContextBad5.java │ │ ├── ContextBad6.java │ │ ├── ContextGood1.java │ │ ├── ContextGood2.java │ │ ├── ContextGood3.java │ │ ├── ContextGood4.java │ │ ├── ContextGood5.java │ │ ├── ContextGood6.java │ │ ├── HeapBad1.java │ │ └── HeapGood1.java │ │ ├── convertchannel │ │ ├── ExceptionBad1.java │ │ ├── ExceptionBad2.java │ │ ├── ExceptionBad3.java │ │ ├── ExceptionGood2.java │ │ ├── ExceptionGood3.java │ │ ├── FlowEngineBad1.java │ │ ├── FlowEngineBad2.java │ │ ├── FlowEngineBad3.java │ │ ├── FlowEngineBad4.java │ │ ├── FlowEngineGood1.java │ │ ├── FlowEngineGood2.java │ │ ├── FlowEngineGood4.java │ │ ├── IfBad1.java │ │ └── IfGood1.java │ │ ├── differentscope │ │ └── thirdpartpkg │ │ │ ├── CommonPassBad1.java │ │ │ ├── CommonSinkBad1.java │ │ │ ├── ExeBad1.java │ │ │ ├── ExeBad2.java │ │ │ ├── ExeGood1_1.java │ │ │ ├── ExeGood1_2.java │ │ │ └── ExeGood2.java │ │ ├── fieldsensitive │ │ ├── FieldBad1.java │ │ ├── FieldBad2.java │ │ ├── FieldBad3.java │ │ ├── FieldBad4.java │ │ ├── FieldBad5.java │ │ ├── FieldGood1.java │ │ ├── FieldGood2.java │ │ ├── FieldGood3.java │ │ ├── FieldGood4.java │ │ ├── InterFieldBad1.java │ │ └── InterFieldGood1.java │ │ ├── flowsensitive │ │ ├── FactoryBad1.java │ │ ├── FactoryGood1.java │ │ ├── FlowBad1.java │ │ ├── FlowBad2_1.java │ │ ├── FlowBad2_2.java │ │ ├── FlowBad3.java │ │ ├── FlowBad4.java │ │ ├── FlowBad5.java │ │ ├── FlowBad6.java │ │ ├── FlowFieldBad4_1.java │ │ ├── FlowFieldBad4_2.java │ │ ├── FlowFieldBad5.java │ │ ├── FlowFieldBad6.java │ │ ├── FlowFieldBad7.java │ │ ├── FlowFieldBad8_1.java │ │ ├── FlowFieldBad8_2.java │ │ ├── FlowFieldBad9_1.java │ │ ├── FlowFieldBad9_2.java │ │ ├── FlowFieldGood4_1.java │ │ ├── FlowFieldGood4_2.java │ │ ├── FlowFieldGood5.java │ │ ├── FlowFieldGood7.java │ │ ├── FlowGood5.java │ │ └── FlowGood6.java │ │ ├── interprocedural │ │ ├── AbstractBad1.java │ │ ├── AbstractGood1.java │ │ ├── ConstructBad1.java │ │ ├── ConstructGood1.java │ │ ├── InterfaceBad1.java │ │ ├── InterfaceBad2.java │ │ ├── InterfaceBad3.java │ │ ├── InterfaceGood1.java │ │ ├── InterfaceGood2.java │ │ ├── InterfaceGood3.java │ │ ├── PointerBad1.java │ │ ├── PointerGood1.java │ │ ├── PointerGood2.java │ │ ├── PrivateBad1.java │ │ ├── PrivateGood1.java │ │ ├── RecursionBad1.java │ │ ├── StaticBad1.java │ │ ├── StaticBad2.java │ │ └── StaticGood1.java │ │ ├── intraprocedural │ │ ├── IntraBad1.java │ │ ├── IntraBad2.java │ │ └── IntraGood1.java │ │ ├── pathsensitive │ │ ├── BadNumPath1.java │ │ ├── BadNumPath2.java │ │ ├── BadStrPath2.java │ │ ├── GoodNumPath1.java │ │ ├── GoodNumPath2.java │ │ └── GoodStrPath2.java │ │ ├── soundiness │ │ └── reflect │ │ │ ├── ReflectBad1.java │ │ │ ├── ReflectBad2.java │ │ │ ├── ReflectGood1.java │ │ │ └── ReflectGood2.java │ │ ├── thread │ │ └── ThreadBad1.java │ │ └── withfrontend │ │ └── BadBackend.java │ └── resources │ └── test.html └── taint-benchmark-dep ├── pom.xml └── src └── main └── java └── top └── anemone └── taintbenchmarkdep ├── BadExecutor.java ├── ExeAgent1.java ├── ExeAgent2.java ├── Executor.java ├── GoodExecutor1.java └── GoodExecutor2.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.ipr 3 | *.iws 4 | target/ 5 | .idea/ 6 | codeqldb/ 7 | Fortify* 8 | .project 9 | .classpath 10 | .settings/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Intro 2 | taintbenchmark用于评估污点分析扫描器引擎的能力。 3 | 4 | 白盒扫描器的普遍使用污点分析技术,那么有两方面影响这扫描器的准确性:扫描器引擎本身(如是否支持准确的过程间分析)和规则完备性(如source、sink配置是否充分); 5 | 6 | 在相同benchmark上使用不同规则比较不同扫描器是无意义的。 7 | 8 | # 辅助类 9 | 10 | ## Transformer 11 | 12 | ![image-20201005205535293](README/image-20201005205535293.png) 13 | 14 | * [I] Transformer:Transformer接口实现`String transform(String from)`方法; 15 | * [C] GoodTransformer:transform方法返回固定字符串(不传播污点); 16 | * [C] BadTransformer:transform方法返回原字符串(传播污点); 17 | * [C] GoodConstructor:transform方法返回固定字符串,但其属性s保存有污点(不传播污点); 18 | * [C] GoodConstructor:transform方法返回属性s,其属性s保存有污点(传播污点); 19 | 20 | ## Container 21 | 22 | image-20201010164412564 23 | 24 | Container包含容器(污染)字段obj和安全字段clean,有setObj()和setSetObj()方法设置obj,有getObjObj(),getObjObjObj()方法获取obj,GoodContainer和BadContainer继承Container,区别在于GoodContainer获取info为安全字段,Bad获取obj。 25 | 26 | ## Passer 27 | 28 | image-20201010164818964 29 | 30 | BadPasser和GoodPasser都实现transform方法,区别在于其返回/不返回污点。 31 | 32 | ## Transformer 33 | 34 | ![image-20201010165207853](README/image-20201010165207853.png) 35 | 36 | * Transformer接口提供transform()方法; 37 | * BadTransformer和GoodTransformer实现该接口,GoodTransformer在方法中清洁污点; 38 | * BadConstructor和GoodConstructor实现该接口,在transform时返回s,GoodConstructor在初始化时清洁s。 39 | 40 | ## Sink 41 | 42 | ![image-20210918173747852](README/image-20210918173747852.png) 43 | 44 | * Sink 接口提供execute()方法; 45 | * BadSink 实现 SInk, 在execute()中进行命令执行; 46 | * GoodSink 实现 Sink, 在execute()中什么都不做. 47 | 48 | ## EngExecutor 49 | 50 | ![image-20210918174110849](README/image-20210918174110849.png) 51 | 52 | * EngExecutor 接口提供exec方法, 操作Containter中数据, 实现一个简单的流引擎; 53 | * InputEngExecutor 实现EngExecutor, 将Controller.clean中数据复制给Container.obj; 54 | * CommandEngExecutor 实现EngExecutor, 将Controller.obj中数据作为命令执行. 55 | 56 | # 测试套件 57 | 58 | ## 过程内分析(top.anemone.taintbenchmark.intraprocedural.*) 59 | 60 | (这里只测试最简单的过程内分析,各类敏感情况由其他测试套件测试) 61 | 62 | * IntraBad1:从用户输入读取source,返回到页面上,存在XSS漏洞; 63 | * IntraGood1:从用户输入读取source,随后source被赋值为安全数据,返回到页面上,不存在XSS漏洞; 64 | * IntraBad2:从用户输入读取source,经过append(),replace(),返回到页面上,存在XSS漏洞; 65 | 66 | ## 过程间分析(top.anemone.taintbenchmark.interprocedural.*) 67 | 68 | * PrivateBad1:source通过私有函数bad()函数传递,在sink点调用; 69 | * PrivateGood1:source通过私有函数good()函数清除污点,在sink点调用; 70 | * StaticBad1:source通过静态函数bad()函数传递,在sink点调用; 71 | * StaticGood1:source通过静态函数good()函数清除污点,在sink点调用; 72 | * StaticBad2: source通过静态函数BadStaticSink#execute()函数传递,在sink点调用; 73 | * AbstractBad1/AbstractGood1:初始化BadPasser/GoodPasser传递污点,在sink点调用; 74 | * ConstructBad1/ConstructGood1:初始化BadConstructor/GoodConstructor传递污点,在sink点调用; 75 | * InterfaceBad1/InterfaceGood1:初始化BadTransformer/GoodTransformer传递污点,在sink点调用; 76 | * InterfaceBad2/InterfaceGood2:构造匿名transformer,匿名transformer传递/不传递污点,在sink点调用; 77 | * InterfaceBad3/InterfaceGood3: 初始化 BadSink/GoodSink,实例化的sink决定是否有漏洞; 78 | * PointerBad1:构造Container c且c.obj->"clean",构造Container fakeGood且fakeGood.obj->c,构造Container bad且bad.obj->c,将bad.obj.obj->source,并在sink点取fakeGood.obj.obj; 79 | * PointerGood1:构造Container c且c.obj->source;构造Container good,good.obj->c;构造Container bad,bad.obj->c;将good.obj.obj->"clean",并在sink点取bad.obj.obj; 80 | 81 | ## 域敏感(top.anemone.taintbenchmark.fieldsensitive.*) 82 | 83 | * FieldBad1/FieldGood1:污点和安全数据分别存在container的obj和clean字段(set写入),在sink点取出obj/clean; 84 | * FieldBad2/FieldGood2:污点和安全数据分别存在container的obj和clean字段(构造函数写入),在sink点取出obj/clean; 85 | * FieldBad3/FieldGood3:污点和安全数据分别存在container的obj和clean字段,container位于类的私有变量,在sink点取出obj/clean; 86 | 87 | ## 上下文敏感(top.anemone.taintbenchmark.contextsensitive.*) 88 | 89 | * ContextBad1/ContextGood1:同时初始化BadTransformer和GoodTransformer,并经过`id()`函数返回,在sink点调用`BadTransformer/GoodTransformer.transform(source)`,因此存在/不存在漏洞; 90 | * ContextBad2/ContextGood2:BadTransformer和GoodTransformer 经过Container包装后返回,获取Bad/GoodTransformer的结果,因此存在/不存在漏洞,与ContextBad/Good1不同的是该用例检测1-object sensitive; 91 | * ContextBad3/ContextGood3:类似ContextBad/Good2,与ContextBad2不同是的是setObj()进行了1次封装,用于检测2-CFA; 92 | * ContextBad4/ContextGood4:类似ContextBad/Good2,,与ContextBad2不同是的是setObj()进行了2次封装,用于检测3-CFA; 93 | * ContextBad5/ContextGood5:类似ContextBad/Good2,,与ContextBad2不同是的是getObj()中新建了Container,用于检测2-object sensitive; 94 | * ContextBad6/ContextGood6:类似ContextBad/Good2,,与ContextBad2不同是的是getObjObj()中新建了两次Container,用于检测3-object sensitive; 95 | * HeapBad1/HeapGood1:BadTransformer和GoodTransformer经过newContainer()包装后返回,获取Bad/GoodTransformer的结果,因此存在/不存在漏洞,检测Heap sensitive; 96 | 97 | ## 流敏感(top.anemone.taintbenchmark.flowsensitive.*) 98 | 99 | * FlowBad1:三目操作符,污点有可能传递,因此存在漏洞; 100 | * FlowBad2:if判断,污点有可能传递,因此存在漏洞; 101 | * FlowBad3:while循环,污点传递,因此存在漏洞; 102 | * FlowBad4:for循环,污点传递,因此存在漏洞; 103 | * FlowBad5:source和清洁变量不交换,因此存在漏洞; 104 | * FlowBad6:循环清除污点,但终结时污点传递,因此存在漏洞; 105 | * FlowGood6:循环传递污点,但终结时清楚污点,因此存在漏洞; 106 | * FlowGood5:source和清洁变量交换,因此不存在漏洞; 107 | * FlowFieldBad4_1:source通过构造函数传入container的obj字段,再被sink调用,在调用后被清洁; 108 | * FlowFieldGood4_1:安全数据通过构造函数传入container的obj字段后被set()清除,再被sink调用,在调用后被污染; 109 | * FlowFieldBad4_2:source通过set()传入container的obj字段,再被sink调用,在调用后被清洁; 110 | * FlowFieldGood4_2:安全数据通过set()传入container的obj字段,再被sink调用,在调用后被污染; 111 | * FlowFieldBad5:当 a!=32 时取BadContainer,否则取GoodContainer,再从Container.getInfo()中获取污点/安全数据; 112 | * FlowFieldGood5:当 a==32 时取BadContainer,否则取GoodContainer,再从Container.getInfo()中获取污点/安全数据; 113 | * FlowFieldBad6:`outerContainer->badc; innerContainer->bad;outerContainer.obj->inner`,接着设置inner的obj为source,最后在sink获取badc.obj.obj(source); 114 | * FlowFieldBad7:初始化装载source和安全数据的container,假交换,在sink点获取抓那个在source的container; 115 | * FlowFieldGood7:初始化装载source和安全数据的container,之后交换,在sink点获取安全数据container; 116 | * FactoryBad1: 通过工厂方法获取BadTransformer,传递污点; 117 | * FactoryGood1: 通过工厂方法获取GoodTransformer,不传递污点; 118 | 119 | ## 路径敏感 120 | 121 | * BadNumPath1/GoodNumPath1: 若线性布尔算数表达式(Linear Boolean-Arithmetic Expression)为假则调用sink or 直接返回,注意该表达式永为 false; 122 | * BadNumPath2/GoodNumPath2: 若非线性布尔算数表达式(Non-linear Mixed Boolean-Arithmetic Expressions)为真则调用sink or 直接返回,注意该表达式永为true; 123 | * BadStrPath2/GoodStrPath2: 若字符串布尔表达式为真则调用sink or 直接返回, 注意该表达式永为 true; 124 | 125 | ## 容器类型(top.anemone.taintbenchmark.container.*) 126 | 127 | * ListBad1/ListGood1:污点存储在列表的第0个元素中,sink点取出第0/1个元素,因此存在/不存在漏洞; 128 | * ListBad2: 污点存在列表的第1个元素中, 删除列表第0个元素, 再取第0个元素执行, 因此存在漏洞; 129 | * MapBad1/MapGood1:污点存储在map的"source"键中,sink点取出"source"/"boo"键,因此存在/不存在漏洞; 130 | * MapBad2/MapGood2:污点存储在map的"source"键中,sink点取出"source"/"boo"键,因此存在/不存在漏洞,与MapBad1/MapGood1不同的是"source"键保存在变量中(`String s="source";map.put(s,taint)`); 131 | * MapBad3: 污点首先存储在map, 再将map存储到map1中, 在sink点取出map1中污点, 因此存在漏洞; 132 | * MapBad4: 污点首先存在map, 再用遍历的方式将其存储在map1中, 在sink点取出map1中污点, 因此存在漏洞; 133 | 134 | ## 隐藏信道(top.anemone.taintbenchmark.convertchannel.*) 135 | 136 | * ExceptionBad1:返回异常信息,由于异常信息中存在用户可控内容,因此存在漏洞; 137 | * ExceptionBad2/ExceptionGood2:返回自定义异常信息,由于异常信息中存在用户可控内容,因此存在漏洞; 138 | * ExceptionBad3:在catch处命中sink点,存在漏洞; 139 | * ExceptionGood3:在finally处清洁污点,不存在漏洞; 140 | * IfBad1/IfGood1:在if判断时对比输入是/否为"helloworld",若是/否,将其赋值为"helloworld",若能被成功赋值则不含漏洞; 141 | * FlowEngineBad1: 先用InputEngExecutor将污点从container.clean移动到container.obj, 在用CommandEngExecutor执行container.obj; 142 | * FlowEngineBad2: 与FlowEngineBad1类似, 但使用数组和循环实现两个EngExecutor的调用逻辑; 143 | * FlowEngineBad3: 与FlowEngineBad1类似, 但使用Map和数组实现两个EngExecutor的调用逻辑; 144 | * FlowEngineBad4: 与FlowEngineBad1类似, 但使用数组和if条件实现两个EngExecutor的调用逻辑; 145 | * FlowEngineGood1: 与FlowEngineBad1类似, 但先调用CommandEngExecutor, 故没有漏洞; 146 | * FlowEngineGood2: 与FlowEngineBad2 类似, 但先调用CommandEngExecutor, 故没有漏洞; 147 | * FlowEngineGood4: 与 FlowEngineBad4 类似, 但先调用CommandEngExecutor, 故没有漏洞; 148 | 149 | ## Soundiness 150 | ### Reflect(top.anemone.taintbenchmark.soundiness.reflect.*) 151 | * ReflectBad1/ReflectGood1:构造BadTransformer/GoodTransformer,使用反射调用其transform方法,传入sink; 152 | * ReflectBad2/ReflectGood2:反射获取BadTransformer/GoodTransformer,使用反射调用其transform方法,传入sink; 153 | 154 | ## 跨应用(top.anemone.taintbenchmark.differentscope.thirdpartpkg.*) 155 | * CommonPassBad1:污点通过org.apache.commons.exec.util.StringUtils#fixFileSeparatorChar()传递至sink; 156 | * CommonSinkBad1:污点通过org.apache.commons.exec.DefaultExecutor#execute(org.apache.commons.exec.CommandLine)执行; 157 | * ExeBad1:构造BadExecutor(Executor在另一模块中),污点传入BadExecutor后传入Runtime.exec(); 158 | * ExeGood1_1:构造GoodExecutor1,污点传入GoodExecutor1后在exe()中净化,不会传入Runtime.exec(); 159 | * ExeGood1_2:构造GoodExecutor2,污点传入GoodExecutor2后在getcmd()中被净化; 160 | * ExeBad2/ExeGood2:构造GoodExecutor2/GoodExecutor1为executor,构造ExeAgent2,将executor和污点传入Agent,Agent调用executor.exe(),造成/不造成漏洞; 161 | 162 | ## 多线程 163 | * ThreadBad1:存在两个线程ContentWriter和RespWriter,污点通过ContentWriter写入cache,再由RespWriter调用sink; 164 | 165 | # Source & Sink 166 | 167 | 本benchmark只会出现以下source&sink点: 168 | ## Source 169 | * javax.servlet.ServletRequest#getParameter 170 | ## Sink 171 | * org.apache.commons.exec.launcher.CommandLauncher#exec(org.apache.commons.exec.CommandLine, java.util.Map, java.io.File) 172 | * java.lang.Runtime#exec(java.lang.String) 173 | 174 | # TODO 175 | 176 | 吸收DroidBench中Reflect和General Java部分 177 | 178 | # Limitation 179 | 180 | * 无法测试大规模程序 181 | * 一些扫描器对函数调用深度、域敏感、上下文敏感深度有限制,本benchmark无法测试 182 | * 对于大规模程序扫描时长本benchmark无法测试 183 | 184 | # 相似项目 185 | 186 | * https://github.com/secure-software-engineering/DroidBench: Android benchmark,本项目吸收了其中很多case,然而该项目是针对Android,有很多Android特性,相比而言本项目面向web,代码更加简单,在测试扫描器时建议结合droidbench(尤其是general java部分)。 -------------------------------------------------------------------------------- /README/image-20201005205535293.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20201005205535293.png -------------------------------------------------------------------------------- /README/image-20201010164412564.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20201010164412564.png -------------------------------------------------------------------------------- /README/image-20201010164818964.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20201010164818964.png -------------------------------------------------------------------------------- /README/image-20201010165207853.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20201010165207853.png -------------------------------------------------------------------------------- /README/image-20210918173747852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20210918173747852.png -------------------------------------------------------------------------------- /README/image-20210918174110849.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anemone95/taint-benchmark/ba5f21ff08dd9a259a20c9e537aada33bed89902/README/image-20210918174110849.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | top.anemone 8 | taint-benchmark 9 | pom 10 | 1.0-SNAPSHOT 11 | 12 | 8.5.23 13 | 14 | 15 | 16 | org.apache.tomcat.embed 17 | tomcat-embed-core 18 | ${tomcat.version} 19 | 20 | 21 | org.apache.tomcat.embed 22 | tomcat-embed-jasper 23 | ${tomcat.version} 24 | 25 | 26 | org.apache.tomcat 27 | tomcat-jasper 28 | ${tomcat.version} 29 | 30 | 31 | org.apache.tomcat 32 | tomcat-jasper-el 33 | ${tomcat.version} 34 | 35 | 36 | org.apache.tomcat 37 | tomcat-jsp-api 38 | ${tomcat.version} 39 | 40 | 41 | 42 | embeddedTomcatSample 43 | 44 | 45 | org.codehaus.mojo 46 | appassembler-maven-plugin 47 | 2.0.0 48 | 49 | target 50 | 51 | 52 | launch.Main 53 | webapp 54 | 55 | 56 | 57 | 58 | 59 | package 60 | 61 | assemble 62 | 63 | 64 | 65 | 66 | 67 | org.apache.maven.plugins 68 | maven-compiler-plugin 69 | 70 | 8 71 | 8 72 | UTF-8 73 | 74 | 75 | 76 | 77 | 78 | taint-benchmark-dep 79 | taint-benchmark-code 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /taint-benchmark-code/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | taint-benchmark 7 | top.anemone 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | taint-benchmark-code 13 | 14 | 15 | 16 | org.reflections 17 | reflections 18 | 0.9.11 19 | 20 | 21 | javax.servlet 22 | javax.servlet-api 23 | 4.0.1 24 | 25 | 26 | org.apache.commons 27 | commons-exec 28 | 1.3 29 | 30 | 31 | top.anemone 32 | taint-benchmark-dep 33 | ${parent.version} 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/Main.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark; 2 | 3 | import org.apache.catalina.LifecycleException; 4 | import org.apache.catalina.WebResourceRoot; 5 | import org.apache.catalina.Wrapper; 6 | import org.apache.catalina.core.StandardContext; 7 | import org.apache.catalina.servlets.DefaultServlet; 8 | import org.apache.catalina.startup.Tomcat; 9 | import org.apache.catalina.webresources.DirResourceSet; 10 | import org.apache.catalina.webresources.StandardRoot; 11 | import org.reflections.Reflections; 12 | import top.anemone.taintbenchmark.auxiliary.Container; 13 | 14 | import javax.annotation.Resource; 15 | import javax.servlet.annotation.WebServlet; 16 | import javax.servlet.http.HttpServlet; 17 | import javax.servlet.http.HttpServletRequest; 18 | import javax.servlet.http.HttpServletResponse; 19 | import java.io.File; 20 | import java.io.IOException; 21 | import java.util.Set; 22 | 23 | 24 | public class Main extends HttpServlet { 25 | 26 | @Override 27 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 28 | response.setContentType("text/html;"); 29 | response.getWriter().write("index"); 30 | } 31 | 32 | public static void main(String[] args) throws Exception { 33 | 34 | Tomcat tomcat = new Tomcat(); 35 | // 设置主机名称 36 | tomcat.setHostname("localhost"); 37 | tomcat.setPort(8080); 38 | tomcat.setBaseDir(System.getProperty("user.dir")); 39 | StandardContext context = new StandardContext(); 40 | // 设置资源路径 41 | context.setDocBase(System.getProperty("user.dir") + "/taint-benchmark-code/src/main/resources".replace("/", "\\")); 42 | // 设置应用路径 43 | context.setPath("/"); 44 | context.addLifecycleListener(new Tomcat.FixContextListener()); 45 | // 将context加入tomcat 46 | tomcat.getHost().addChild(context); 47 | Wrapper testServlet = context.createWrapper(); 48 | testServlet.setName("DefaultServlet"); 49 | testServlet.setServletClass(DefaultServlet.class.getCanonicalName()); 50 | testServlet.addInitParameter("fork", "false"); 51 | testServlet.addInitParameter("listings", "true"); 52 | context.addChild(testServlet); 53 | context.addServletMapping("/", "DefaultServlet"); 54 | 55 | 56 | Reflections reflections = new Reflections("top.anemone.taintbenchmark"); 57 | //获取带Handler注解的类 58 | Set> classList = reflections.getTypesAnnotatedWith(javax.servlet.annotation.WebServlet.class); 59 | 60 | for (Class clazz : classList) { 61 | WebServlet declaredAnnotation = clazz.getDeclaredAnnotation(WebServlet.class); 62 | 63 | // 在context中创建表示servlet的Wrapper并返回 64 | Wrapper testServlet1 = context.createWrapper(); 65 | testServlet1.setName(clazz.getSimpleName()); 66 | testServlet1.setServletClass(clazz.getCanonicalName()); 67 | testServlet1.addInitParameter("fork", "false"); 68 | context.addChild(testServlet1); 69 | context.addServletMapping(declaredAnnotation.value()[0], clazz.getSimpleName()); 70 | } 71 | 72 | 73 | try { 74 | // 启动tomcat 75 | tomcat.start(); 76 | } catch (LifecycleException e) { 77 | e.printStackTrace(); 78 | } 79 | // 等待请求 80 | tomcat.getServer().await(); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadConstructor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class BadConstructor implements Transformer{ 4 | private String s; 5 | public BadConstructor(String s){ 6 | this.s=s; 7 | } 8 | 9 | public String transform(String from) { 10 | return s; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadContainer.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class BadContainer extends Container { 4 | 5 | public T getInfo() { 6 | return super.getObj(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadPasser.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class BadPasser { 4 | public String transform(String from){ 5 | return from; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadSink.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/25 16:14 8 | */ 9 | public class BadSink implements Sink { 10 | 11 | @Override 12 | public void execute(String cmd) throws IOException { 13 | Runtime.getRuntime().exec(cmd); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadStaticSink.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/25 16:31 8 | */ 9 | public class BadStaticSink { 10 | public static void execute(String cmd) throws IOException { 11 | Runtime.getRuntime().exec(cmd); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/BadTransformer.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class BadTransformer implements Transformer { 4 | public String transform(String from) { 5 | return from; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/CommandEngExecutor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/30 15:51 8 | */ 9 | public class CommandEngExecutor implements EngExecutor { 10 | 11 | @Override 12 | public void exec(Container container) throws IOException { 13 | Runtime.getRuntime().exec(container.obj); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/Container.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class Container { 4 | public T clean; 5 | public T obj; 6 | 7 | 8 | public Container(T obj, T clean) { 9 | this.obj = obj; 10 | this.clean = clean; 11 | } 12 | 13 | public Container() { 14 | } 15 | 16 | public T getObj() { 17 | return obj; 18 | } 19 | 20 | public void setSetSetObj(T obj) { 21 | setSetObj(obj); 22 | } 23 | 24 | public void setSetObj(T obj) { 25 | setObj(obj); 26 | } 27 | 28 | public void setObj(T obj) { 29 | this.obj = obj; 30 | } 31 | 32 | public T getClean() { 33 | return clean; 34 | } 35 | 36 | public void setClean(T clean) { 37 | this.clean = clean; 38 | } 39 | 40 | public T getInfo() { 41 | return this.obj; 42 | } 43 | 44 | 45 | public T getObjObj(T t) { 46 | Container c1 = new Container<>(); 47 | c1.setObj(t); 48 | return c1.getObj(); 49 | } 50 | 51 | public T getObjObjObj(T t) { 52 | Container c1 = new Container<>(); 53 | Container> c2 = new Container<>(); 54 | c1.setObj(t); 55 | c2.setObj(c1); 56 | return c2.getObj().getObj(); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/EngExecutor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/30 15:51 8 | */ 9 | public interface EngExecutor { 10 | void exec(Container container) throws IOException; 11 | } 12 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/GoodConstructor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class GoodConstructor implements Transformer{ 4 | private String s; 5 | public GoodConstructor(String s){ 6 | this.s="good"; 7 | } 8 | 9 | public String transform(String from) { 10 | return s; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/GoodContainer.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class GoodContainer extends Container { 4 | 5 | public T getInfo() { 6 | return super.getClean(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/GoodPasser.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class GoodPasser extends BadPasser { 4 | public String transform(String from){ 5 | return "good"; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/GoodSink.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/25 16:14 8 | */ 9 | public class GoodSink implements Sink { 10 | 11 | @Override 12 | public void execute(String cmd) throws IOException { 13 | System.out.println(cmd); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/GoodTransformer.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class GoodTransformer implements Transformer{ 4 | public String transform(String from) { 5 | return "clean"; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/InputEngExecutor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 4 | 5 | import java.io.IOException; 6 | 7 | /** 8 | * @author anemone(anemone95@qq.com) 9 | * @date 2021/8/30 15:51 10 | */ 11 | public class InputEngExecutor implements EngExecutor { 12 | 13 | @Override 14 | public void exec(Container container) throws IOException { 15 | container.obj=container.clean; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/MyException.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class MyException extends Exception { 4 | private String s; 5 | public MyException(String s){ 6 | this.s=s; 7 | } 8 | 9 | @Override 10 | public String toString() { 11 | return s; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/Sink.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * @author anemone(anemone95@qq.com) 7 | * @date 2021/8/25 16:14 8 | */ 9 | public interface Sink { 10 | void execute(String cmd) throws IOException; 11 | } 12 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/Transformer.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public interface Transformer { 4 | String transform(String from); 5 | } 6 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/auxiliary/TransformerFactory.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.auxiliary; 2 | 3 | public class TransformerFactory { 4 | public static Transformer getTransformer(String type){ 5 | if (type.equals("bad")){ 6 | return new BadTransformer(); 7 | } else { 8 | return new GoodTransformer(); 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/ListBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.LinkedList; 11 | import java.util.List; 12 | 13 | /** 14 | * 污点存储在列表的第0个元素中,sink点取出第0个元素,因此存在漏洞 15 | */ 16 | @WebServlet("/container/ListBad1") 17 | public class ListBad1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | List list=new LinkedList<>(); 25 | list.add(source); 26 | list.add("nonce"); 27 | Runtime.getRuntime().exec(list.get(0)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/ListBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.util.LinkedList; 10 | import java.util.List; 11 | 12 | /** 13 | * 污点存储在列表的第0个元素中,sink点取出第0个元素,因此存在漏洞 14 | */ 15 | @WebServlet("/container/ListBad1") 16 | public class ListBad2 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | List list=new LinkedList<>(); 24 | list.add("nonce"); 25 | list.add(source); 26 | list.remove(0); 27 | Runtime.getRuntime().exec(list.get(0)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/ListGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.LinkedList; 11 | import java.util.List; 12 | 13 | /** 14 | * 污点存储在列表的第0个元素中,sink点取出第1个元素,因此不存在漏洞 15 | */ 16 | @WebServlet("/container/ListGood1") 17 | public class ListGood1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | List list=new LinkedList<>(); 25 | list.add(source); 26 | list.add("nonce"); 27 | Runtime.getRuntime().exec(list.get(1)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | @WebServlet("/container/MapBad1") 14 | public class MapBad1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | Map map=new HashMap<>(); 22 | map.put("source",source); 23 | map.put("boo","bar"); 24 | Runtime.getRuntime().exec(map.get("source")); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | @WebServlet("/container/MapBad2") 14 | public class MapBad2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | Map map=new HashMap<>(); 22 | String s="source"; 23 | map.put(s,source); 24 | map.put("boo","bar"); 25 | Runtime.getRuntime().exec(map.get(s)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | @WebServlet("/container/MapBad1") 13 | public class MapBad3 extends HttpServlet { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | @Override 18 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 19 | String source = request.getParameter("source"); 20 | Map map=new HashMap<>(); 21 | map.put("source",source); 22 | map.put("boo","bar"); 23 | Map map1=new HashMap<>(); 24 | map1.putAll(map); 25 | Runtime.getRuntime().exec(map1.get("source")); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapBad4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | @WebServlet("/container/MapBad1") 13 | public class MapBad4 extends HttpServlet { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | @Override 18 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 19 | String source = request.getParameter("source"); 20 | Map map=new HashMap<>(); 21 | map.put("source",source); 22 | map.put("boo","bar"); 23 | Map map1=new HashMap<>(); 24 | for (String key: map.keySet()){ 25 | map1.put(key, map.get(key)); 26 | } 27 | Runtime.getRuntime().exec(map1.get("source")); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | @WebServlet("/container/MapGood1") 14 | public class MapGood1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | Map map=new HashMap<>(); 22 | map.put("source",source); 23 | map.put("boo","bar"); 24 | Runtime.getRuntime().exec(map.get("boo")); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/container/MapGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.container; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | @WebServlet("/container/MapGood2") 14 | public class MapGood2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | Map map=new HashMap<>(); 22 | String s="source"; 23 | map.put(s,source); 24 | map.put("boo","bar"); 25 | String k="source"; 26 | Runtime.getRuntime().exec(map.get(k)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 5 | import top.anemone.taintbenchmark.auxiliary.Transformer; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/ContextSensitive/ContextBad1") 15 | public class ContextBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | Transformer bt = new BadTransformer(); 23 | Transformer gt = new GoodTransformer(); 24 | Transformer pbt = id(bt); 25 | Transformer pgt = id(gt); 26 | 27 | Runtime.getRuntime().exec(pbt.transform(source)); // 获取bad transformer 28 | } 29 | 30 | /** 31 | * @param n=pbt,pgt 32 | * @return 33 | */ 34 | public Transformer id(Transformer n) { 35 | return n; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.*; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/ContextBad2") 13 | @SuppressWarnings("Duplicates") 14 | public class ContextBad2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | Transformer bt=new BadTransformer(); 23 | Transformer gt=new GoodTransformer(); 24 | Container cbt=new Container<>(); 25 | cbt.setObj(bt); 26 | Container cgt=new Container<>(); 27 | cgt.setObj(gt); 28 | 29 | 30 | Runtime.getRuntime().exec(cbt.getObj().transform(source)); // 获取bad transformer 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 6 | import top.anemone.taintbenchmark.auxiliary.Transformer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextBad3") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextBad3 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer bt=new BadTransformer(); 26 | Transformer gt=new GoodTransformer(); 27 | Container cbt=new Container<>(); 28 | cbt.setSetObj(bt); 29 | Container cgt=new Container<>(); 30 | cgt.setSetObj(gt); 31 | 32 | 33 | Runtime.getRuntime().exec(cbt.getObj().transform(source)); // 获取bad transformer 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.*; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/ContextBad4") 13 | @SuppressWarnings("Duplicates") 14 | public class ContextBad4 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | Transformer bt=new BadTransformer(); 23 | Transformer gt=new GoodTransformer(); 24 | Container cbt=new Container<>(); 25 | cbt.setSetSetObj(bt); 26 | Container cgt=new Container<>(); 27 | cgt.setSetSetObj(gt); 28 | 29 | 30 | Runtime.getRuntime().exec(cbt.getObj().transform(source)); // 获取bad transformer 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 5 | import top.anemone.taintbenchmark.auxiliary.Transformer; 6 | import top.anemone.taintbenchmark.auxiliary.*; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextBad5") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextBad5 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer bt=new BadTransformer(); 26 | Transformer gt=new GoodTransformer(); 27 | Container cbt=new Container<>(); 28 | Container cgt=new Container<>(); 29 | 30 | 31 | Runtime.getRuntime().exec(cbt.getObjObj(bt).transform(source)); // 获取bad transformer 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextBad6.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 6 | import top.anemone.taintbenchmark.auxiliary.Transformer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextBad6") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextBad6 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer bt=new BadTransformer(); 26 | Transformer gt=new GoodTransformer(); 27 | Container cbt=new Container<>(); 28 | Container cgt=new Container<>(); 29 | 30 | 31 | Runtime.getRuntime().exec(cbt.getObjObjObj(bt).transform(source)); // 获取bad transformer 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 5 | import top.anemone.taintbenchmark.auxiliary.Transformer; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/ContextSensitive/ContextGood1") 15 | public class ContextGood1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | 24 | Transformer bt = new BadTransformer(); 25 | Transformer gt = new GoodTransformer(); 26 | Transformer pbt = id(bt); 27 | Transformer pgt = id(gt); 28 | 29 | 30 | Runtime.getRuntime().exec(pgt.transform(source)); // 获取good transformer 31 | } 32 | 33 | /** 34 | * @param n=pbt,pgt 35 | * @return 36 | */ 37 | public Transformer id(Transformer n) { 38 | return n; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.*; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/ContextGood2") 13 | @SuppressWarnings("Duplicates") 14 | public class ContextGood2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * 误报说明上下文非敏感 20 | * @param request 21 | * @param response 22 | * @throws IOException 23 | */ 24 | @Override 25 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 26 | String source = request.getParameter("source"); 27 | 28 | Transformer bt=new BadTransformer(); 29 | Transformer gt=new GoodTransformer(); 30 | 31 | Container cbt=new Container<>(); 32 | cbt.setObj(bt); 33 | Container cgt=new Container<>(); 34 | cgt.setObj(gt); 35 | 36 | 37 | Runtime.getRuntime().exec(cgt.getObj().transform(source)); // 获取good transformer 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 6 | import top.anemone.taintbenchmark.auxiliary.Transformer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextGood3") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextGood3 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer bt=new BadTransformer(); 26 | Transformer gt=new GoodTransformer(); 27 | Container cbt=new Container<>(); 28 | cbt.setSetObj(bt); 29 | Container cgt=new Container<>(); 30 | cgt.setSetObj(gt); 31 | 32 | 33 | Runtime.getRuntime().exec(cgt.getObj().transform(source)); // 获取good transformer 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 6 | import top.anemone.taintbenchmark.auxiliary.Transformer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextGood4") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextGood4 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer bt=new BadTransformer(); 26 | Transformer gt=new GoodTransformer(); 27 | Container cbt=new Container<>(); 28 | cbt.setSetSetObj(bt); 29 | Container cgt=new Container<>(); 30 | cgt.setSetSetObj(gt); 31 | 32 | 33 | Runtime.getRuntime().exec(cgt.getObj().transform(source)); // 获取good transformer 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.*; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/ContextGood5") 13 | @SuppressWarnings("Duplicates") 14 | public class ContextGood5 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * 误报说明1-callsite 20 | * @param request 21 | * @param response 22 | * @throws IOException 23 | */ 24 | @Override 25 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 26 | String source = request.getParameter("source"); 27 | 28 | Transformer bt=new BadTransformer(); 29 | Transformer gt=new GoodTransformer(); 30 | Container cbt=new Container<>(); 31 | Container cgt=new Container<>(); 32 | 33 | 34 | Runtime.getRuntime().exec(cgt.getObjObj(gt).transform(source)); // 获取good transformer 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/ContextGood6.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 6 | import top.anemone.taintbenchmark.auxiliary.Transformer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/ContextSensitive/ContextGood6") 16 | @SuppressWarnings("Duplicates") 17 | public class ContextGood6 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | /** 22 | * 误报说明1-callsite 23 | * @param request 24 | * @param response 25 | * @throws IOException 26 | */ 27 | @Override 28 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 29 | String source = request.getParameter("source"); 30 | 31 | Transformer bt=new BadTransformer(); 32 | Transformer gt=new GoodTransformer(); 33 | Container cbt=new Container<>(); 34 | Container cgt=new Container<>(); 35 | 36 | 37 | Runtime.getRuntime().exec(cgt.getObjObjObj(gt).transform(source)); // 获取good transformer 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/HeapBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Container; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/HeapBad1") 13 | @SuppressWarnings("Duplicates") 14 | public class HeapBad1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | String clean = new String("clean"); 22 | Container bad=newContainer(source); 23 | Container good=newContainer(clean); 24 | 25 | 26 | 27 | Runtime.getRuntime().exec((String) bad.getObj()); // sink 28 | } 29 | 30 | private Container newContainer(String s) { 31 | Container c = new Container<>(); //这里未做heap sensitive那么任何上下文指向的对象永远为o34 32 | c.setObj(s); 33 | return c; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/contextsensitive/HeapGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.contextsensitive; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Container; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/ContextSensitive/HeapGood1") 13 | @SuppressWarnings("Duplicates") 14 | public class HeapGood1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | String clean = new String("clean"); 22 | Container bad=newContainer(source); 23 | Container good=newContainer(clean); 24 | 25 | 26 | 27 | Runtime.getRuntime().exec((String) good.getObj()); // sink 28 | } 29 | 30 | 31 | private Container newContainer(String s) { 32 | Container c = new Container<>(); //这里未做heap sensitive那么任何上下文指向的对象永远为o34 33 | c.setObj(s); 34 | return c; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/ExceptionBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.*; 8 | 9 | 10 | @WebServlet("/convertchannel/ExceptionBad1") 11 | public class ExceptionBad1 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | 19 | String ret="success"; 20 | 21 | try { 22 | FileInputStream file = new FileInputStream(source); 23 | } catch (IOException f) { // Not valid! 24 | ret=f.toString(); 25 | } 26 | 27 | 28 | Runtime.getRuntime().exec(ret); // sink 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/ExceptionBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.MyException; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | 13 | @WebServlet("/convertchannel/ExceptionBad2") 14 | public class ExceptionBad2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | String ret = "success"; 23 | 24 | try { 25 | getString(source); 26 | } catch (MyException f) { // Not valid! 27 | ret = f.toString(); 28 | } 29 | 30 | 31 | Runtime.getRuntime().exec(ret); // sink 32 | } 33 | 34 | private String getString(String s) throws MyException { 35 | throw new MyException(s); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/ExceptionBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | 11 | @WebServlet("/convertchannel/ExceptionBad3") 12 | public class ExceptionBad3 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | String ret="clean"; 21 | try { 22 | ret=source; 23 | throw new RuntimeException(); 24 | } catch (RuntimeException f) { // Not valid! 25 | 26 | Runtime.getRuntime().exec(ret); // sink 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/ExceptionGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.MyException; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | 13 | @WebServlet("/convertchannel/ExceptionGood3") 14 | public class ExceptionGood2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | String ret = "success"; 23 | 24 | try { 25 | getString(source); 26 | } catch (MyException f) { // Not valid! 27 | ret = f.toString(); 28 | } 29 | 30 | 31 | Runtime.getRuntime().exec(ret); // sink 32 | } 33 | 34 | private String getString(String s) throws MyException { 35 | throw new MyException("clean"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/ExceptionGood3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.FileInputStream; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | 12 | @WebServlet("/convertchannel/ExceptionGood3") 13 | public class ExceptionGood3 extends HttpServlet { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | @Override 18 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 19 | String source = request.getParameter("source"); 20 | 21 | String ret = "success"; 22 | 23 | try { 24 | FileInputStream file = new FileInputStream(source); 25 | } catch (IOException f) { // Not valid! 26 | ret = f.toString(); 27 | } finally { 28 | ret = "success"; 29 | } 30 | 31 | Runtime.getRuntime().exec(ret); // sink 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * @author anemone(anemone95 @ qq.com) 15 | * @date 2021/8/31 17:47 16 | */ 17 | 18 | @WebServlet("/convertchannel/FlowEngineBad1") 19 | public class FlowEngineBad1 extends HttpServlet { 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | Container container = new Container<>(); 25 | container.clean = source; 26 | new InputEngExecutor().exec(container); 27 | new CommandEngExecutor().exec(container); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 6 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | 14 | /** 15 | * @author anemone(anemone95 @ qq.com) 16 | * @date 2021/8/31 17:47 17 | */ 18 | 19 | @WebServlet("/convertchannel/FlowEngineBad2") 20 | public class FlowEngineBad2 extends HttpServlet { 21 | 22 | @Override 23 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 24 | String source = request.getParameter("source"); 25 | Container container = new Container<>(); 26 | container.clean = source; 27 | // In fact, many frameworks use annotation to register their executors, which makes SCA harder to deal with. 28 | EngExecutor[] executors = {new InputEngExecutor(), new CommandEngExecutor()}; 29 | for (EngExecutor e : executors) { 30 | e.exec(container); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 6 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | /** 17 | * @author anemone(anemone95@qq.com) 18 | * @date 2021/8/31 17:47 19 | */ 20 | 21 | @WebServlet("/convertchannel/FlowEngineBad3") 22 | public class FlowEngineBad3 extends HttpServlet { 23 | 24 | @Override 25 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 26 | String source = request.getParameter("source"); 27 | Container container=new Container<>(); 28 | container.clean=source; 29 | Map executorMap=new HashMap<>(); 30 | executorMap.put("input", new InputEngExecutor()); 31 | executorMap.put("command", new CommandEngExecutor()); 32 | String[] seq={"input", "command"}; 33 | for (String e : seq) { 34 | executorMap.get(e).exec(container); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineBad4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 6 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | /** 17 | * @author anemone(anemone95@qq.com) 18 | * @date 2021/8/31 17:47 19 | */ 20 | 21 | @WebServlet("/convertchannel/FlowEngineBad4") 22 | public class FlowEngineBad4 extends HttpServlet { 23 | 24 | @Override 25 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 26 | String source = request.getParameter("source"); 27 | Container container=new Container<>(); 28 | container.clean=source; 29 | EngExecutor inputExecutor = new InputEngExecutor(); 30 | EngExecutor commandExecutor = new CommandEngExecutor(); 31 | String[] seq = {"input", "command"}; 32 | for (String e : seq) { 33 | if (e.equals("command")){ 34 | commandExecutor.exec(container); 35 | } else if (e.equals("input")){ 36 | inputExecutor.exec(container); 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * @author anemone(anemone95@qq.com) 15 | * @date 2021/8/31 17:47 16 | */ 17 | 18 | @WebServlet("/convertchannel/FlowEngineGood1") 19 | public class FlowEngineGood1 extends HttpServlet { 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | Container container=new Container<>(); 25 | container.clean=source; 26 | new CommandEngExecutor().exec(container); 27 | new InputEngExecutor().exec(container); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 6 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | 14 | /** 15 | * @author anemone(anemone95@qq.com) 16 | * @date 2021/8/31 17:47 17 | */ 18 | 19 | @WebServlet("/convertchannel/FlowEngineGood2") 20 | public class FlowEngineGood2 extends HttpServlet { 21 | 22 | @Override 23 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 24 | String source = request.getParameter("source"); 25 | Container container=new Container<>(); 26 | container.clean=source; 27 | // In fact, many frameworks use annotation to register their executors, which makes SCA harder to deal with. 28 | EngExecutor[] executors={new CommandEngExecutor(), new InputEngExecutor()}; 29 | for (EngExecutor e : executors) { 30 | e.exec(container); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/FlowEngineGood4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.CommandEngExecutor; 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | import top.anemone.taintbenchmark.auxiliary.EngExecutor; 6 | import top.anemone.taintbenchmark.auxiliary.InputEngExecutor; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | 14 | /** 15 | * @author anemone(anemone95@qq.com) 16 | * @date 2021/8/31 17:47 17 | */ 18 | 19 | @WebServlet("/convertchannel/FlowEngineGood4") 20 | public class FlowEngineGood4 extends HttpServlet { 21 | 22 | @Override 23 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 24 | String source = request.getParameter("source"); 25 | Container container=new Container<>(); 26 | container.clean=source; 27 | EngExecutor inputExecutor = new InputEngExecutor(); 28 | EngExecutor commandExecutor = new CommandEngExecutor(); 29 | String[] seq = {"command", "input"}; 30 | for (String e : seq) { 31 | if (e.equals("command")) { 32 | commandExecutor.exec(container); 33 | } else if (e.equals("input")) { 34 | inputExecutor.exec(container); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/IfBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/convertchannel/IfBad1") 12 | public class IfBad1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | 21 | if (source.equals("hello world")) { 22 | source = "hello world"; 23 | } 24 | Runtime.getRuntime().exec(source); // sink 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/convertchannel/IfGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.convertchannel; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/convertchannel/IfGood1") 12 | public class IfGood1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | 21 | if (!source.equals("hello world")) { 22 | source = "hello world"; 23 | } 24 | Runtime.getRuntime().exec(source); // sink 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/CommonPassBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | 4 | import org.apache.commons.exec.util.StringUtils; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | 14 | @WebServlet("/ThirdPart/CommonPassBad1") 15 | public class CommonPassBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | String res= StringUtils.fixFileSeparatorChar(source); 24 | 25 | Runtime.getRuntime().exec(res); // sink 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/CommonSinkBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | 4 | import org.apache.commons.exec.CommandLine; 5 | import org.apache.commons.exec.DefaultExecutor; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | 15 | @WebServlet("/ThirdPart/CommonSinkBad1") 16 | public class CommonSinkBad1 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | CommandLine cmd=CommandLine.parse(source); 25 | int i=new DefaultExecutor().execute(cmd); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/ExeBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | import top.anemone.taintbenchmarkdep.BadExecutor; 4 | import top.anemone.taintbenchmarkdep.ExeAgent1; 5 | import top.anemone.taintbenchmarkdep.Executor; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/ThirdPart/ExeBad1") 15 | public class ExeBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Executor e=new BadExecutor(); 24 | e.setcmd(source); 25 | ExeAgent1 exeAgent1=new ExeAgent1(); 26 | exeAgent1.exe(e); //sink 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/ExeBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | import top.anemone.taintbenchmarkdep.*; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | @WebServlet("/intraprocedural/IntraBad1") 13 | public class ExeBad2 extends HttpServlet { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | @Override 18 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 19 | String source = request.getParameter("source"); 20 | 21 | Executor e=new GoodExecutor2(); 22 | e.setcmd(source); 23 | ExeAgent2 exeAgent2=new ExeAgent2(); 24 | exeAgent2.exe(e,source); //sink 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/ExeGood1_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | import top.anemone.taintbenchmarkdep.ExeAgent1; 4 | import top.anemone.taintbenchmarkdep.Executor; 5 | import top.anemone.taintbenchmarkdep.GoodExecutor1; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/intraprocedural/IntraBad1") 15 | public class ExeGood1_1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Executor e=new GoodExecutor1(); 24 | e.setcmd(source); 25 | ExeAgent1 exeAgent1=new ExeAgent1(); 26 | exeAgent1.exe(e); //sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/ExeGood1_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | import top.anemone.taintbenchmarkdep.ExeAgent1; 4 | import top.anemone.taintbenchmarkdep.Executor; 5 | import top.anemone.taintbenchmarkdep.GoodExecutor2; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/intraprocedural/IntraBad1") 15 | public class ExeGood1_2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Executor e=new GoodExecutor2(); 24 | e.setcmd(source); 25 | ExeAgent1 exeAgent1=new ExeAgent1(); 26 | exeAgent1.exe(e); //sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/differentscope/thirdpartpkg/ExeGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.differentscope.thirdpartpkg; 2 | 3 | import top.anemone.taintbenchmarkdep.ExeAgent2; 4 | import top.anemone.taintbenchmarkdep.Executor; 5 | import top.anemone.taintbenchmarkdep.GoodExecutor1; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/ThirdPart/ExeGood2") 15 | public class ExeGood2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Executor e=new GoodExecutor1(); 24 | e.setcmd(source); 25 | ExeAgent2 exeAgent2=new ExeAgent2(); 26 | exeAgent2.exe(e,source); //sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldBad1") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Container a = new Container<>(); 24 | a.setObj(source); 25 | a.setClean("clean"); 26 | 27 | Runtime.getRuntime().exec(a.getObj()); // sink 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldBad2") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldBad2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Container a = new Container<>(source,"clean"); 24 | 25 | Runtime.getRuntime().exec(a.getObj()); // sink 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldBad3") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldBad3 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | private Container c; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | c=new Container<>(); 26 | c.setObj(source); 27 | c.setClean("clean"); 28 | 29 | Runtime.getRuntime().exec(c.getObj()); // sink 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldBad4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | @WebServlet("/FieldSensitive/FieldBad4") 13 | @SuppressWarnings("Duplicates") 14 | public class FieldBad4 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | Container c=new Container<>(); 23 | Container> c2=new Container<>(); 24 | Container> c3; 25 | c.setObj("clean"); 26 | c2.setObj(c); 27 | c3=c2; 28 | c3.getObj().setObj(source); 29 | 30 | Runtime.getRuntime().exec(c2.getObj().getObj()); // sink 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldBad5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | @WebServlet("/FieldSensitive/FieldBad5") 13 | @SuppressWarnings("Duplicates") 14 | public class FieldBad5 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | Container c=new Container<>(); 23 | Container c2=c; 24 | c2.obj=source; 25 | 26 | Runtime.getRuntime().exec(c.obj); // sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldGood1") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldGood1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Container a = new Container<>(); 24 | a.setObj(source); 25 | a.setClean("clean"); 26 | 27 | Runtime.getRuntime().exec(a.getClean()); // sink 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldGood2") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldGood2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Container a = new Container<>(source,"clean"); 24 | 25 | Runtime.getRuntime().exec(a.getClean()); // sink 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldGood3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/FieldSensitive/FieldGood3") 14 | @SuppressWarnings("Duplicates") 15 | public class FieldGood3 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | private Container c; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | c=new Container<>(); 26 | c.setObj(source); 27 | c.setClean("clean"); 28 | 29 | Runtime.getRuntime().exec(c.getClean()); // sink 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/FieldGood4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | @WebServlet("/FieldSensitive/FieldGood4") 13 | @SuppressWarnings("Duplicates") 14 | public class FieldGood4 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | Container c=new Container<>(); 23 | Container> c2=new Container<>(); 24 | Container> c3; 25 | c.setObj(source); 26 | c2.setObj(c); 27 | c3=c2; 28 | c3.getObj().setObj("clean"); 29 | 30 | Runtime.getRuntime().exec(c2.getObj().getObj()); // sink 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/InterFieldBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | @WebServlet("/FieldSensitive/FieldBad1") 13 | @SuppressWarnings("Duplicates") 14 | public class InterFieldBad1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | Container a = new Container<>(); 23 | a.setObj("clean"); 24 | a.setClean("clean"); 25 | put(a, source); 26 | 27 | Runtime.getRuntime().exec(a.getObj()); // sink 28 | } 29 | private void put(Container c, String s){ 30 | c.setObj(s); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/fieldsensitive/InterFieldGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.fieldsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | 12 | @WebServlet("/FieldSensitive/FieldBad1") 13 | @SuppressWarnings("Duplicates") 14 | public class InterFieldGood1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | 22 | Container a = new Container<>(); 23 | a.setObj("clean"); 24 | a.setClean("clean"); 25 | put(a, source); 26 | 27 | Runtime.getRuntime().exec(a.getObj()); // sink 28 | } 29 | private void put(Container c, String s){ 30 | c.setClean(s); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FactoryBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | import top.anemone.taintbenchmark.auxiliary.TransformerFactory; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/Factory/IntraBad1") 15 | public class FactoryBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Transformer t = TransformerFactory.getTransformer("bad"); 24 | 25 | Runtime.getRuntime().exec(t.transform(source)); // sink 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FactoryGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | import top.anemone.taintbenchmark.auxiliary.TransformerFactory; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/Factory/IntraBad1") 15 | public class FactoryGood1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Transformer t = TransformerFactory.getTransformer("good"); 24 | 25 | Runtime.getRuntime().exec(t.transform(source)); // sink 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad1") 11 | public class FlowBad1 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | source = request.getParameter("fromp").equals("true") ? source : "clean"; 19 | 20 | 21 | Runtime.getRuntime().exec(source); // sink 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad2_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad2-1") 11 | public class FlowBad2_1 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | String ret; 19 | if (request.getParameter("fromp").equals("true")){ 20 | ret=source; 21 | } else { 22 | ret="clean"; 23 | } 24 | 25 | 26 | Runtime.getRuntime().exec(ret); // sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad2_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad2") 11 | public class FlowBad2_2 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | String ret; 19 | if (request.getParameter("fromp").equals("true")){ 20 | ret="clean"; 21 | } else { 22 | ret=source; 23 | } 24 | 25 | 26 | Runtime.getRuntime().exec(ret); // sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad3") 11 | public class FlowBad3 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | String ret = source; 19 | int cnt = 0; 20 | while (cnt < 0) { 21 | ret = "clean"; 22 | cnt++; 23 | } 24 | 25 | 26 | Runtime.getRuntime().exec(ret); // sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad4.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad4") 11 | public class FlowBad4 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | String ret = source; 19 | for (int i=0;i<0;i++){ 20 | ret = "clean"; 21 | } 22 | 23 | 24 | Runtime.getRuntime().exec(ret); // sink 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/flow/FlowBad5") 12 | public class FlowBad5 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 16 | String source = request.getParameter("source"); 17 | 18 | String fakeClean="clean"; 19 | String tmp; 20 | // fakeSource, fakeClean=fakeClean, fakeSource 21 | tmp=source; 22 | fakeClean=tmp; 23 | source=fakeClean; 24 | 25 | 26 | Runtime.getRuntime().exec(source); // get source 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowBad6.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad1") 11 | public class FlowBad6 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | 19 | String ret; 20 | for (int i = 0; ; i++) { 21 | if (i==4){ 22 | ret = source; 23 | break; 24 | } 25 | ret = "clean"; 26 | } 27 | Runtime.getRuntime().exec(source); // sink 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad4_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad4_1") 14 | @SuppressWarnings("Duplicates") 15 | public class FlowFieldBad4_1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | private Container c; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | c=new Container<>(source,"boo"); 26 | c.setObj(source); 27 | 28 | Runtime.getRuntime().exec(c.getObj()); // sink before clean 29 | c.setObj("clean"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad4_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad4_2") 14 | @SuppressWarnings("Duplicates") 15 | public class FlowFieldBad4_2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | private Container c; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | c=new Container<>(source,"boo"); 26 | 27 | Runtime.getRuntime().exec(c.getObj()); // sink before clean 28 | c.setObj("clean"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.BadContainer; 5 | import top.anemone.taintbenchmark.auxiliary.Container; 6 | import top.anemone.taintbenchmark.auxiliary.GoodContainer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/flow/FlowFieldBad5") 16 | public class FlowFieldBad5 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Container c; 26 | int a = 31 + 1; 27 | if (a == 32) { 28 | c = new BadContainer<>(); 29 | } else { 30 | c = new GoodContainer<>(); 31 | } 32 | c.setObj(source); 33 | c.setClean("clean"); 34 | 35 | Runtime.getRuntime().exec(c.getInfo()); // sink 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad6.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad6") 14 | public class FlowFieldBad6 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | 23 | Container inner; 24 | Container> outer; 25 | Container good=new Container<>(); 26 | Container bad=new Container<>(); 27 | Container> goodc=new Container<>(); 28 | Container> badc=new Container<>(); 29 | int a = 31 + 1; 30 | if (a == 32) { 31 | outer=badc; 32 | inner=bad; 33 | } else { 34 | outer=goodc; 35 | inner=good; 36 | } 37 | outer.obj=inner; 38 | inner.setObj(source); 39 | Runtime.getRuntime().exec(badc.getObj().getObj()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad7.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad7") 14 | public class FlowFieldBad7 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container bad, fakeClean, tmp; 21 | bad=new Container<>(source,source); 22 | fakeClean=new Container<>("clean","clean"); 23 | tmp=bad; 24 | fakeClean=tmp; 25 | bad=fakeClean; 26 | 27 | Runtime.getRuntime().exec(bad.obj); // get clean 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad8_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad7") 14 | public class FlowFieldBad8_1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container bad = new Container<>(); 21 | if (source.startsWith("aaa")){ 22 | bad.obj=source; 23 | }else { 24 | bad.obj="Clean"; 25 | } 26 | 27 | 28 | Runtime.getRuntime().exec(bad.obj); // get clean 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad8_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.util.Random; 12 | 13 | @WebServlet("/flow/FlowFieldBad8_2") 14 | public class FlowFieldBad8_2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container bad = new Container<>(); 21 | if (new Random().nextFloat()<0.5){ 22 | bad.obj="Clean"; 23 | }else { 24 | bad.obj=source; 25 | } 26 | 27 | 28 | Runtime.getRuntime().exec(bad.obj); // get clean 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad9_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.util.Random; 12 | 13 | @WebServlet("/flow/FlowFieldBad7") 14 | public class FlowFieldBad9_1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container bad = new Container<>(); 21 | Container bad2 = bad; 22 | 23 | if (new Random().nextFloat()<0.5){ 24 | bad2.obj=source; 25 | }else { 26 | bad2.obj="Clean"; 27 | } 28 | 29 | Runtime.getRuntime().exec(bad.obj); // get clean 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldBad9_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.util.Random; 12 | 13 | @WebServlet("/flow/FlowFieldBad7") 14 | public class FlowFieldBad9_2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container bad = new Container<>(); 21 | Container bad2 = bad; 22 | 23 | if (new Random().nextFloat()<0.5){ 24 | bad2.obj="Clean"; 25 | }else { 26 | bad2.obj=source; 27 | } 28 | 29 | Runtime.getRuntime().exec(bad.obj); // get clean 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldGood4_1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldBad4_1") 14 | public class FlowFieldGood4_1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | private Container c; 18 | 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | c=new Container<>(source,"boo"); 25 | c.setObj("clean"); 26 | 27 | Runtime.getRuntime().exec(c.getObj()); // sink before taint 28 | c.setObj(source); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldGood4_2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldGood4_2") 14 | public class FlowFieldGood4_2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | private Container c; 18 | 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | c=new Container<>("foo","bar"); 25 | 26 | Runtime.getRuntime().exec(c.getObj()); // sink before taint 27 | c.setObj(source); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldGood5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.BadContainer; 5 | import top.anemone.taintbenchmark.auxiliary.Container; 6 | import top.anemone.taintbenchmark.auxiliary.GoodContainer; 7 | 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | @WebServlet("/flow/FlowFieldGood5") 16 | public class FlowFieldGood5 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Container c; 26 | int a = 31 + 1; 27 | if (a != 32) { 28 | c = new BadContainer<>(); 29 | } else { 30 | c = new GoodContainer<>(); 31 | } 32 | c.setObj(source); 33 | c.setClean("clean"); 34 | 35 | Runtime.getRuntime().exec(c.getInfo()); // sink 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowFieldGood7.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/flow/FlowFieldGood7") 14 | public class FlowFieldGood7 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | Container fakeBad, fakeClean, tmp; 21 | fakeBad=new Container<>(source,source); 22 | fakeClean=new Container<>("clean","clean"); 23 | tmp=fakeBad; 24 | fakeBad=fakeClean; 25 | fakeClean=tmp; 26 | 27 | Runtime.getRuntime().exec(fakeBad.obj); // get clean 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowGood5.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/flow/FlowGood5") 12 | public class FlowGood5 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 16 | String fakeSource = request.getParameter("source"); 17 | 18 | String fakeClean="clean"; 19 | String tmp; 20 | // fakeSource, fakeClean=fakeClean, fakeSource 21 | tmp=fakeSource; 22 | fakeSource=fakeClean; 23 | fakeClean=tmp; 24 | 25 | 26 | Runtime.getRuntime().exec(fakeSource); // get clean 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/flowsensitive/FlowGood6.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.flowsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.io.PrintWriter; 9 | 10 | @WebServlet("/flow/FlowBad1") 11 | public class FlowGood6 extends HttpServlet { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | @Override 16 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 | String source = request.getParameter("source"); 18 | 19 | String ret; 20 | for (int i = 0; ; i++) { 21 | if (i==4){ 22 | ret = "clean"; 23 | break; 24 | } 25 | ret = source; 26 | } 27 | Runtime.getRuntime().exec(source); // sink 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/AbstractBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.BadPasser; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/IntraProcedural/IntraBad1") 15 | public class AbstractBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 21 | String source = request.getParameter("source"); 22 | 23 | BadPasser passer=new BadPasser(); 24 | source=passer.transform(source); 25 | 26 | Runtime.getRuntime().exec(source); // sink 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/AbstractGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.BadPasser; 5 | import top.anemone.taintbenchmark.auxiliary.GoodPasser; 6 | 7 | import javax.servlet.ServletException; 8 | import javax.servlet.annotation.WebServlet; 9 | import javax.servlet.http.HttpServlet; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | /** 16 | * 该类误报很可能扫描器使用CHA构建调用图 17 | */ 18 | @WebServlet("/InterProcedural/AbstractGood1") 19 | public class AbstractGood1 extends HttpServlet { 20 | 21 | private static final long serialVersionUID = 1L; 22 | 23 | @Override 24 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 | String source = request.getParameter("source"); 26 | 27 | BadPasser passer=new GoodPasser(); 28 | source=passer.transform(source); 29 | 30 | Runtime.getRuntime().exec(source); // sink 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/ConstructBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadConstructor; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | /** 14 | * 该类误报很可能扫描器使用CHA构建调用图 15 | */ 16 | @WebServlet("/IntraProcedural/ConstructBad1") 17 | public class ConstructBad1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer constructor=new BadConstructor(source); 26 | source = constructor.transform("nonce"); 27 | 28 | Runtime.getRuntime().exec(source); // sink 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/ConstructGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.GoodConstructor; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | /** 14 | * 该类误报很可能扫描器使用CHA构建调用图 15 | */ 16 | @WebServlet("/IntraProcedural/ConstructGood1") 17 | public class ConstructGood1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer constructor=new GoodConstructor(source); 26 | source = constructor.transform("nonce"); 27 | 28 | Runtime.getRuntime().exec(source); // sink 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | /** 14 | * 该类误报很可能扫描器使用CHA构建调用图 15 | */ 16 | @WebServlet("/IntraProcedural/InterfaceBad1") 17 | public class InterfaceBad1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer transformer=new BadTransformer(); 26 | source = transformer.transform(source); 27 | 28 | Runtime.getRuntime().exec(source); // sink 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Transformer; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | /** 13 | * 该类误报很可能扫描器使用CHA构建调用图 14 | */ 15 | @WebServlet("/IntraProcedural/InterfaceBad2") 16 | public class InterfaceBad2 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | Transformer transformer=new Transformer() { 25 | @Override 26 | public String transform(String from) { 27 | return from; 28 | } 29 | }; 30 | source = transformer.transform(source); 31 | 32 | Runtime.getRuntime().exec(source); // sink 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceBad3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadSink; 4 | import top.anemone.taintbenchmark.auxiliary.Sink; 5 | import top.anemone.taintbenchmark.auxiliary.Transformer; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | /** 15 | * 该类误报很可能扫描器使用CHA构建调用图 16 | */ 17 | @WebServlet("/IntraProcedural/InterfaceBad3") 18 | public class InterfaceBad3 extends HttpServlet { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | @Override 23 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 24 | String source = request.getParameter("source"); 25 | Sink sink=new BadSink(); 26 | sink.execute(source); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | /** 14 | * 该类误报很可能扫描器使用CHA构建调用图 15 | */ 16 | @WebServlet("/InterProcedural/InterfaceGood1") 17 | public class InterfaceGood1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | Transformer transformer=new GoodTransformer(); 26 | source = transformer.transform(source); 27 | 28 | Runtime.getRuntime().exec(source); // sink 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Transformer; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | 12 | /** 13 | * 该类误报很可能扫描器使用CHA构建调用图 14 | */ 15 | @WebServlet("/InterProcedural/InterfaceGood2") 16 | public class InterfaceGood2 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | Transformer transformer=new Transformer() { 25 | @Override 26 | public String transform(String from) { 27 | return "clean"; 28 | } 29 | }; 30 | source = transformer.transform(source); 31 | 32 | Runtime.getRuntime().exec(source); // sink 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/InterfaceGood3.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadSink; 4 | import top.anemone.taintbenchmark.auxiliary.GoodSink; 5 | import top.anemone.taintbenchmark.auxiliary.Sink; 6 | 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 该类误报很可能扫描器使用CHA构建调用图 15 | */ 16 | @WebServlet("/IntraProcedural/InterfaceBad3") 17 | public class InterfaceGood3 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | Sink sink=new GoodSink(); 25 | sink.execute(source); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/PointerBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/IntraProcedural/PointerBad1") 15 | public class PointerBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | /** 20 | * 未做域敏感或者未做指针分析 21 | * @param request 22 | * @param response 23 | * @throws ServletException 24 | * @throws IOException 25 | */ 26 | @Override 27 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 | String source = request.getParameter("source"); 29 | 30 | 31 | Container c=new Container<>(); 32 | c.setObj("clean"); 33 | 34 | Container> fakeGood=new Container<>(); 35 | fakeGood.obj=c; 36 | Container> bad=new Container<>(); 37 | bad.obj=c; 38 | 39 | bad.obj.setObj(source); 40 | Container> p=fakeGood; 41 | 42 | 43 | Runtime.getRuntime().exec(p.obj.getObj()); // sink 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/PointerGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/InterProcedural/PointerGood1") 15 | public class PointerGood1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | /** 20 | * 如果报出那么无指针分析 21 | * @param request 22 | * @param response 23 | * @throws ServletException 24 | * @throws IOException 25 | */ 26 | @Override 27 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 | String source = request.getParameter("source"); 29 | 30 | 31 | Container c=new Container<>(); 32 | c.setObj(source); 33 | 34 | Container> good=new Container<>(); 35 | good.obj=c; 36 | Container> bad=new Container<>(); 37 | bad.obj=c; 38 | 39 | good.obj.setObj("clean"); 40 | Container> p=bad; 41 | 42 | 43 | Runtime.getRuntime().exec(p.obj.getObj()); // sink 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/PointerGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebServlet; 8 | import javax.servlet.http.HttpServlet; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.io.PrintWriter; 13 | 14 | @WebServlet("/InterProcedural/PointerGood2") 15 | public class PointerGood2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | /** 20 | * 如果报出那么无指针分析 21 | * @param request 22 | * @param response 23 | * @throws ServletException 24 | * @throws IOException 25 | */ 26 | @Override 27 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 | String source = request.getParameter("source"); 29 | 30 | 31 | Container c=new Container<>(); 32 | c.obj=source; 33 | 34 | Container> good=new Container<>(); 35 | good.obj=c; 36 | 37 | c.obj="clean"; 38 | 39 | 40 | Runtime.getRuntime().exec(good.obj.obj); // sink 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/PrivateBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | /** 12 | * 最简单的污点分析模型,从request中读取内容并返回,造成xss 13 | */ 14 | @WebServlet("/InterProcedural/PrivateBad1") 15 | public class PrivateBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); // source 22 | 23 | 24 | Runtime.getRuntime().exec(bad(source)); // sink 25 | } 26 | private String bad(String s){ 27 | return s; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/PrivateGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/InterProcedural/PrivateGood1") 12 | public class PrivateGood1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | 21 | Runtime.getRuntime().exec(good(source)); // sink 22 | } 23 | private String good(String s){ 24 | return "good"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/RecursionBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintStream; 10 | import java.io.PrintWriter; 11 | 12 | /** 13 | */ 14 | @WebServlet("/InterProcedural/RecursionBad1") 15 | public class RecursionBad1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); // source 22 | 23 | 24 | 25 | bad(source, System.out, 0); 26 | } 27 | 28 | private void bad(String s, PrintStream out, int l) throws IOException { 29 | if (l>100) return; 30 | bad(s, out,l+1); 31 | Runtime.getRuntime().exec(s); // sink 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/StaticBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/InterProcedural/StaticGood1") 12 | public class StaticBad1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | Runtime.getRuntime().exec(bad(source)); // sink 20 | } 21 | public static String bad(String s){ 22 | return s; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/StaticBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.BadStaticSink; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | @WebServlet("/InterProcedural/StaticBad2") 14 | public class StaticBad2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | @Override 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source = request.getParameter("source"); 21 | BadStaticSink.execute(source); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/interprocedural/StaticGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.interprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/InterProcedural/StaticGood1") 12 | public class StaticGood1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | 21 | Runtime.getRuntime().exec(good(source)); // sink 22 | } 23 | public static String good(String s){ 24 | return "good"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/intraprocedural/IntraBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.intraprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/IntraProcedural/IntraBad1") 12 | public class IntraBad1 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | 21 | Runtime.getRuntime().exec(source); // sink 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/intraprocedural/IntraBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.intraprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | @WebServlet("/IntraProcedural/IntraBad1") 12 | public class IntraBad2 extends HttpServlet { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | @Override 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source = request.getParameter("source"); 19 | 20 | source=source+"source"; 21 | source=source.replace("1","2"); 22 | source=source+1; 23 | 24 | Runtime.getRuntime().exec(source); // sink 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/intraprocedural/IntraGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.intraprocedural; 2 | 3 | 4 | import javax.servlet.annotation.WebServlet; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | /** 12 | * 如果该类被报出说明扫描器不存在污点分析 13 | */ 14 | @WebServlet("/IntraProcedural/IntraGood1") 15 | public class IntraGood1 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | @Override 20 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 21 | String source = request.getParameter("source"); 22 | source = "foo"; 23 | 24 | 25 | Runtime.getRuntime().exec(source); // sink 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/BadNumPath1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | /** 10 | * @author anemone(anemone95@qq.com) 11 | * @date 2021/8/31 16:57 12 | */ 13 | @WebServlet("/flow/BadPath1") 14 | public class BadNumPath1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source; 19 | source = request.getParameter("source"); 20 | int x = 86; 21 | if ((7*42)-x <200){ 22 | return; 23 | } else { 24 | Runtime.getRuntime().exec(source); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/BadNumPath2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.util.Random; 9 | 10 | /** 11 | * @author anemone(anemone95@qq.com) 12 | * @date 2021/8/31 16:57 13 | */ 14 | @WebServlet("/flow/BadNumPath2") 15 | public class BadNumPath2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source; 21 | source = request.getParameter("source"); 22 | int x = new Random().nextInt(); 23 | if (x * (x + 1) % 2 == 0) { 24 | Runtime.getRuntime().exec(source); 25 | } else { 26 | return; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/BadStrPath2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.util.Random; 9 | 10 | /** 11 | * @author anemone(anemone95@qq.com) 12 | * @date 2021/8/31 16:57 13 | */ 14 | @WebServlet("/flow/BadNumPath2") 15 | public class BadStrPath2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source; 21 | source = request.getParameter("source"); 22 | String x = "AB"; 23 | if (x.charAt(0) == 'A') { 24 | Runtime.getRuntime().exec(source); 25 | } else { 26 | return; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/GoodNumPath1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | /** 10 | * @author anemone(anemone95@qq.com) 11 | * @date 2021/8/31 16:57 12 | */ 13 | @WebServlet("/flow/GoodPath1") 14 | public class GoodNumPath1 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 18 | String source; 19 | source = request.getParameter("source"); 20 | int x = 86; 21 | if ((7*42)-x <200){ 22 | Runtime.getRuntime().exec(source); 23 | } else { 24 | return; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/GoodNumPath2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | import java.util.Random; 9 | 10 | /** 11 | * @author anemone(anemone95@qq.com) 12 | * @date 2021/8/31 16:57 13 | */ 14 | @WebServlet("/flow/BadNumPath2") 15 | public class GoodNumPath2 extends HttpServlet { 16 | 17 | private static final long serialVersionUID = 1L; 18 | 19 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 20 | String source; 21 | source = request.getParameter("source"); 22 | int x = new Random().nextInt(); 23 | if (x * (x + 1) % 2 == 0) { 24 | return; 25 | } else { 26 | Runtime.getRuntime().exec(source); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/pathsensitive/GoodStrPath2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.pathsensitive; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | /** 10 | * @author anemone(anemone95@qq.com) 11 | * @date 2021/8/31 16:57 12 | */ 13 | @WebServlet("/flow/BadNumPath2") 14 | public class GoodStrPath2 extends HttpServlet { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 19 | String source; 20 | source = request.getParameter("source"); 21 | String x = "AB"; 22 | if (x.charAt(0) == 'A') { 23 | return; 24 | } else { 25 | Runtime.getRuntime().exec(source); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/soundiness/reflect/ReflectBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.soundiness.reflect; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.BadTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | import java.lang.reflect.InvocationTargetException; 13 | import java.lang.reflect.Method; 14 | 15 | 16 | @WebServlet("/Soundiness/ReflectBad1") 17 | public class ReflectBad1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | try { 26 | Class clazz = BadTransformer.class; 27 | Transformer transformer = (Transformer) clazz.newInstance(); 28 | Method m = clazz.getDeclaredMethod("transform", String.class); 29 | source = (String) m.invoke(transformer, source); 30 | 31 | Runtime.getRuntime().exec(source); // sink 32 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) { 33 | e.printStackTrace(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/soundiness/reflect/ReflectBad2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.soundiness.reflect; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Transformer; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | import java.lang.reflect.InvocationTargetException; 12 | import java.lang.reflect.Method; 13 | 14 | 15 | @WebServlet("/Soundiness/ReflectBad2") 16 | public class ReflectBad2 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | try { 25 | Class clazz = Class.forName("top.anemone.taintbenchmark.auxiliary.BadTransformer"); 26 | Transformer transformer = (Transformer) clazz.newInstance(); 27 | Method m = clazz.getDeclaredMethod("transform", String.class); 28 | source = (String) m.invoke(transformer, source); 29 | 30 | Runtime.getRuntime().exec(source); // sink 31 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException | ClassNotFoundException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/soundiness/reflect/ReflectGood1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.soundiness.reflect; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.GoodTransformer; 4 | import top.anemone.taintbenchmark.auxiliary.Transformer; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | import java.lang.reflect.InvocationTargetException; 13 | import java.lang.reflect.Method; 14 | 15 | 16 | @WebServlet("/Soundiness/ReflectGood1") 17 | public class ReflectGood1 extends HttpServlet { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @Override 22 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 23 | String source = request.getParameter("source"); 24 | 25 | try { 26 | Class clazz = GoodTransformer.class; 27 | Transformer transformer = (Transformer) clazz.newInstance(); 28 | Method m = clazz.getDeclaredMethod("transform", String.class); 29 | source = (String) m.invoke(transformer, source); 30 | 31 | Runtime.getRuntime().exec(source); // sink 32 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) { 33 | e.printStackTrace(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/soundiness/reflect/ReflectGood2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.soundiness.reflect; 2 | 3 | import top.anemone.taintbenchmark.auxiliary.Transformer; 4 | 5 | import javax.servlet.annotation.WebServlet; 6 | import javax.servlet.http.HttpServlet; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | import java.io.PrintWriter; 11 | import java.lang.reflect.InvocationTargetException; 12 | import java.lang.reflect.Method; 13 | 14 | 15 | @WebServlet("/Soundiness/ReflectGood2") 16 | public class ReflectGood2 extends HttpServlet { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | @Override 21 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 22 | String source = request.getParameter("source"); 23 | 24 | try { 25 | Class clazz = Class.forName("top.anemone.taintbenchmark.auxiliary.GoodTransformer"); 26 | Transformer transformer = (Transformer) clazz.newInstance(); 27 | Method m = clazz.getDeclaredMethod("transform", String.class); 28 | source = (String) m.invoke(transformer, source); 29 | 30 | Runtime.getRuntime().exec(source); // sink 31 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException | ClassNotFoundException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/thread/ThreadBad1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.thread; 2 | 3 | 4 | import top.anemone.taintbenchmark.auxiliary.Container; 5 | 6 | import javax.servlet.annotation.WebServlet; 7 | import javax.servlet.http.HttpServlet; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | class ContentWriter implements Runnable{ 14 | private Container container; 15 | private String content; 16 | public ContentWriter(Container container, String content){ 17 | this.container=container; 18 | this.content=content; 19 | } 20 | 21 | @Override 22 | public void run() { 23 | container.setObj(content); 24 | } 25 | } 26 | 27 | class RceRunner implements Runnable{ 28 | private PrintWriter writer; 29 | private Container container; 30 | public RceRunner( Container container){ 31 | this.container=container; 32 | } 33 | 34 | @Override 35 | public void run() { 36 | while (true){ 37 | if (container.getObj()!=null){ 38 | try { 39 | Runtime.getRuntime().exec(container.getObj()); 40 | } catch (IOException e) { 41 | e.printStackTrace(); 42 | } 43 | break; 44 | } 45 | } 46 | } 47 | } 48 | 49 | @WebServlet("/Thread/ThreadBad1") 50 | public class ThreadBad1 extends HttpServlet { 51 | 52 | private static final long serialVersionUID = 1L; 53 | @Override 54 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 55 | String source = request.getParameter("xss"); 56 | response.setContentType("text/html;"); 57 | Container cache=new Container<>(); 58 | RceRunner rceRunner =new RceRunner(cache); 59 | ContentWriter contentWriter=new ContentWriter(cache, source); 60 | Thread t1=new Thread(rceRunner); 61 | t1.start(); 62 | Thread t2=new Thread(contentWriter); 63 | t2.start(); 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/java/top/anemone/taintbenchmark/withfrontend/BadBackend.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmark.withfrontend; 2 | 3 | import javax.servlet.annotation.WebServlet; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import java.io.IOException; 8 | 9 | @WebServlet("/BadBackend") 10 | public class BadBackend extends HttpServlet { 11 | 12 | @Override 13 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 14 | String source = request.getParameter("xss"); 15 | response.setContentType("application/json"); 16 | response.getWriter().write("{\"msg\": \""+source+"\"}"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /taint-benchmark-code/src/main/resources/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 | 23 | 24 | -------------------------------------------------------------------------------- /taint-benchmark-dep/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | taint-benchmark 7 | top.anemone 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | taint-benchmark-dep 13 | 14 | 15 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/BadExecutor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public class BadExecutor implements Executor { 6 | private String cmd; 7 | public void setcmd(String s) { 8 | cmd=s; 9 | } 10 | 11 | public String getcmd() { 12 | return cmd; 13 | } 14 | 15 | public Process exe(String exe) throws IOException { 16 | return Runtime.getRuntime().exec(cmd); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/ExeAgent1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public class ExeAgent1 { 6 | public void exe(Executor taint) throws IOException { 7 | new BadExecutor().exe(taint.getcmd()); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/ExeAgent2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public class ExeAgent2 { 6 | public void exe(Executor e, String taint) throws IOException { 7 | e.exe(taint); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/Executor.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public interface Executor { 6 | void setcmd(String s); 7 | String getcmd(); 8 | Process exe(String exe) throws IOException; 9 | } 10 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/GoodExecutor1.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public class GoodExecutor1 implements Executor { 6 | private String cmd; 7 | public void setcmd(String s) { 8 | cmd=s; 9 | } 10 | 11 | public String getcmd() { 12 | return cmd; 13 | } 14 | 15 | public Process exe(String exe) throws IOException { 16 | return Runtime.getRuntime().exec("ls"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /taint-benchmark-dep/src/main/java/top/anemone/taintbenchmarkdep/GoodExecutor2.java: -------------------------------------------------------------------------------- 1 | package top.anemone.taintbenchmarkdep; 2 | 3 | import java.io.IOException; 4 | 5 | public class GoodExecutor2 implements Executor { 6 | private String cmd; 7 | public void setcmd(String s) { 8 | cmd=s; 9 | } 10 | 11 | public String getcmd() { 12 | return "exe"; 13 | } 14 | 15 | public Process exe(String exe) throws IOException { 16 | return Runtime.getRuntime().exec(exe); 17 | } 18 | } 19 | --------------------------------------------------------------------------------