写点什么

ABAP 和 Java 里的单例模式攻击

作者:Jerry Wang
  • 2022 年 1 月 29 日
  • 本文字数:926 字

    阅读完需:约 3 分钟

ABAP 和 Java 里的单例模式攻击

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


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



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


使用下面的 ABAP 代码:


DATA(lo_instance) = zcl_jerry_singleton=>get_instance( ).DATA: s TYPE string.
CALL TRANSFORMATION id SOURCE model = lo_instance RESULT XML s.
DATA: lo_instance2 TYPE REF TO zcl_jerry_singleton.
CALL TRANSFORMATION id SOURCE XML s RESULT model = lo_instance2.
复制代码



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



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



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


Class<?> classType = JerrySingleton.class;  Constructor<?> c = classType.getDeclaredConstructor(null);  c.setAccessible(true);  JerrySingleton e1 = (JerrySingleton)c.newInstance();  JerrySingleton e2 = JerrySingleton.getInstance();  System.out.println(e1 == e2);   
复制代码



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


public enum JerrySingletonAnotherApproach {  INSTANCE ;      private String name = "Jerry" ;     public String getName() {        return this.name;    }  }
复制代码



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


System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());
复制代码


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


Exception in thread "main" java.lang.NoSuchMethodException: singleton.JerrySingletonAnotherApproach.<init>()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)


发布于: 刚刚阅读数: 2
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
ABAP 和 Java 里的单例模式攻击