- CustomClassTransformer: 字节码转换器,调用 hook 类进行插桩
- 使用 javassist 库插桩,将 XxxHook 类中的 checkXxx 静态方法插入到目标方法中
- 请求线程检测入口:HookHandler#doCheck
- 当去 hook 像 java.io.File 这样由 BootstrapClassLoader 加载的类的时候,无法从该 类调用非 BootstrapClassLoader 加载的类中的接口,所以 agent.jar 会先将自己添加 到 BootstrapClassLoader 的 ClassPath 下
- 给 openrasp.yml 和 js 插件目录以及 assets 目录增加文件监控,以便文件内容更改的 时候不需要重启就能够实时生效 (FileScanListener)
- 基线检测使用 java 插件,不需要再请求线程中执行;攻击检测多数使用 js 插件,要求 在请求线程中执行
- detectors 用于收集服务器信息,然后分派给对应的 checker 进行基线检测
plugin: 查找 str1 和 str2 的最长公共子串,返回为所有最长子串组成的数组
function lcs_search(str1, str2){
var len1 = str1.length;
var len2 = str2.length;
var dp_arr = [[],[]]
var pre = 1
var now = 0
var result =0
var result_pos = []
for (var i = 0; i <= len2+1; i ++) {
dp_arr[0][i] = 0
dp_arr[1][i] = 0
}
for (var i = 0; i <= len1; i ++) {
for (var j = 0; j <= len2; j ++) {
if ( i == 0 || j == 0 ){
dp_arr[now][j] = 0
}
else if ( str1[i-1] == str2[j-1] ) {
dp_arr[now][j] = dp_arr[pre][j-1] + 1
if (dp_arr[now][j] > result){
result = dp_arr[now][j]
result_pos = [i - result]
}else if (dp_arr[now][j] == result){
result_pos.push( i - result )
}
}
else {
dp_arr[now][j] = 0
}
}
if( now == 0 ){
now = 1
pre = 0
}
else {
now = 0
pre = 1
}
}
var result_pos_set = new Set(result_pos)
var result_str = new Set()
for (var item of result_pos_set) {
result_str.add(str1.substr(item, result))
}
return Array.from(result_str)
}
- 当 iast.js 下发成功,Java/PHP 内部的探针会自动在请求结束时,将本次请求的参数、 hook 点信息提交给 openrasp-iast 服务器进行分析,并选择性的 Fuzz 目标