1 package com.fasterxml.jackson.databind.jsontype.impl;
2
3 import java.util.Collections;
4 import java.util.HashSet;
5 import java.util.Set;
6
7 import com.fasterxml.jackson.databind.BeanDescription;
8 import com.fasterxml.jackson.databind.DeserializationContext;
9 import com.fasterxml.jackson.databind.JavaType;
10 import com.fasterxml.jackson.databind.JsonMappingException;
11
12
20 public class SubTypeValidator
21 {
22 protected final static String PREFIX_SPRING = "org.springframework.";
23
24 protected final static String PREFIX_C3P0 = "com.mchange.v2.c3p0.";
25
26
30 protected final static Set<String> DEFAULT_NO_DESER_CLASS_NAMES;
31 static {
32 Set<String> s = new HashSet<String>();
33
34
35 s.add("org.apache.commons.collections.functors.InvokerTransformer");
36 s.add("org.apache.commons.collections.functors.InstantiateTransformer");
37 s.add("org.apache.commons.collections4.functors.InvokerTransformer");
38 s.add("org.apache.commons.collections4.functors.InstantiateTransformer");
39 s.add("org.codehaus.groovy.runtime.ConvertedClosure");
40 s.add("org.codehaus.groovy.runtime.MethodClosure");
41 s.add("org.springframework.beans.factory.ObjectFactory");
42 s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
43 s.add("org.apache.xalan.xsltc.trax.TemplatesImpl");
44
45 s.add("com.sun.rowset.JdbcRowSetImpl");
46
47 s.add("java.util.logging.FileHandler");
48 s.add("java.rmi.server.UnicastRemoteObject");
49
50
51 s.add("org.springframework.beans.factory.config.PropertyPathFactoryBean");
52
53 s.add("org.springframework.aop.config.MethodLocatingFactoryBean");
54 s.add("org.springframework.beans.factory.config.BeanReferenceFactoryBean");
55
56
57
58
59 s.add("org.apache.tomcat.dbcp.dbcp2.BasicDataSource");
60 s.add("com.sun.org.apache.bcel.internal.util.ClassLoader");
61
62 s.add("org.hibernate.jmx.StatisticsService");
63 s.add("org.apache.ibatis.datasource.jndi.JndiDataSourceFactory");
64
65 s.add("org.apache.ibatis.parsing.XPathParser");
66
67
68 s.add("jodd.db.connection.DataSourceConnectionProvider");
69
70
71 s.add("oracle.jdbc.connector.OracleManagedConnectionFactory");
72 s.add("oracle.jdbc.rowset.OracleJDBCRowSet");
73
74
75 s.add("org.slf4j.ext.EventData");
76 s.add("flex.messaging.util.concurrent.AsynchBeansWorkManagerExecutor");
77 s.add("com.sun.deploy.security.ruleset.DRSHelper");
78 s.add("org.apache.axis2.jaxws.spi.handler.HandlerResolverImpl");
79
80
81 s.add("org.jboss.util.propertyeditor.DocumentEditor");
82 s.add("org.apache.openjpa.ee.RegistryManagedRuntime");
83 s.add("org.apache.openjpa.ee.JNDIManagedRuntime");
84 s.add("org.apache.openjpa.ee.WASRegistryManagedRuntime");
85 s.add("org.apache.axis2.transport.jms.JMSOutTransportInfo");
86
87
88 s.add("com.mysql.cj.jdbc.admin.MiniAdmin");
89
90
91 s.add("ch.qos.logback.core.db.DriverManagerConnectionSource");
92
93
94 s.add("org.jdom.transform.XSLTransformer");
95 s.add("org.jdom2.transform.XSLTransformer");
96
97
98 s.add("net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup");
99 s.add("net.sf.ehcache.hibernate.EhcacheJtaTransactionManagerLookup");
100
101
102 s.add("ch.qos.logback.core.db.JNDIConnectionSource");
103
104
105 s.add("com.zaxxer.hikari.HikariConfig");
106
107 s.add("com.zaxxer.hikari.HikariDataSource");
108
109
110 s.add("org.apache.cxf.jaxrs.provider.XSLTJaxbProvider");
111
112
113 s.add("org.apache.commons.configuration.JNDIConfiguration");
114 s.add("org.apache.commons.configuration2.JNDIConfiguration");
115
116
117 s.add("org.apache.xalan.lib.sql.JNDIConnectionPool");
118
119 s.add("com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool");
120
121
122 s.add("org.apache.commons.dbcp.datasources.PerUserPoolDataSource");
123 s.add("org.apache.commons.dbcp.datasources.SharedPoolDataSource");
124 s.add("com.p6spy.engine.spy.P6DataSource");
125
126
127 s.add("org.apache.log4j.receivers.db.DriverManagerConnectionSource");
128 s.add("org.apache.log4j.receivers.db.JNDIConnectionSource");
129
130
131 s.add("net.sf.ehcache.transaction.manager.selector.GenericJndiSelector");
132 s.add("net.sf.ehcache.transaction.manager.selector.GlassfishSelector");
133
134
135 s.add("org.apache.xbean.propertyeditor.JndiConverter");
136
137
138 s.add("org.apache.hadoop.shaded.com.zaxxer.hikari.HikariConfig");
139
140
141 s.add("com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig");
142 s.add("br.com.anteros.dbcp.AnterosDBCPConfig");
143
144 s.add("br.com.anteros.dbcp.AnterosDBCPDataSource");
145
146
147 s.add("javax.swing.JEditorPane");
148 s.add("javax.swing.JTextPane");
149
150
151 s.add("org.apache.shiro.realm.jndi.JndiRealmFactory");
152 s.add("org.apache.shiro.jndi.JndiObjectFactory");
153
154
155 s.add("org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup");
156 s.add("org.apache.ignite.cache.jta.jndi.CacheJndiTmFactory");
157 s.add("org.quartz.utils.JNDIConnectionProvider");
158
159
160 s.add("org.apache.aries.transaction.jms.internal.XaPooledConnectionFactory");
161 s.add("org.apache.aries.transaction.jms.RecoverablePooledConnectionFactory");
162
163
164 s.add("com.caucho.config.types.ResourceRef");
165
166
167 s.add("org.aoju.bus.proxy.provider.RmiProvider");
168 s.add("org.aoju.bus.proxy.provider.remoting.RmiProvider");
169
170
171
172 s.add("org.apache.activemq.ActiveMQConnectionFactory");
173 s.add("org.apache.activemq.ActiveMQXAConnectionFactory");
174 s.add("org.apache.activemq.spring.ActiveMQConnectionFactory");
175 s.add("org.apache.activemq.spring.ActiveMQXAConnectionFactory");
176 s.add("org.apache.activemq.pool.JcaPooledConnectionFactory");
177 s.add("org.apache.activemq.pool.PooledConnectionFactory");
178 s.add("org.apache.activemq.pool.XaPooledConnectionFactory");
179 s.add("org.apache.activemq.jms.pool.XaPooledConnectionFactory");
180 s.add("org.apache.activemq.jms.pool.JcaPooledConnectionFactory");
181
182
183 s.add("org.apache.commons.proxy.provider.remoting.RmiProvider");
184
185
186 s.add("org.apache.commons.jelly.impl.Embedded");
187
188
189 s.add("oadd.org.apache.xalan.lib.sql.JNDIConnectionPool");
190
191
192
193
194 s.add("oracle.jms.AQjmsQueueConnectionFactory");
195 s.add("oracle.jms.AQjmsXATopicConnectionFactory");
196 s.add("oracle.jms.AQjmsTopicConnectionFactory");
197 s.add("oracle.jms.AQjmsXAQueueConnectionFactory");
198 s.add("oracle.jms.AQjmsXAConnectionFactory");
199
200
201 s.add("org.jsecurity.realm.jndi.JndiRealmFactory");
202
203
204 s.add("com.pastdev.httpcomponents.configuration.JndiConfiguration");
205
206
207 s.add("com.nqadmin.rowset.JdbcRowSetImpl");
208 s.add("org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl");
209
210 DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
211 }
212
213
216 protected Set<String> _cfgIllegalClassNames = DEFAULT_NO_DESER_CLASS_NAMES;
217
218 private final static SubTypeValidator instance = new SubTypeValidator();
219
220 protected SubTypeValidator() { }
221
222 public static SubTypeValidator instance() { return instance; }
223
224 public void validateSubType(DeserializationContext ctxt, JavaType type,
225 BeanDescription beanDesc) throws JsonMappingException
226 {
227
228
229 final Class<?> raw = type.getRawClass();
230 String full = raw.getName();
231
232 main_check:
233 do {
234 if (_cfgIllegalClassNames.contains(full)) {
235 break;
236 }
237
238
239
240
241 if (raw.isInterface()) {
242 ;
243 } else if (full.startsWith(PREFIX_SPRING)) {
244 for (Class<?> cls = raw; (cls != null) && (cls != Object.class); cls = cls.getSuperclass()){
245 String name = cls.getSimpleName();
246
247 if ("AbstractPointcutAdvisor".equals(name)
248
249 || "AbstractApplicationContext".equals(name)) {
250 break main_check;
251 }
252 }
253 } else if (full.startsWith(PREFIX_C3P0)) {
254
255
256
257
258
259
260 if (full.endsWith("DataSource")) {
261 break main_check;
262 }
263 }
264 return;
265 } while (false);
266
267 ctxt.reportBadTypeDefinition(beanDesc,
268 "Illegal type (%s) to deserialize: prevented for security reasons", full);
269 }
270 }
271