且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ABAP和Java里的单例模式攻击

更新时间:2022-08-21 18:45:56

面向对象编程世界里的单例模式(Singleton)可能是设计模式里最简单的一种,大多数开发人员都觉得可以很容易掌握它的用法。单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。


然而在某些场景下,这种设计模式的单例特性会被破坏,看下面这个例子:




代码的第三行,这个ABAP类实现了接口if_serializable_object,这意味着它可以被关键字CALL TRANSFORMATION进行序列化和反序列化操作。


使用下面的ABAP代码:

ABAP和Java里的单例模式攻击


执行之后,在调试器里发现lo_instance和lo_instance2指向了两个不同的对象实例,说明此时这个ABAP单例模式已经被破坏了。




再看看Java,下面是一个最简单的Java单例模式:


ABAP和Java里的单例模式攻击


然而我们仍然可以通过Java的反射机制来破坏这个单例:

ABAP和Java里的单例模式攻击


在Java里,我们可以通过枚举类来防御这种反射攻击:

ABAP和Java里的单例模式攻击

这种单例模式的消费代码:

ABAP和Java里的单例模式攻击


此时别有用心的攻击者如果想使用反射机制创建新的实例,会收到下面的报错信息:


Exception in thread “main” java.lang.NoSuchMethodException: singleton.JerrySingletonAnotherApproach.()

at java.lang.Class.getConstructor0(Class.java:3082)

at java.lang.Class.getDeclaredConstructor(Class.java:2178)

at singleton.SingletonAttack.test3(SingletonAttack.java:31)

at singleton.SingletonAttack.main(SingletonAttack.java:43)