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环境中的授权经常配置错误或过于宽松——不能假设所有用户(有时数千个)都配置得足够严格以防止滥用。
潜在恶意用户可以利用此函数模块绕过多个关键安全控制,例如:
-
绕过任何授权限制:可以在数据库中读取、修改或删除任意数据,导致系统完全沦陷并可能影响连接的系统
-
在SAP命名空间中插入自定义代码:攻击者可以通过创建新报告将ABAP代码写入标准命名空间
-
绕过系统/客户端可修改性锁定:即使系统或客户端设置为"不可修改",也可以引入代码更改
因此,授予本地函数模块执行访问权限(例如通过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查看):
|
|
下一步,通过事务SE37打开本地函数模块WRITE_AND_CALL_DBPROG。
为函数模块的表单字段(输入参数)填写以下值:
|
|
为表参数(输入参数)STATEMENTS填写以下值:
|
|
执行函数模块后,创建并执行名为"Z_HACKED"的报告。
生成的报告代码如下:
|
|
成功执行此代码将REFUSER DDIC附加到用户DEVELOPER,有效地授予超级用户权限。
通过SE16可以看到表USREFUS的更改内容:
|
|
关于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