博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABAP和Java单例模式的攻防
阅读量:2436 次
发布时间:2019-05-10

本文共 2924 字,大约阅读时间需要 9 分钟。

ABAP

CLASS zcl_jerry_singleton DEFINITIONPUBLICFINALCREATE PRIVATE .PUBLIC SECTION.INTERFACES if_serializable_object .CLASS-METHODS class_constructor .CLASS-METHODS get_instanceRETURNINGVALUE(ro_instance) TYPE REF TO zcl_jerry_singleton .PROTECTED SECTION.PRIVATE SECTION.CLASS-DATA so_instance TYPE REF TO zcl_jerry_singleton .DATA mv_name TYPE string .DATA mv_initialized TYPE abap_bool .METHODS constructor .ENDCLASS.CLASS ZCL_JERRY_SINGLETON IMPLEMENTATION.* 
---------------------------------------------------------------------------------------+* | Static Public Method ZCL_JERRY_SINGLETON=>CLASS_CONSTRUCTOR* +-------------------------------------------------------------------------------------------------+* +--------------------------------------------------------------------------------------
METHOD class_constructor.so_instance = NEW zcl_jerry_singleton( ).ENDMETHOD.* 
---------------------------------------------------------------------------------------+* | Instance Public Method ZCL_JERRY_SINGLETON->CONSTRUCTOR* +-------------------------------------------------------------------------------------------------+* +--------------------------------------------------------------------------------------
METHOD constructor.mv_name = 'Jerry'.IF mv_initialized = abap_false.mv_initialized = abap_true.ELSE.MESSAGE 'you are in trouble!' TYPE 'E' DISPLAY LIKE 'I'.ENDIF.ENDMETHOD.* 
---------------------------------------------------------------------------------------+* | Static Public Method ZCL_JERRY_SINGLETON=>GET_INSTANCE* +-------------------------------------------------------------------------------------------------+* | [<-()] RO_INSTANCE TYPE REF TO ZCL_JERRY_SINGLETON* +--------------------------------------------------------------------------------------
METHOD get_instance.ro_instance = so_instance.ENDMETHOD.ENDCLASS.

通过序列化/反序列化攻击单例模式:

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.

webp

绕过了单例的限制,构造了第二个实例。

Java

除了用序列化/反序列化攻击外,还可以用反射攻击。

webp

然而我只需要将这个单例类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。这样就破坏了单例模式。

webp

第6行代码会打印false。

针对这种攻击,一种可行的防御措施是在单例类的构造函数内定义一个布尔变量,初始化为false。当构造函数执行后,该变量被置为true。如果接下来构造函数再次被执行,则人为抛出异常,避免构造函数重复执行。

webp

这种防御措施无法从根本上杜绝Singleton被攻击,因为攻击者仍旧可以通过反射来修改布尔变量flag的值,从而绕过这个检查。

最理想的不会受到攻击的单例模式实现是借助Java里枚举类Enumeration的特性:

webp

这种实现类型的单例模式的消费代码:

System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());

如果攻击者通过前面介绍的反射代码对这种实现方式的单例进行攻击,JDK会抛出NoSuchMethodException异常:

webp

究其原因,是因为现在我们是通过Java枚举方式实现的单例,枚举类没有传统意义上的构造函数,因此对这种反射攻击免疫。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24475491/viewspace-2216831/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24475491/viewspace-2216831/

你可能感兴趣的文章
Linux版本痛失桌面市场,标准将出炉(转)
查看>>
Solaris 10第二次更新的要点(转)
查看>>
Windows使用Apche并查看MySQL数据库(转)
查看>>
Shell 符号(转)
查看>>
Fedora Core 6 Pre release images available(转)
查看>>
linux下配置APACHE2.0.50+PHP5.0.3+MYSQL4.0.20+GD库(转)
查看>>
JAVA基础:我个人的面向对象的程序观(转)
查看>>
Linux操作系统内存管理的源码实现(转)
查看>>
RedHat 9上用iptables做NAT网关+远程使用kiwisyslog记录日志(转)
查看>>
root文件系统的一点经验(转)
查看>>
双系统 linux and winodws ,在windows重装以后(转)
查看>>
[Linux]用户及密码相关命令(转)
查看>>
FreeBSD中文化全攻略(转)
查看>>
在Linux上不带硬件安装Asterisk(转)
查看>>
UNIX(IBM AIX)系统基础知识(转)
查看>>
FC5下JRE的安装配置(转)
查看>>
从硬盘安装debian详细过程(通过chroot完成)(转)
查看>>
.bash_profile和.bashrc的什么区别(转)
查看>>
严防死守把蠕虫病毒拒绝在系统之外(转)
查看>>
深入分析Linux系统深度安全加固(转)
查看>>