【缺陷周话】第6期:命令注入

阅读量    45893 | 评论 2

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。

360代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

1、命令注入

命令注入指应用程序所执行命令的内容或部分内容源于不可信赖的数据源时,程序本身没有对这些不可信赖的数据进行正确、合理的验证和过滤,导致程序执行了恶意命令。在 JAVA 应用程序中,敏感函数的参数如 Runtime.getRuntime().exec(Stringcommand) 中的 command 参数,该参数可为 os 命令,如果该参数可由用户控制,则极易造成命令注入。

本文以JAVA语言源代码为例,分析命令注入产生的原因以及修复方法。详见 CWE ID 77: Improper Neutralization of Special Elements used in a Command (‘Command Injection’)(http://cwe.mitre.org/data/definitions/77.html)。

 

2、命令注入的危害

命令注入利用应用程序的输入可以执行一些特殊的 os 命令,例如:使用 cpuinfo 命令查看系统信息,使用 shutdown命令关闭服务器。从2018年1月至10月,CVE中共有 205 条漏洞信息与其相关。部分漏洞如下:

CVE 漏洞概述
CVE-2018-0714 QNAP QTS 是中国威联通(QNAP Systems)公司的一套 Turbo NAS 作业系统。该系统可提供档案储存、管理、备份,多媒体应用及安全监控等功能。Helpdesk 是其中的一个帮助台程序。 QNAP QTS 中的 Helpdesk 1.1.21 及之前版本存在命令注入漏洞。远程攻击者可利用该漏洞在受影响的应用程序中运行任意命令。
CVE-2018-10900 Network Manager VPNC plugin (networkmanager-vpnc) 是一款支持连接 Cisco VPN 的虚拟网络管理器。Network Manager VPNC 插件 1.2.6 之前版本中存在安全漏洞,该漏洞源于换行字符可以被用来将 Password helper 参数注入到配置数据中并传入到 VPNC。攻击者可利用该漏洞以 root 权限执行命令。
CVE-2018-1000189 CloudBees Jenkins 是由美国公司 CloudBees 开发的一套基于Java 开发的持续集成工具,主要用于监控持续的软件版本发布/测试项目以及一些定时执行的任务。Absint Astree Plugin 是其中一个静态程序分析插件。CloudBees Jenkins Absint Astree Plugin 1.0.5 及之前版本中的 AstreeBuilder.java 文件存在命令执行漏洞。远程攻击者可利用该漏洞执行命令。
CVE-2018-1335 从 Apache Tika 版本 1.7 到 1.17,客户端可以将精心设计的头文件发送到 tika-server,该头文件可用于将命令注入运行 tika-server 的服务器的命令行。此漏洞仅影响在对不受信任的客户端开放的服务器上运行 tika-server 的漏洞。

 

3、示例代码

示例源于 Samate Juliet Test Suite for Java v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE78OSCommandInjectionProperty01.java。

3.1 缺陷代码

上述示例代码在第30行使用 getProperty() 函数获取了用户的账户名称,在第43行将获取的账户名称和变量 osCommand 进行拼接,直接执行了拼接的结果。攻击者可在用户的账户名称中存入特殊的 os 命令进行操作,例如删除文件,关闭主机等命令,从而造成命令注入。

使用360代码卫士对上述示例代码进行检测,可以检出“命令注入”缺陷,显示等级为高。如图1所示:

图1 命令注入检测示例

3.2 修复代码

在上述修复代码中,在第28行改为直接对变量 data 进行赋值,使敏感函数的参数值不由用户控制,当程序执行 exec() 函数时,参数来源于程序内部,这样就避免了命令注入。

使用360代码卫士对修复后的代码进行检测,可以看到已不存在“命令注入”缺陷。如图2:

图2:修复后检测结果

 

4、如何避免命令注入

要避免命令注入,需要注意以下几点:

  • 程序对非受信的用户输入数据进行净化,删除不安全的字符。
  • 创建一份安全字符串列表,限制用户只能输入该列表的数据。
  • 不要让用户直接控制eval()、 esec()、 readObject() 等函数的参数。
  • 使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的命令注入问题。
分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多