Skip to content

Commit e7e1009

Browse files
authored
Merge pull request #524 from Nizernizer/fix/custom-model
fix: custom model
2 parents 78be5f5 + 67a115d commit e7e1009

File tree

7 files changed

+129
-193
lines changed

7 files changed

+129
-193
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/controller/impl/DubboImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static void solveDubboRequest(Object handler, Object channel, Object requ
2727
put("requestURL", u.getScheme() + "://" + u.getAuthority() + u.getPath());
2828
put("requestURI", u.getPath());
2929
put("queryString", "");
30-
put("method", "DUBOO");
30+
put("method", "DUBBO");
3131
put("protocol", "DUBBO");
3232
put("scheme", u.getScheme());
3333
put("contextPath", "");
@@ -43,15 +43,14 @@ public static void solveDubboRequest(Object handler, Object channel, Object requ
4343
}
4444

4545

46-
4746
public static void collectDubboRequestSource(Object handler, Object invocation, String methodName,
4847
Object[] arguments, Map<String, ?> headers,
4948
String hookClass, String hookMethod, String hookSign,
5049
AtomicInteger invokeIdSequencer) {
5150
if (arguments == null || arguments.length == 0) {
5251
return;
5352
}
54-
Map <String, Object> requestMeta = EngineManager.REQUEST_CONTEXT.get();
53+
Map<String, Object> requestMeta = EngineManager.REQUEST_CONTEXT.get();
5554
if (requestMeta == null) {
5655
return;
5756
}
@@ -70,7 +69,7 @@ public static void collectDubboRequestSource(Object handler, Object invocation,
7069
tgt.add(new TaintPosition("P1"));
7170

7271
SourceNode sourceNode = new SourceNode(src, tgt, null);
73-
TaintPoolUtils.trackObject(event, sourceNode, arguments, 0);
72+
TaintPoolUtils.trackObject(event, sourceNode, arguments, 0, true);
7473

7574
Map<String, String> sHeaders = new HashMap<String, String>();
7675
if (headers != null) {

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/controller/impl/SourceImpl.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,10 @@ private static boolean trackTarget(MethodEvent event, SourceNode sourceNode) {
8181
return false;
8282
}
8383

84-
TaintPoolUtils.trackObject(event, sourceNode, event.returnInstance, 0);
85-
// @TODO: hook json serializer for custom model
86-
handlerCustomModel(event, sourceNode);
84+
TaintPoolUtils.trackObject(event, sourceNode, event.returnInstance, 0, false);
8785
return true;
8886
}
8987

90-
/**
91-
* todo: 处理过程和结果需要细化
92-
*
93-
* @param event MethodEvent
94-
*/
95-
public static void handlerCustomModel(MethodEvent event, SourceNode sourceNode) {
96-
if (!"getSession".equals(event.getMethodName())) {
97-
Set<Object> modelValues = TaintPoolUtils.parseCustomModel(event.returnInstance);
98-
for (Object modelValue : modelValues) {
99-
TaintPoolUtils.trackObject(event, sourceNode, modelValue, 0);
100-
}
101-
}
102-
}
103-
10488
private static boolean allowCall(MethodEvent event) {
10589
boolean allowed = true;
10690
if (METHOD_OF_GETATTRIBUTE.equals(event.getMethodName())) {

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/service/trace/DubboService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class DubboService {
1515
public static void solveSyncInvoke(MethodEvent event, Object invocation, String url, Map<String, String> headers,
1616
AtomicInteger invokeIdSequencer) {
1717
try {
18-
TaintPoolUtils.trackObject(event, null, event.parameterInstances, 0);
18+
TaintPoolUtils.trackObject(event, null, event.parameterInstances, 0, false);
1919
boolean hasTaint = false;
2020
int sourceLen = 0;
2121
if (!event.getSourceHashes().isEmpty()) {
@@ -26,7 +26,7 @@ public static void solveSyncInvoke(MethodEvent event, Object invocation, String
2626

2727
if (headers != null && headers.size() > 0) {
2828
hasTaint = false;
29-
TaintPoolUtils.trackObject(event, null, headers, 0);
29+
TaintPoolUtils.trackObject(event, null, headers, 0, false);
3030
if (event.getSourceHashes().size() > sourceLen) {
3131
hasTaint = true;
3232
}

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/service/trace/FeignService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static void solveSyncInvoke(MethodEvent event, AtomicInteger invokeIdSequ
2727

2828
// get args
2929
Object args = event.parameterInstances[0];
30-
TaintPoolUtils.trackObject(event, null, args, 0);
30+
TaintPoolUtils.trackObject(event, null, args, 0, true);
3131

3232
boolean hasTaint = false;
3333
if (!event.getSourceHashes().isEmpty()) {

dongtai-core/src/main/java/io/dongtai/iast/core/utils/ReflectUtils.java

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package io.dongtai.iast.core.utils;
22

3+
import io.dongtai.log.DongTaiLog;
4+
5+
import java.lang.reflect.AccessibleObject;
36
import java.lang.reflect.Field;
47
import java.lang.reflect.Method;
8+
import java.security.AccessController;
9+
import java.security.PrivilegedAction;
510
import java.util.*;
611

712
/**
@@ -11,15 +16,15 @@ public class ReflectUtils {
1116

1217
public static Field getFieldFromClass(Class<?> cls, String fieldName) throws NoSuchFieldException {
1318
Field field = cls.getDeclaredField(fieldName);
14-
field.setAccessible(true);
19+
setAccessible(field);
1520
return field;
1621
}
1722

1823
public static Field getDeclaredFieldFromClassByName(Class<?> cls, String fieldName) {
1924
Field[] declaredFields = cls.getDeclaredFields();
2025
for (Field field : declaredFields) {
2126
if (fieldName.equals(field.getName())) {
22-
field.setAccessible(true);
27+
setAccessible(field);
2328
return field;
2429
}
2530
}
@@ -55,8 +60,18 @@ public static Method getPublicMethodFromClass(Class<?> cls, String method) throw
5560

5661
public static Method getPublicMethodFromClass(Class<?> cls, String methodName, Class<?>[] parameterTypes) throws NoSuchMethodException {
5762
Method method = cls.getMethod(methodName, parameterTypes);
58-
method.setAccessible(true);
59-
return method;
63+
return getSecurityPublicMethod(method);
64+
}
65+
66+
public static Method getSecurityPublicMethod(Method method) throws NoSuchMethodException {
67+
if (hasNotSecurityManager()) {
68+
setAccessible(method);
69+
return method;
70+
}
71+
return AccessController.doPrivileged((PrivilegedAction<Method>) () -> {
72+
setAccessible(method);
73+
return method;
74+
});
6075
}
6176

6277
public static Method getDeclaredMethodFromClass(Class<?> cls, String methodName, Class<?>[] parameterTypes) {
@@ -66,8 +81,11 @@ public static Method getDeclaredMethodFromClass(Class<?> cls, String methodName,
6681
}
6782
for (Method method : methods) {
6883
if (methodName.equals(method.getName()) && Arrays.equals(parameterTypes, method.getParameterTypes())) {
69-
method.setAccessible(true);
70-
return method;
84+
try {
85+
return getSecurityPublicMethod(method);
86+
} catch (NoSuchMethodException e) {
87+
e.printStackTrace();
88+
}
7189
}
7290
}
7391
return null;
@@ -137,13 +155,47 @@ public static List<Class<?>> getAllInterfaces(Class<?> cls) {
137155
private static void getAllInterfaces(Class<?> cls, List<Class<?>> interfaceList) {
138156
while (cls != null) {
139157
Class<?>[] interfaces = cls.getInterfaces();
140-
for (int i = 0; i < interfaces.length; i++) {
141-
if (!interfaceList.contains(interfaces[i])) {
142-
interfaceList.add(interfaces[i]);
143-
getAllInterfaces(interfaces[i], interfaceList);
158+
for (Class<?> anInterface : interfaces) {
159+
if (!interfaceList.contains(anInterface)) {
160+
interfaceList.add(anInterface);
161+
getAllInterfaces(anInterface, interfaceList);
144162
}
145163
}
146164
cls = cls.getSuperclass();
147165
}
148166
}
167+
168+
public static Field[] getDeclaredFieldsSecurity(Class<?> cls) {
169+
Objects.requireNonNull(cls);
170+
if (hasNotSecurityManager()) {
171+
return getDeclaredFields(cls);
172+
}
173+
return (Field[]) AccessController.doPrivileged((PrivilegedAction<Field[]>) () -> {
174+
return getDeclaredFields(cls);
175+
});
176+
}
177+
178+
private static Field[] getDeclaredFields(Class<?> cls) {
179+
Field[] declaredFields = cls.getDeclaredFields();
180+
for (Field field : declaredFields) {
181+
setAccessible(field);
182+
}
183+
return declaredFields;
184+
}
185+
186+
private static boolean hasNotSecurityManager() {
187+
return System.getSecurityManager() == null;
188+
}
189+
190+
private static void setAccessible(AccessibleObject accessibleObject) {
191+
try{
192+
if (!accessibleObject.isAccessible()) {
193+
accessibleObject.setAccessible(true);
194+
}
195+
} catch (Throwable e){
196+
DongTaiLog.debug("setAccessible failed: {}, {}",
197+
e.getMessage(), e.getCause() != null ? e.getCause().getMessage() : "");
198+
}
199+
200+
}
149201
}

0 commit comments

Comments
 (0)