代码审计系列之EOS开发框架
字数 1279 2025-08-24 07:48:33
EOS开发框架代码审计与安全分析
1. EOS框架简介
Primeton EOS(Enterprise Operation System)是基于J2EE平台、采用面向构件技术实现企业级应用开发、运行、管理、监控、维护的中间件平台。EOS6是普元公司推出的基于SOA架构,支持SCA1.0、SDO2.1规范的新一代EOS产品。
2. 默认配置与安全问题
2.1 默认web.xml配置分析
EOS框架的默认web.xml配置中暴露了两个主要的安全问题:
- WebService接口泄露:默认配置了多个WebService接口映射
- REST接口泄露:通过restconfig.properties文件映射REST接口
2.2 WebService接口泄露
默认配置了以下WebService接口:
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/WSActivityInstManagerService</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/WSAgentManagerService</url-pattern>
</servlet-mapping>
<!-- 其他类似配置... -->
这些接口可以通过访问http://localhost:8080/WSActivityInstManagerService?wsdl等方式获取WSDL描述。
2.3 REST接口泄露
REST接口通过restconfig.properties文件映射:
resteasy.resources=com.primeton.bps.web.control.restful.WebControlRestService
示例REST接口类:
@Path("/rest/services/bps/webcontrol")
@Consumes({"application/json", "application/x-www-form-urlencoded"})
@Produces({"application/json"})
public class WebControlRestService {
@POST
@Path("/queryParticipants")
public Map<String, Object> queryParticipants(HashMap<String, Object> mapObject) throws WFServiceException, JSONException {
// 实现逻辑
}
// 其他方法...
}
调用方式(JSON参数):
POST /rest/services/bps/webcontrol/queryProcessAndActivity HTTP/1.1
Content-Type: application/json
{"workItemID":1}
3. EOS框架核心机制分析
3.1 拦截器机制
EOS框架通过InterceptorFilter和ControllerServlet实现请求处理:
- 核心拦截器:
com.eos.access.http.InterceptorFilter - 核心Servlet:
com.eos.access.http.ControllerServlet
拦截器初始化流程
- 初始化子拦截器:
public void init() {
Map processors = RequstProcessors.INSTANCE.getAllProcessors();
// 初始化处理器拦截器
WebInterceptorConfig i$ = new WebInterceptorConfig();
i$.setFilterId("ProcessorInterceptor_" + (String) interceptors.getKey());
i$.setSortIdx(2147483647);
i$.setPattern((String) interceptors.getKey());
i$.setClassName(ProcessorWebInterceptor.class.getName());
WebInterceptorManager.INSTANCE.addInterceptorConfig(i$);
// 其他初始化...
}
- 解析
handler-processor.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<handlers>
<handler id="flowProcessor" suffix=".flow" sortIdx="0" class="com.primeton.ext.engine.core.processor.HttpPageFlowProcessor"/>
<handler id="actionProcessor" suffix=".action" sortIdx="0" class="com.primeton.ext.engine.core.processor.ActionProcessor"/>
<!-- 其他处理器配置... -->
</handlers>
- 解析
handler-web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<handlers>
<handler id="WSInterceptor" sortIdx="0" pattern="/*" class="com.primeton.sca.host.webapp.SCAWebServiceServletFilter"/>
<handler id="WebI18NInterceptor" sortIdx="1" pattern="/*" class="com.primeton.access.http.impl.WebI18NInterceptor"/>
<!-- 其他拦截器配置... -->
</handlers>
拦截器执行流程
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain) {
WebInterceptorChainImpl var16 = (WebInterceptorChainImpl) WebInterceptorManager.INSTANCE.createChain(request, response);
var16.setFilterChain(filterChain);
var16.doIntercept(request, response);
}
拦截器链执行:
public void doIntercept(HttpServletRequest servletrequest, HttpServletResponse servletresponse) {
if (this.pos == this.interceptors.size()) {
this.filterChain.doFilter(servletrequest, servletresponse);
} else {
IWebInterceptor interceptor = (IWebInterceptor) this.interceptors.get(this.pos);
interceptor.doIntercept(servletrequest, servletresponse, this);
}
}
3.2 关键拦截器功能
- WSInterceptor:WebService请求路由
- WebI18NInterceptor:国际化处理
- HttpSecurityWebInterceptor:框架安全路由
- HttpRefererWebInterceptor:Referer检查
- UserLoginInterceptor:登录检查
- AccessedResourceInterceptor:资源访问权限检查
4. 安全漏洞分析
4.1 反序列化漏洞
在HttpPageFlowProcessor处理流程中:
- 参数处理:
public void doProcess(HttpServletRequest request, HttpServletResponse response, IParameterSet parameterSetA) {
Object var35 = request.getAttribute("_eosRequestDataContext");
if (var35 != null && var35 instanceof PageflowRuntimeContext) {
// 处理逻辑...
}
}
- 参数构建:
public void build(IVariable[] vars, IDataContext context) {
// 处理_eosFlowDataContext参数
String var33 = (String) this.values.get("_eosFlowDataContext");
if (var33 != null && !var33.equals("")) {
Object var35 = ContextSerializer.deserialize(var33);
}
}
- 反序列化实现:
public static Object deserialize(String codedString) throws IOException, ClassNotFoundException {
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(codedString);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
ObjectInputStream oos = new ObjectInputStream(bais);
Object o = oos.readObject(); // 反序列化点
oos.close();
return o;
}
4.2 XXE漏洞
在AjaxBizProcessor中:
public void init() {
String e = this.request.getParameter("__ajaxParam");
StringBuffer buffer = new StringBuffer(URLDecoder.decode(e, "UTF-8"));
String xml = buffer.toString();
Document var11;
if (!getXMLHeader(xml).contains("encoding")) {
String paramNode = MultipartResolver.getEncoding();
var11 = XmlUtil.parseStringThrowsException(xml, paramNode); // XXE潜在点
} else {
var11 = XmlUtil.parseString(xml); // XXE潜在点
}
}
5. 安全建议
-
避免默认配置保留发布:
- 移除不必要的WebService接口映射
- 禁用或保护REST接口
-
接口安全:
- 对REST接口采用复杂命名
- 实施适当的访问控制
-
XML处理安全:
- 禁用XML解析库的实体解析
- 在Filter中添加XXE防护
-
反序列化防护:
- 升级JDK版本
- 替换不安全的反序列化实现
- 实施反序列化白名单控制
-
其他建议:
- 实施输入验证和过滤
- 启用安全日志记录
- 定期进行安全审计