Skip to content

Latest commit

 

History

History
298 lines (295 loc) · 15.9 KB

sast-java-engine-evaluation.md

File metadata and controls

298 lines (295 loc) · 15.9 KB
Java SAST引擎能力评价体系
graph LR
L1H1["引擎能力评估(Java)"]==>L2H1["完整度"]
L2H1["完整度"]==>L3H1["基础跟踪能力"]
L3H1["基础跟踪能力"]==>L4H1["污点对象的完整度"]
L4H1["污点对象的完整度"]==>L5H1["java原生对象"]
L5H1["java原生对象"]==>L6H1["集合"]
L6H1["集合"]==>L7H1["Map元素"]
L6H1["集合"]==>L7H2["List元素"]
L6H1["集合"]==>L7H3["Queue元素"]
L6H1["集合"]==>L7H4["Set元素"]
L5H1["java原生对象"]==>L6H5["数组"]
L6H5["数组"]==>L7H5["数组对象"]
L7H5["数组对象"]==>L8H5["String[]"]
L7H5["数组对象"]==>L8H6["Byte[]"]
L7H5["数组对象"]==>L8H7["char[]"]
L6H5["数组"]==>L7H8["单维数组的元素"]
L7H8["单维数组的元素"]==>L8H8["ArrayAccess"]
L6H5["数组"]==>L7H9["多维数组的元素"]
L6H5["数组"]==>L7H10["可变数组的元素"]
L7H10["可变数组的元素"]==>L8H10["ArrayAccess"]
L5H1["java原生对象"]==>L6H10["基础数据类型"]
L6H10["基础数据类型"]==>L7H11["Byte"]
L6H10["基础数据类型"]==>L7H12["Integer"]
L6H10["基础数据类型"]==>L7H13["Long"]
L6H10["基础数据类型"]==>L7H14["Character"]
L6H10["基础数据类型"]==>L7H15["int"]
L6H10["基础数据类型"]==>L7H16["String"]
L5H1["java原生对象"]==>L6H16["结构体"]
L6H16["结构体"]==>L7H17["JDBC"]
L4H1["污点对象的完整度"]==>L5H17["自定义对象"]
L5H17["自定义对象"]==>L6H17["单层字段"]
L5H17["自定义对象"]==>L6H18["多层字段"]
L5H17["自定义对象"]==>L6H19["自定义native"]
L5H17["自定义对象"]==>L6H20["污点为父类字段"]
L3H1["基础跟踪能力"]==>L4H21["污点传播跟踪能力"]
L4H21["污点传播跟踪能力"]==>L5H21["端点(sink/source)"]
L5H21["端点(sink/source)"]==>L6H21["所属类/函数自定义"]
L5H21["端点(sink/source)"]==>L6H22["所属文件自定义"]
L5H21["端点(sink/source)"]==>L6H23["变量偏移值自定义"]
L5H21["端点(sink/source)"]==>L6H24["变量类型自定义"]
L5H21["端点(sink/source)"]==>L6H25["其他"]
L6H25["其他"]==>L7H25["污点来源于XML配置文件"]
L6H25["其他"]==>L7H26["污点来源于条件语句"]
L4H21["污点传播跟踪能力"]==>L5H200["污点链路的完整度"]
L5H200["污点链路的完整度"]===>L5H27["AST节点枚举传播场景"]
L5H27["AST节点枚举传播场景"]==>L6H27["表达式"]
L6H27["表达式"]==>L7H27["中缀表达式"]
L6H27["表达式"]==>L7H28["前缀表达式"]
L6H27["表达式"]==>L7H29["后缀表达式"]
L6H27["表达式"]==>L7H30["强转表达式"]
L6H27["表达式"]==>L7H31["函数表达式"]
L7H31["函数表达式"]==>L8H31["多态"]
L7H31["函数表达式"]==>L8H32["反射"]
L7H31["函数表达式"]==>L8H33["native"]
L7H31["函数表达式"]==>L8H34["追踪广度/深度"]
L8H34["追踪广度/深度"]==>L9H34["二方包"]
L8H34["追踪广度/深度"]==>L9H35["三方包"]
L8H34["追踪广度/深度"]==>L9H36["配置文件"]
L8H34["追踪广度/深度"]==>L9H37["下游"]
L8H34["追踪广度/深度"]==>L9H38["其他"]
L7H31["函数表达式"]==>L8H39["其他"]
L6H27["表达式"]==>L7H40["位运算表达式"]
L6H27["表达式"]==>L7H41["括号表达式"]
L6H27["表达式"]==>L7H42["this表达式"]
L6H27["表达式"]==>L7H43["变量声明表达式"]
L6H27["表达式"]==>L7H44["Instanceof表达式"]
L6H27["表达式"]==>L7H45["Lambda表达式"]
L6H27["表达式"]==>L7H46["三目运算符表达式"]
L5H27["AST节点枚举传播场景"]==>L6H47["语句"]
L6H47["语句"]==>L7H47["断言语句"]
L7H47["断言语句"]==>L8H47[" assert a > 0 : 'a不应为负数!';"]
L6H47["语句"]==>L7H48["块语句"]
L7H48["块语句"]==>L8H48["'{' statement, statement...'}'"]
L6H47["语句"]==>L7H53["do循环语句"]
L7H53["do循环语句"]==>L8H53["污点传递发生在do语句内"]
L8H53["污点传递发生在do语句内"]==>L9H53["'do' Statement 'while' '(' Expression ')' ';'"]
L7H53["do循环语句"]==>L8H54["污点传递发生在循环条件内"]
L8H54["污点传递发生在循环条件内"]==>L9H54["'do' Statement 'while' '(' Expression ')' ';'"]
L6H47["语句"]==>L7H55["表达式语句"]
L7H55["表达式语句"]==>L8H55["a='b';"]
L6H47["语句"]==>L7H56["for循环语句"]
L7H56["for循环语句"]==>L8H56["污点传递在for的初始化语句"]
L8H56["污点传递在for的初始化语句"]==>L9H56["'for' '(' forLoopParts ')' {*}"]
L7H56["for循环语句"]==>L8H57["污点传递在for的布尔表达式语句"]
L8H57["污点传递在for的布尔表达式语句"]==>L9H57["'for' '(' forLoopParts ')' {*}"]
L7H56["for循环语句"]==>L8H58["污点传递在for的更新语句"]
L8H58["污点传递在for的更新语句"]==>L9H58["'for' '(' forLoopParts ')' {*}"]
L7H56["for循环语句"]==>L8H59["污点传递在for的循环体语句"]
L8H59["污点传递在for的循环体语句"]==>L9H59["'for' '(' forLoopParts ')' {*}"]
L8H59["污点传递在for的循环体语句"]==>MxHy["增强for语句"]
L6H47["语句"]==>L7H60["函数实现语句"]
L7H60["函数实现语句"]==>L8H60["污点传递发生在入参定义"]
L8H60["污点传递发生在入参定义"]==>L9H60["public void a (int a){}"]
L7H60["函数实现语句"]==>L8H61["污点传递发生在函数实现"]
L8H61["污点传递发生在函数实现"]==>L9H61["public void a (int a){}"]
L6H47["语句"]==>L7H62["if语句"]
L7H62["if语句"]==>L8H62["污点传递发生在if分支"]
L8H62["污点传递发生在if分支"]==>L9H62["if(){}"]
L7H62["if语句"]==>L8H63["污点传递发生在else分支"]
L8H63["污点传递发生在else分支"]==>L9H63["if(){}"]
L7H62["if语句"]==>L8H64["污点传递发生在if条件判断中"]
L8H64["污点传递发生在if条件判断中"]==>L9H64["if(){}"]
L7H62["if语句"]==>MaHb["污点传递发生在elseif分支"]
MaHb["污点传递发生在elseif分支"]==>MbHc["if(){}"]
L6H47["语句"]==>L7H65["try语句"]
L7H65["try语句"]==>L8H65["污点传递发生在try语句块中"]
L8H65["污点传递发生在try语句块中"]==>L9H65["try{}"]
L7H65["try语句"]==>L8H66["污点传递发生在catch语句块中"]
L8H66["污点传递发生在catch语句块中"]==>L9H66["try{}"]
L7H65["try语句"]==>L8H67["污点传递发生在finally语句块中"]
L8H67["污点传递发生在finally语句块中"]==>L9H67["try{}"]
L6H47["语句"]==>L7H68["return语句"]
L7H68["return语句"]==>L8H68["return;"]
L6H47["语句"]==>L7H69["switch语句"]
L7H69["switch语句"]==>L8H69["污点传递发生在case语句块中"]
L8H69["污点传递发生在case语句块中"]==>L9H69["switch{}"]
L7H69["switch语句"]==>L8H70["污点传递发生在default语句块中"]
L8H70["污点传递发生在default语句块中"]==>L9H70["switch{}"]
L6H47["语句"]==>L7H71["while语句"]
L7H71["while语句"]==>L8H71["污点传递发生在条件语句中"]
L8H71["污点传递发生在条件语句中"]==>L9H71["while(){}"]
L7H71["while语句"]==>L8H72["污点传递发生在while的执行语句中"]
L8H72["污点传递发生在while的执行语句中"]==>L9H72["while(){}"]
L5H27["AST节点枚举传播场景"]==>L6H73["注解"]
L6H73["注解"]==>L7H73["编译型注解"]
L6H73["注解"]==>L7H74["执行型注解"]
L5H27["AST节点枚举传播场景"]==>L6H75["多节点类型嵌套(理论可枚举)"]
L6H75["多节点类型嵌套(理论可枚举)"]==>L7H75["多表达式嵌套"]
L6H75["多节点类型嵌套(理论可枚举)"]==>L7H76["多语句嵌套"]
L6H75["多节点类型嵌套(理论可枚举)"]==>L7H77["多语句表达式嵌套"]
L5H200["污点链路的完整度"]===>L5H201["特殊链路跟踪能力"]
L5H201["特殊链路跟踪能力"]===>L5H202["无源码函数调用"]
L5H202["无源码函数调用"]===>L5H203["Java原生"]
L5H203["Java原生"]===>MaHc["String类函数"]
L5H203["Java原生"]===>MaHd["StringBuilder类函数"]
L5H203["Java原生"]===>MaHe["数组类函数"]
L5H203["Java原生"]===>MaHf["集合类函数"]
L5H202["无源码函数调用"]===>L5H204["二三方包函数"]
L5H201["特殊链路跟踪能力"]===>MaHg["自定义函数调用"]
MaHg["自定义函数调用"]===>MbHd["类"]
MbHd["类"]===>McHd["嵌套类"]
MbHd["类"]===>McHe["局部类"]
MbHd["类"]===>McHf["抽象类"]
MbHd["类"]===>McHg["匿名类"]
MbHd["类"]===>McHh["泛型类"]
MaHg["自定义函数调用"]===>MbHe["接口"]
MbHe["接口"]===>McHi["序列化"]
MbHe["接口"]===>McHj["多重接口"]
L5H200["污点链路的完整度"]===>L5H205["污点状态枚举传播场景"]
L5H205["污点状态枚举传播场景"]===>L5H206["unknown taint"]
L5H206["unknown taint"]===>L6H206["...不继续细化"]
L5H205["污点状态枚举传播场景"]===>L5H207["may taint"]
L5H207["may taint"]===>L6H207["...不继续细化"]
L5H205["污点状态枚举传播场景"]===>L5H208["must taint"]
L5H208["must taint"]===>L6H208["...不继续细化"]
L5H205["污点状态枚举传播场景"]===>L5H209["safe source"]
L5H209["safe source"]===>L6H209["...不继续细化"]
L2H1["完整度"]==>L3H78["异步跟踪能力"]
L3H78["异步跟踪能力"]==>L4H78["存储型异步"]
L4H78["存储型异步"]==>L5H78["污点通过db存储后触发"]
L4H78["存储型异步"]==>L5H79["污点通过session存储后触发"]
L4H78["存储型异步"]==>L5H80["多线程"]
L5H80["多线程"]==>MdHa["Thread"]
L5H80["多线程"]==>MdHb["Runnable"]
L5H80["多线程"]==>MdHc["Executor"]
L5H80["多线程"]==>MdHd["TimerTask"]
L5H80["多线程"]==>MdHe["Synchronized"]
L4H78["存储型异步"]==>L5H81["污点通过缓存存储后触发"]
L5H81["污点通过缓存存储后触发"]==>L6H81["本地缓存"]
L5H81["污点通过缓存存储后触发"]==>L6H82["非本地缓存"]
L4H78["存储型异步"]==>L5H83["污点通过文件存储后触发"]
L5H83["污点通过文件存储后触发"]==>L6H83["本地文件"]
L5H83["污点通过文件存储后触发"]==>L6H84["OSS"]
L4H78["存储型异步"]==>L5H85["支持自定义污点的存储和再次提取点"]
L2H1["完整度"]==>L3H86["跨应用跟踪能力"]
L3H86["跨应用跟踪能力"]==>L4H86["rpc"]
L4H86["rpc"]==>L5H86["单次rpc调用触发 sink"]
L4H86["rpc"]==>L5H87["跨多个应用rpc触发sink"]
L3H86["跨应用跟踪能力"]==>L4H88["http"]
L4H88["http"]==>L5H88["单次http调用触发 sink"]
L4H88["http"]==>L5H89["跨多个应用http触发sink"]
L3H86["跨应用跟踪能力"]==>L4H90["db/文件"]
L4H90["db/文件"]==>L5H90["单次db操作调用触发 sink"]
L4H90["db/文件"]==>L5H91["跨多个应用db触发sink"]
L1H1["引擎能力评估(Java)"]==>M1H1["准确度"]
M1H1["准确度"]==>M2H1["流敏感"]
M2H1["流敏感"]==>M3H1["数据流不可达"]
M3H1["数据流不可达"]==>M4H1["固定值直接赋值"]
M3H1["数据流不可达"]==>M4H2["固定值通过变量间接赋值"]
M3H1["数据流不可达"]==>M4H3["固定数组/Map/集合"]
M3H1["数据流不可达"]==>M4H4["对象属性set赋值为非污点"]
M2H1["流敏感"]==>L7H49["中断语句"]
L7H49["中断语句"]==>L8H49["break语句"]
L8H49["break语句"]==>L9H49["单层循环"]
L8H49["break语句"]==>L9Hx["多层循环"]
L7H49["中断语句"]==>L8H50["continue语句"]
L8H50["continue语句"]==>L9H50["单层循环"]
L8H50["continue语句"]==>L9Hy["多层循环"]
M1H1["准确度"]==>M2H8["对象敏感"]
M2H8["对象敏感"]==>M3H8["不同对象相同属性"]
M2H8["对象敏感"]==>MaHh["对象是否外部可控"]
M1H1["准确度"]==>M2H9["路径敏感"]
M2H9["路径敏感"]==>M3H10["不涉及求解问题"]
M3H10["不涉及求解问题"]==>M4H18["多个return语句"]
M3H10["不涉及求解问题"]==>M4H19["不同if分支"]
M4H19["不同if分支"]==>MdHf["instanceof表达式"]
MdHf["instanceof表达式"]==>MeHa["null"]
MdHf["instanceof表达式"]==>MeHb["Object"]
M3H10["不涉及求解问题"]==>M4H20["常量分支条件"]
M3H10["不涉及求解问题"]==>M4H21["多分支赋值"]
M3H10["不涉及求解问题"]==>MdHg["assert语句"]
MdHg["assert语句"]==>MeHc["条件成立"]
MdHg["assert语句"]==>MeHd["条件不成立"]
MdHh["try语句"]==>MeHe["抛出异常"]
M2H9["路径敏感"]==>M3H11["涉及求解问题"]
M3H11["涉及求解问题"]==>M4H22["逻辑求解"]
M4H22["逻辑求解"]==>M5H11["...不继续细化"]
M3H11["涉及求解问题"]==>M4H23["表达式求解"]
M4H23["表达式求解"]==>M5H12["...不继续细化"]
M3H11["涉及求解问题"]==>M4H24["数组长度计算"]
M3H11["涉及求解问题"]==>MdHi["try语句"]
MdHi["try语句"]==>MeHf["数组越界异常"]
M1H1["准确度"]==>M2H15["域敏感"]
M2H15["域敏感"]==>M3H15["容器元素敏感"]
M3H15["容器元素敏感"]==>M4H25["单维数组"]
M4H25["单维数组"]==>M5H24["数组是否越界"]
M3H15["容器元素敏感"]==>M4H26["多维数组"]
M3H15["容器元素敏感"]==>M4H27["Map"]
M3H15["容器元素敏感"]==>M4H28["其他集合"]
M3H15["容器元素敏感"]==>M4H29["传递元素不确定"]
M2H15["域敏感"]==>M3H22["对象指针"]
M3H22["对象指针"]==>M4H31["对象指针枚举场景"]
M4H31["对象指针枚举场景"]==>M5H25["AccessPathChain"]
M5H25["AccessPathChain"]==>M6H25["Tree"]
M5H25["AccessPathChain"]==>M6H26["LinkedList"]
M4H31["对象指针枚举场景"]==>M5H26["FieldUnAlias"]
M4H31["对象指针枚举场景"]==>M5H27["FlowSensitiveAlias"]
M4H31["对象指针枚举场景"]==>M5H28["HeapOverwriteAlias"]
M4H31["对象指针枚举场景"]==>M5H29["HeapPointsToSelfAlias"]
M4H31["对象指针枚举场景"]==>M5H30["InnerClassAlias"]
M4H31["对象指针枚举场景"]==>M5H31["InterproceduralAlias"]
M4H31["对象指针枚举场景"]==>M5H32["IntraproceduralAlias"]
M4H31["对象指针枚举场景"]==>M5H33["NullAlias"]
M4H31["对象指针枚举场景"]==>M5H34["PrimitiveFieldAccessAlias"]
M4H31["对象指针枚举场景"]==>M5H35["PropertyTaint"]
M4H31["对象指针枚举场景"]==>M5H36["ReturnAlias"]
M4H31["对象指针枚举场景"]==>M5H37["SameArgumentAlias"]
M4H31["对象指针枚举场景"]==>M5H38["SingleFieldAccessAlias"]
M4H31["对象指针枚举场景"]==>M5H39["StaticFieldAlias"]
M2H15["域敏感"]==>M3H23["字符串中字符"]
M3H23["字符串中字符"]==>M4H40["字符串中部分字符为污点(使用整个字符串)"]
M1H1["准确度"]==>M2H24["上下文敏感"]
M2H24["上下文敏感"]==>M3H24["相同函数调用不同参数"]
M2H24["上下文敏感"]==>M3H25["HeapAllocSite"]
M2H24["上下文敏感"]==>M3H26["MultipleCallSite"]
L1H1["引擎能力评估(Java)"]==>L2H106["兼容性"]
L2H106["兼容性"]==>L3H106["JDK兼容性"]
L3H106["JDK兼容性"]==>L4H106["Oracle JDK"]
L4H106["Oracle JDK"]==>L5H106["JDK 1.4 以下"]
L4H106["Oracle JDK"]==>L5H107["JDK 1.5"]
L4H106["Oracle JDK"]==>L5H108["JDK 1.6 以上"]
L3H106["JDK兼容性"]==>L4H109["OpenJDK"]
L4H109["OpenJDK"]==>L5H109["JDK 1.4 以下"]
L4H109["OpenJDK"]==>L5H110["JDK 1.5"]
L4H109["OpenJDK"]==>L5H111["JDK 1.6 以上"]
L3H106["JDK兼容性"]==>L4H112["JRocket"]
L3H106["JDK兼容性"]==>L4H113["IBM J9"]
L2H106["兼容性"]==>L3H114["操作系统"]
L3H114["操作系统"]==>L4H114["linux"]
L3H114["操作系统"]==>L4H115["mac"]
L3H114["操作系统"]==>L4H116["windows"]
L1H1["引擎能力评估(Java)"]==>L2H117["性能"]
L2H117["性能"]==>L3H117["无漏洞场景"]
L3H117["无漏洞场景"]==>L4H117["W行扫描耗时"]
L2H117["性能"]==>L3H118["有漏洞场景"]
L3H118["有漏洞场景"]==>L4H118["W行扫描耗时"]
L2H117["性能"]==>L3H119["超长调用链路有漏洞场景(50)"]
L3H119["超长调用链路有漏洞场景(50)"]==>L4H119["W行扫描耗时"]
L2H117["性能"]==>L3H120["超长调用链路无漏洞场景(50)"]
L3H120["超长调用链路无漏洞场景(50)"]==>L4H120["W行扫描耗时"]
L2H117["性能"]==>L3H121["超广调用链路有漏洞场景(100)"]
L3H121["超广调用链路有漏洞场景(100)"]==>L4H121["W行扫描耗时"]
L2H117["性能"]==>L3H122["代码复杂度-if/else for循环"]
L2H117["性能"]==>L3H123["超广调用链路无漏洞场景(100)"]
L3H123["超广调用链路无漏洞场景(100)"]==>L4H123["W行扫描耗时"]
L1H1["引擎能力评估(Java)"]==>L2H124["接入成本"]
L2H124["接入成本"]==>L3H124["扫描源"]
L3H124["扫描源"]==>L4H124["代码库文件"]
L3H124["扫描源"]==>L4H125["编译产物"]
L2H124["接入成本"]==>L3H126["接入方式"]
L3H126["接入方式"]==>L4H126["SDK"]
L3H126["接入方式"]==>L4H127["openapi"]
L3H126["接入方式"]==>L4H128["client"]

Loading