2121import java .io .IOException ;
2222import java .io .ObjectInputStream ;
2323import java .io .ObjectOutputStream ;
24+ import java .io .ObjectStreamClass ;
25+ import java .util .ArrayList ;
26+ import java .util .List ;
2427import java .util .Optional ;
28+ import org .apache .seata .common .exception .ErrorCode ;
29+ import org .apache .seata .common .exception .SeataRuntimeException ;
2530import org .apache .seata .common .loader .EnhancedServiceLoader ;
2631import org .apache .seata .core .compressor .CompressorFactory ;
2732import org .apache .seata .core .serializer .Serializer ;
@@ -36,6 +41,14 @@ public class RaftSyncMessageSerializer {
3641
3742 private static final Logger LOGGER = LoggerFactory .getLogger (RaftSyncMessageSerializer .class );
3843
44+ private static final List <String > PERMITS = new ArrayList <>();
45+
46+ static {
47+ PERMITS .add (RaftSyncMessage .class .getName ());
48+ PERMITS .add (io .seata .server .cluster .raft .sync .msg .RaftSyncMessage .class .getName ());
49+ PERMITS .add ("[B" );
50+ }
51+
3952 public static byte [] encode (RaftSyncMessage raftSyncMessage ) throws IOException {
4053 try (ByteArrayOutputStream bos = new ByteArrayOutputStream ();
4154 ObjectOutputStream oos = new ObjectOutputStream (bos )) {
@@ -62,12 +75,22 @@ public static byte[] encode(io.seata.server.cluster.raft.sync.msg.RaftSyncMessag
6275
6376 public static RaftSyncMessage decode (byte [] raftSyncMsgByte ) {
6477 try (ByteArrayInputStream bin = new ByteArrayInputStream (raftSyncMsgByte );
65- ObjectInputStream ois = new ObjectInputStream (bin )) {
78+ ObjectInputStream ois = new ObjectInputStream (bin ) {
79+ @ Override
80+ protected Class <?> resolveClass (ObjectStreamClass desc ) throws IOException , ClassNotFoundException {
81+ if (!PERMITS .contains (desc .getName ())) {
82+ throw new SeataRuntimeException (ErrorCode .ERR_DESERIALIZATION_SECURITY ,
83+ "Failed to deserialize object: " + desc .getName () + " is not permitted" );
84+ }
85+
86+ return super .resolveClass (desc );
87+ }
88+ }) {
6689 Object object = ois .readObject ();
6790 RaftSyncMessage raftSyncMessage ;
6891 if (object instanceof io .seata .server .cluster .raft .sync .msg .RaftSyncMessage ) {
6992 io .seata .server .cluster .raft .sync .msg .RaftSyncMessage oldRaftSyncMessage =
70- (io .seata .server .cluster .raft .sync .msg .RaftSyncMessage )object ;
93+ (io .seata .server .cluster .raft .sync .msg .RaftSyncMessage )object ;
7194 raftSyncMessage = new RaftSyncMessage ();
7295 raftSyncMessage .setCodec (oldRaftSyncMessage .getCodec ());
7396 raftSyncMessage .setCompressor (oldRaftSyncMessage .getCompressor ());
@@ -77,13 +100,16 @@ public static RaftSyncMessage decode(byte[] raftSyncMsgByte) {
77100 raftSyncMessage = (RaftSyncMessage )object ;
78101 }
79102 Serializer serializer = EnhancedServiceLoader .load (Serializer .class ,
80- SerializerType .getByCode (raftSyncMessage .getCodec ()).name ());
103+ SerializerType .getByCode (raftSyncMessage .getCodec ()).name ());
81104 Optional .ofNullable (raftSyncMessage .getBody ())
82- .ifPresent (value -> raftSyncMessage .setBody (serializer .deserialize (CompressorFactory
83- .getCompressor (raftSyncMessage .getCompressor ()).decompress ((byte [])raftSyncMessage .getBody ()))));
105+ .ifPresent (value -> raftSyncMessage .setBody (serializer .deserialize (CompressorFactory
106+ .getCompressor (raftSyncMessage .getCompressor ()).decompress ((byte [])raftSyncMessage .getBody ()))));
84107 return raftSyncMessage ;
85- } catch (ClassNotFoundException | IOException e ) {
108+ } catch (Exception e ) {
86109 LOGGER .info ("Failed to read raft synchronization log: {}" , e .getMessage (), e );
110+ if (e instanceof SeataRuntimeException ) {
111+ throw (SeataRuntimeException )e ;
112+ }
87113 throw new RuntimeException (e );
88114 }
89115 }
0 commit comments