Skip to content

Commit 714de22

Browse files
author
‘niuerzhuang’
committed
fix: dubbo blacklist skip collection.
1 parent d800c43 commit 714de22

File tree

9 files changed

+67
-0
lines changed

9 files changed

+67
-0
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/asm/AsmMethods.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,12 @@ static Method getAsmMethod(final Class<?> clazz,
278278
String.class
279279
);
280280

281+
Method SPY$isSkipCollect = InnerHelper.getAsmMethod(
282+
SpyDispatcher.class,
283+
"isSkipCollect",
284+
Object.class
285+
);
286+
281287
Method SPY$reportService = InnerHelper.getAsmMethod(
282288
SpyDispatcher.class,
283289
"reportService",

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/dubbo/DubboSyncHandlerInvokeAdviceAdapter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public void visitMaxs(int maxStack, int maxLocals) {
6161
}
6262

6363
private void enterMethod() {
64+
skipCollect();
6465
enterScope();
6566

6667
Label elseLabel = new Label();
@@ -113,4 +114,11 @@ private void traceMethod() {
113114
invokeInterface(ASM_TYPE_SPY_DISPATCHER, SPY$traceDubboInvoke);
114115
pop();
115116
}
117+
118+
private void skipCollect() {
119+
invokeStatic(ASM_TYPE_SPY_HANDLER, SPY_HANDLER$getDispatcher);
120+
loadArg(0);
121+
invokeInterface(ASM_TYPE_SPY_DISPATCHER,SPY$isSkipCollect);
122+
pop();
123+
}
116124
}

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/SpyDispatcherImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.dongtai.iast.common.scope.ScopeManager;
88
import io.dongtai.iast.core.EngineManager;
99
import io.dongtai.iast.core.bytecode.enhance.plugin.spring.SpringApplicationImpl;
10+
import io.dongtai.iast.core.handler.skip.BlackUrlSkipHandler;
1011
import io.dongtai.iast.core.handler.hookpoint.controller.HookType;
1112
import io.dongtai.iast.core.handler.hookpoint.controller.impl.*;
1213
import io.dongtai.iast.core.handler.hookpoint.graphy.GraphBuilder;
@@ -19,6 +20,8 @@
1920
import io.dongtai.log.ErrorCode;
2021

2122
import java.lang.dongtai.SpyDispatcher;
23+
import java.lang.reflect.InvocationTargetException;
24+
import java.lang.reflect.Method;
2225
import java.net.InetSocketAddress;
2326
import java.util.*;
2427
import java.util.concurrent.atomic.AtomicInteger;
@@ -697,6 +700,21 @@ public boolean traceDubboInvoke(Object instance, String url, Object invocation,
697700
return false;
698701
}
699702

703+
@Override
704+
public boolean isSkipCollect(Object invocation) {
705+
if (BlackUrlSkipHandler.isBlackUrl()){
706+
Method setAttachmentMethod = null;
707+
try {
708+
setAttachmentMethod = invocation.getClass().getMethod("setAttachment", String.class, String.class);
709+
setAttachmentMethod.setAccessible(true);
710+
setAttachmentMethod.invoke(invocation, BlackUrlSkipHandler.getHeaderKey(), BlackUrlSkipHandler.isBlackUrl().toString());
711+
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
712+
DongTaiLog.error(ErrorCode.get("SPY_SKIP_COLLECT_DUBBO_FAILED"), e);
713+
}
714+
}
715+
return false;
716+
}
717+
700718
private boolean isCollectAllowed(boolean isEnterEntry) {
701719
if (!EngineManager.isEngineRunning()) {
702720
return false;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.dongtai.iast.common.config.ConfigBuilder;
55
import io.dongtai.iast.common.config.ConfigKey;
66
import io.dongtai.iast.core.EngineManager;
7+
import io.dongtai.iast.core.handler.skip.BlackUrlSkipHandler;
78
import io.dongtai.iast.core.handler.context.ContextManager;
89
import io.dongtai.iast.core.handler.hookpoint.models.MethodEvent;
910
import io.dongtai.iast.core.handler.hookpoint.models.policy.SourceNode;
@@ -54,6 +55,9 @@ public static void collectDubboRequestSource(Object handler, Object invocation,
5455
if (requestMeta == null) {
5556
return;
5657
}
58+
if (null != headers.get(BlackUrlSkipHandler.getHeaderKey()) && headers.get(BlackUrlSkipHandler.getHeaderKey()).equals("true")){
59+
return;
60+
}
5761

5862
String url = (String) requestMeta.get("requestURL") + "/" + methodName;
5963
String uri = (String) requestMeta.get("requestURI") + "/" + methodName;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.dongtai.iast.common.config.*;
44
import io.dongtai.iast.common.constants.AgentConstant;
55
import io.dongtai.iast.core.EngineManager;
6+
import io.dongtai.iast.core.handler.skip.BlackUrlSkipHandler;
67
import io.dongtai.iast.core.handler.hookpoint.IastClassLoader;
78
import io.dongtai.iast.core.utils.*;
89
import io.dongtai.iast.core.utils.matcher.ConfigMatcher;
@@ -74,6 +75,7 @@ public static void solveHttpRequest(Object obj, Object req, Object resp, Map<Str
7475
return;
7576
}
7677
if (ConfigMatcher.getInstance().getBlackUrl(requestMeta)) {
78+
BlackUrlSkipHandler.setIsBlackUrl(true);
7779
return;
7880
}
7981

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.dongtai.iast.core.handler.skip;
2+
3+
import io.dongtai.iast.core.utils.threadlocal.BooleanThreadLocal;
4+
5+
public class BlackUrlSkipHandler {
6+
7+
private static BooleanThreadLocal isBlackUrl = new BooleanThreadLocal(false);
8+
9+
public static Boolean isBlackUrl() {
10+
return isBlackUrl.get();
11+
}
12+
13+
public static void setIsBlackUrl(Boolean isBlackUrl) {
14+
BlackUrlSkipHandler.isBlackUrl.set(isBlackUrl);
15+
}
16+
17+
public static String getHeaderKey() {
18+
return "dt-collect-skip";
19+
}
20+
}

dongtai-log/src/main/java/io/dongtai/log/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public enum ErrorCode {
8888
SPY_TRACE_DUBBO_CONSUMER_INVOKE_FAILED(20361, "hookpoint trace dubbo consumer invoke failed"),
8989
SPY_LEAVE_DUBBO_FAILED(20362, "hookpoint leave dubbo failed"),
9090
SPY_COLLECT_DUBBO_FAILED(20363, "hookpoint collect dubbo {} failed"),
91+
SPY_SKIP_COLLECT_DUBBO_FAILED(20364, "hookpoint skip collect dubbo {} failed"),
9192

9293
// report & replay
9394
REPORT_SEND_FAILED(20401, "send report to {} error, report: {}"),

dongtai-spy/src/main/java/java/lang/dongtai/NopSpy.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,10 @@ public boolean traceDubboInvoke(Object instance, String url, Object invocation,
261261
String signature) {
262262
return false;
263263
}
264+
265+
@Override
266+
public boolean isSkipCollect(Object invocation) {
267+
return false;
268+
}
269+
264270
}

dongtai-spy/src/main/java/java/lang/dongtai/SpyDispatcher.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,6 @@ boolean traceFeignInvoke(Object instance, Object[] parameters,
170170
boolean traceDubboInvoke(Object instance, String url, Object invocation, Object[] arguments,
171171
Map<String, String> headers, String className, String methodName,
172172
String signature);
173+
174+
boolean isSkipCollect(Object invocation);
173175
}

0 commit comments

Comments
 (0)