Skip to content

Commit f3b28d3

Browse files
authored
Merge pull request #560 from lostsnow/beta
bump version to 1.12.0
2 parents 5b31d4c + 82ae9d0 commit f3b28d3

File tree

33 files changed

+673
-72
lines changed

33 files changed

+673
-72
lines changed

.github/workflows/code-check.yml

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,17 +148,33 @@ jobs:
148148
if [ ${{ steps.version.outputs.GITHUB_REF }} = develop ] ; then
149149
ossutil cp -rf dongtai-agent/target/dongtai-agent.jar oss://dongtai-helm-charts/agent_test/java/latest/dongtai-agent.jar --meta x-oss-object-acl:public-read
150150
ossutil cp -rf dongtai-agent/src/main/resources/bin/ oss://dongtai-helm-charts/agent_test/java/latest/ --meta x-oss-object-acl:public-read
151-
else
151+
cp dongtai-agent/target/dongtai-agent.jar dongtai-agent/src/main/resources/bin/ && cd dongtai-agent/src/main/resources/bin/ && tar -zcvf agent_latest.tar.gz * && cd ../../../../../
152+
ossutil cp -rf dongtai-agent/src/main/resources/bin/agent_latest.tar.gz oss://dongtai-helm-charts/agent_test/java/latest/ --meta x-oss-object-acl:public-read
153+
else
152154
ossutil cp -rf dongtai-agent/target/dongtai-agent.jar oss://dongtai-helm-charts/agent_${{ steps.version.outputs.GITHUB_REF }}/java/latest/dongtai-agent.jar --meta x-oss-object-acl:public-read
153155
ossutil cp -rf dongtai-agent/src/main/resources/bin/ oss://dongtai-helm-charts/agent_${{ steps.version.outputs.GITHUB_REF }}/java/latest/ --meta x-oss-object-acl:public-read
156+
cp dongtai-agent/target/dongtai-agent.jar dongtai-agent/src/main/resources/bin/ && cd dongtai-agent/src/main/resources/bin/ && tar -zcvf agent_latest.tar.gz * && cd ../../../../../
157+
ossutil cp -rf dongtai-agent/src/main/resources/bin/agent_latest.tar.gz oss://dongtai-helm-charts/agent_${{ steps.version.outputs.GITHUB_REF }}/java/latest/ --meta x-oss-object-acl:public-read
154158
fi
155-
# ossutil cp -rf dongtai-agent/target/dongtai-agent.jar oss://dongtai-helm-charts/agent_test/java/dongtai-agent.jar --meta x-oss-object-acl:public-read
156-
# ossutil cp -rf dongtai-agent/src/main/resources/bin/ oss://dongtai-helm-charts/agent_test/java/ --meta x-oss-object-acl:public-read
157-
158-
# - name: Trigger Openapi Workflow
159-
# uses: benc-uk/workflow-dispatch@v1
160-
# with:
161-
# workflow: Deploy DongTai Server To Dev
162-
# token: ${{ secrets.BIDAYA0_PAT_FOR_OPENAPI }}
163-
# ref: main
164-
# repo: HXSecurity/DongTai
159+
160+
- name: Set the value
161+
id: release
162+
run: |
163+
if [ ${{ steps.version.outputs.GITHUB_REF }} = develop ] ; then echo "helm_ns=test" >> $GITHUB_ENV; echo "helm_mysql=test" >> $GITHUB_ENV
164+
elif [ ${{ steps.version.outputs.GITHUB_REF }} = beta ] ; then echo "helm_ns=beta" >> $GITHUB_ENV; echo "helm_mysql=beta" >> $GITHUB_ENV
165+
else echo "helm_ns=main" >> $GITHUB_ENV ; echo "helm_mysql=temp" >> $GITHUB_ENV ;fi
166+
167+
- name: deploy to cluster
168+
uses: wahyd4/kubectl-helm-action@master
169+
env:
170+
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_TEST_DATA }}
171+
with:
172+
args: |
173+
git clone https://github.com/HXSecurity/DongTai.git
174+
helm upgrade --install huoxian --create-namespace -n iast-${{ env.helm_ns }} ./DongTai/deploy/kubernetes/helm/ \
175+
--set sca.sca_token=${{ secrets.TOKEN_SCA }} --set usb.usb_token=${{ secrets.TOKEN_SCA }} --set mysql.host=iast-mysql-${{ env.helm_mysql }}.huoxian.cn \
176+
--set tag=${{ steps.version.outputs.GITHUB_REF }}-latest --set build.agent_number=iast${{github.run_number}} --set develop.agentZip=${{ env.helm_ns }} --values https://charts.dongtai.io/devops.yaml
177+
helm upgrade --install huoxian --create-namespace -n iast-${{ env.helm_ns }}-max ./DongTai/deploy/kubernetes/helm/ \
178+
--set max=true --set sca.sca_token=${{ secrets.MAX_TOKEN_SCA }} --set usb.usb_token=${{ secrets.MAX_TOKEN_SCA }} --set mysql.host=iast-mysql-${{ env.helm_mysql }}-max.huoxian.cn \
179+
--set tag=max-${{ steps.version.outputs.GITHUB_REF }}-latest --set develop.agentZip=${{ env.helm_ns }} \
180+
--set build.agent_number=iast${{github.run_number}} --values https://charts.dongtai.io/devops.yaml

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ release
3232
# for jenv
3333
.java-version
3434

35+
jmh-result.json
36+
3537
dongtai-api.jar
3638
dongtai-core.jar
3739
dongtai-grpc.jar

dongtai-api-gather/dongtai-api-gather-spring-api/src/main/java/io/dongtai/iast/api/gather/spring/extractor/SpringMVCApiExtractor.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
88

99
import java.lang.reflect.Method;
10-
import java.util.Map;
10+
import java.util.*;
11+
import java.util.stream.Collectors;
1112

1213
/**
1314
* @author CC11001100
@@ -21,11 +22,26 @@ public class SpringMVCApiExtractor {
2122
* @param applicationContext
2223
* @return
2324
*/
24-
public static OpenApi run(Object applicationContext) {
25+
public static List<OpenApi> run(Object applicationContext) {
2526
WebApplicationContext webApplicationContext = (WebApplicationContext) applicationContext;
2627
SpringMVCApiExtractor springApplicationContext = new SpringMVCApiExtractor();
27-
RequestMappingHandlerMapping requestMappingHandlerMapping = springApplicationContext.findRequestMappingHandlerMapping(webApplicationContext);
28-
return new RequestMappingHandlerMappingConvertor(webApplicationContext, requestMappingHandlerMapping).parse();
28+
List<RequestMappingHandlerMapping> requestMappingHandlerMappingList = springApplicationContext.findRequestMappingHandlerMapping(webApplicationContext);
29+
if (requestMappingHandlerMappingList == null || requestMappingHandlerMappingList.isEmpty()) {
30+
DongTaiLog.debug("spring mvc can not find RequestMappingHandlerMapping beans");
31+
return null;
32+
}
33+
return requestMappingHandlerMappingList
34+
.stream()
35+
.map(mapping -> {
36+
try {
37+
return new RequestMappingHandlerMappingConvertor(webApplicationContext, mapping).parse();
38+
} catch (Throwable e) {
39+
DongTaiLog.debug("spring mvc RequestMappingHandlerMappingConvertor parse error", e);
40+
return null;
41+
}
42+
})
43+
.filter(Objects::nonNull)
44+
.collect(Collectors.toList());
2945
}
3046

3147
/**
@@ -34,7 +50,7 @@ public static OpenApi run(Object applicationContext) {
3450
* @param applicationContext
3551
* @return
3652
*/
37-
private RequestMappingHandlerMapping findRequestMappingHandlerMapping(WebApplicationContext applicationContext) {
53+
private List<RequestMappingHandlerMapping> findRequestMappingHandlerMapping(WebApplicationContext applicationContext) {
3854

3955
if (applicationContext == null) {
4056
return null;
@@ -52,15 +68,23 @@ private RequestMappingHandlerMapping findRequestMappingHandlerMapping(WebApplica
5268
Map<String, RequestMappingHandlerMapping> m = (Map<String, RequestMappingHandlerMapping>) invoke;
5369
RequestMappingHandlerMapping requestMappingHandlerMapping = m.get("requestMappingHandlerMapping");
5470
if (requestMappingHandlerMapping != null) {
55-
return requestMappingHandlerMapping;
71+
return Collections.singletonList(requestMappingHandlerMapping);
5672
}
5773
}
5874
} catch (Throwable e) {
5975
DongTaiLog.debug("try use BeanFactoryUtils find RequestMappingHandlerMapping exception", e);
6076
}
6177

6278
// 没有工具类,就只从自己里面找
63-
return applicationContext.getBean(RequestMappingHandlerMapping.class);
79+
// 2023-7-11 16:58:23 注意,此处可能会寻找到多个,寻找到多个的时候统统上报
80+
// case:
81+
// <dependency>
82+
// <groupId>io.springfox</groupId>
83+
// <artifactId>springfox-swagger2</artifactId>
84+
// <version>2.7.0</version>
85+
// </dependency>
86+
// 它会创建一个自己的 springfox.documentation.spring.web.PropertySourcedRequestMappingHandlerMapping 继承了 RequestMappingHandlerMapping
87+
return new ArrayList<>(applicationContext.getBeansOfType(RequestMappingHandlerMapping.class).values());
6488
}
6589

6690
}

dongtai-common/src/main/java/io/dongtai/iast/common/constants/AgentConstant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.dongtai.iast.common.constants;
22

33
public class AgentConstant {
4-
public static final String VERSION_VALUE = "v1.12.0-beta1";
4+
public static final String VERSION_VALUE = "v1.12.0";
55
public static final String LANGUAGE = "JAVA";
66
public static final String THREAD_NAME_PREFIX = "DongTai-IAST-";
77
public static final String THREAD_NAME_PREFIX_CORE = "DongTai-IAST-Core-";

dongtai-common/src/test/java/io/dongtai/iast/common/utils/AbstractHttpClientUtilsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class AbstractHttpClientUtilsTest {
2121
private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream();
2222
private final boolean oldEnableColor = DongTaiLog.ENABLE_COLOR;
2323

24-
private static final String BASE_URL = "https://iast.io";
24+
private static final String BASE_URL = "https://poc.iast.huoxian.cn";
2525

2626
private void clear() {
2727
outputStreamCaptor.reset();

dongtai-core/src/main/java/com/secnium/iast/core/AgentEngine.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616

1717
import java.lang.dongtai.SpyDispatcherHandler;
1818
import java.lang.instrument.Instrumentation;
19-
import java.util.ArrayList;
20-
import java.util.ListIterator;
19+
import java.util.*;
2120

2221
/**
2322
@@ -71,6 +70,7 @@ public static void install(String mode, String propertiesFilePath, Integer agent
7170
DongTaiLog.info("DongTai Engine is successfully installed to the JVM, and it takes {} s",
7271
stopWatch.getTime() / 1000);
7372
DongTaiLog.info("DongTai Agent Version: {}, DongTai Server: {}", AgentConstant.VERSION_VALUE, cfg.getBaseUrl());
73+
inject(inst);
7474
new ServiceDirReport().send();
7575
} catch (Throwable e) {
7676
DongTaiLog.error(ErrorCode.get("ENGINE_INSTALL_FAILED"), e);
@@ -134,4 +134,37 @@ private void destroy() {
134134
}
135135
}
136136

137+
138+
private static void redefineJavaBaseModule(Instrumentation instrumentation) {
139+
if (doesSupportModules()) {
140+
try {
141+
Instrumentation.class.getMethod("redefineModule", Class.forName("java.lang.Module"), Set.class, Map.class, Map.class, Set.class, Map.class).invoke(instrumentation, getModule(Object.class), Collections.emptySet(), Collections.emptyMap(), Collections.singletonMap("java.lang", Collections.singleton(getModule(EngineManager.class))), Collections.emptySet(), Collections.emptyMap());
142+
} catch (Exception e) {
143+
DongTaiLog.error(ErrorCode.REDEFINE_MODULE_FAILED,e);
144+
}
145+
}
146+
}
147+
148+
public static boolean doesSupportModules() {
149+
try {
150+
Class.forName("java.lang.Module");
151+
return true;
152+
} catch (ClassNotFoundException e) {
153+
return false;
154+
}
155+
}
156+
157+
private static Object getModule(Class<?> clazz) {
158+
try {
159+
return Class.class.getMethod("getModule", new Class[0]).invoke(clazz, new Object[0]);
160+
} catch (Exception e) {
161+
throw new IllegalStateException("There was a problem while getting the module of the class", e);
162+
}
163+
}
164+
public static void inject(Instrumentation inst) {
165+
if (doesSupportModules()) {
166+
redefineJavaBaseModule(inst);
167+
}
168+
}
169+
137170
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class ClassContext {
1212
private String className;
1313
private String matchedClassName;
1414
private Set<String> ancestors;
15+
private Set<String> matchedClassSet;
1516
private String superClassName;
1617
private String[] interfaces;
1718
private int modifier;
@@ -98,4 +99,12 @@ public boolean isBootstrapClassLoader() {
9899
public void setBootstrapClassLoader(boolean isBootstrapClassLoader) {
99100
this.isBootstrapClassLoader = isBootstrapClassLoader;
100101
}
102+
103+
public Set<String> getMatchedClassSet() {
104+
return matchedClassSet;
105+
}
106+
107+
public void setMatchedClassSet(Set<String> matchedClassSet) {
108+
this.matchedClassSet = matchedClassSet;
109+
}
101110
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,20 @@ static Method getAsmMethod(final Class<?> clazz,
256256
boolean.class
257257
);
258258

259+
Method SPY$skipCollect = InnerHelper.getAsmMethod(
260+
SpyDispatcher.class,
261+
"skipCollect",
262+
Object.class,
263+
Object[].class,
264+
Object.class,
265+
String.class,
266+
String.class,
267+
String.class,
268+
String.class,
269+
String.class,
270+
boolean.class
271+
);
272+
259273
Method SPY$traceFeignInvoke = InnerHelper.getAsmMethod(
260274
SpyDispatcher.class,
261275
"traceFeignInvoke",
@@ -279,6 +293,18 @@ static Method getAsmMethod(final Class<?> clazz,
279293
String.class
280294
);
281295

296+
Method SPY$isSkipCollectDubbo = InnerHelper.getAsmMethod(
297+
SpyDispatcher.class,
298+
"isSkipCollectDubbo",
299+
Object.class
300+
);
301+
302+
Method SPY$isSkipCollectFeign = InnerHelper.getAsmMethod(
303+
SpyDispatcher.class,
304+
"isSkipCollectFeign",
305+
Object.class
306+
);
307+
282308
Method SPY$reportService = InnerHelper.getAsmMethod(
283309
SpyDispatcher.class,
284310
"reportService",

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/AbstractAdviceAdapter.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,32 @@ public void captureMethodState(
174174
pop();
175175
}
176176

177+
public void skipCollect(
178+
final int opcode,
179+
final PolicyNode policyNode,
180+
final boolean captureRet
181+
) {
182+
newLocal(ASM_TYPE_OBJECT);
183+
if (captureRet && !isThrow(opcode)) {
184+
loadReturn(opcode);
185+
} else {
186+
pushNull();
187+
}
188+
storeLocal(this.nextLocal - 1);
189+
invokeStatic(ASM_TYPE_SPY_HANDLER, SPY_HANDLER$getDispatcher);
190+
loadThisOrPushNullIfIsStatic();
191+
loadArgArray();
192+
loadLocal(this.nextLocal - 1);
193+
push(policyNode.toString());
194+
push(this.context.getClassName());
195+
push(this.context.getMatchedClassName());
196+
push(this.name);
197+
push(this.signature);
198+
push(Modifier.isStatic(this.access));
199+
invokeInterface(ASM_TYPE_SPY_DISPATCHER, SPY$skipCollect);
200+
pop();
201+
}
202+
177203
/**
178204
* 是否抛出异常返回(通过字节码判断)
179205
*

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/core/DispatchClassPlugin.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ public DispatchClassPlugin() {
2929
public ClassVisitor dispatch(ClassVisitor classVisitor, ClassContext classContext, Policy policy) {
3030
ancestors = classContext.getAncestors();
3131
className = classContext.getClassName();
32-
String matchedClassName = policy.getMatchedClass(className, ancestors);
32+
Set<String> matchedClassNameSet = policy.getMatchedClass(classContext,className, ancestors);
3333

34-
if (null == matchedClassName) {
34+
if (0 == matchedClassNameSet.size()) {
3535
return classVisitor;
3636
}
3737

38-
classContext.setMatchedClassName(matchedClassName);
38+
classContext.setMatchedClassSet(matchedClassNameSet);
3939
return new ClassVisit(classVisitor, classContext, policy);
4040
}
4141

@@ -89,17 +89,22 @@ public MethodVisitor visitMethod(final int access, final String name, final Stri
8989
methodContext.setDescriptor(descriptor);
9090
methodContext.setParameters(AsmUtils.buildParameterTypes(descriptor));
9191

92-
String matchedSignature = AsmUtils.buildSignature(context.getMatchedClassName(), name, descriptor);
93-
94-
mv = lazyAop(mv, access, name, descriptor, matchedSignature, methodContext);
95-
boolean methodIsTransformed = mv instanceof MethodAdviceAdapter;
92+
String matchedSignature;
93+
boolean methodIsTransformed = false;
94+
for (String matchedName : context.getMatchedClassSet()) {
95+
context.setMatchedClassName(matchedName);
96+
matchedSignature = AsmUtils.buildSignature(matchedName, name, descriptor);
97+
mv = lazyAop(mv, access, name, descriptor, matchedSignature, methodContext);
98+
methodIsTransformed = mv instanceof MethodAdviceAdapter;
99+
if (methodIsTransformed) break;
96100

101+
}
97102
if (methodIsTransformed && this.classVersion <= Opcodes.V1_6) {
98103
mv = new JSRInlinerAdapter(mv, access, name, descriptor, signature, exceptions);
99104
}
100105

101106
if (methodIsTransformed) {
102-
DongTaiLog.trace("rewrite method {} for listener[class={}]", matchedSignature, context.getClassName());
107+
DongTaiLog.trace("rewrite method {} for listener[class={}]", context.getMatchedClassName(), context.getClassName());
103108
}
104109

105110
return mv;

0 commit comments

Comments
 (0)