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

栏目: 编程工具 · 发布时间: 5年前

内容简介:代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。360代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

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

代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 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 缺陷代码

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

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

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

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

图1 命令注入检测示例

3.2 修复代码

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

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

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

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

图2:修复后检测结果

4、如何避免命令注入

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

  • 程序对非受信的用户输入数据进行净化,删除不安全的字符。
  • 创建一份安全字符串列表,限制用户只能输入该列表的数据。
  • 不要让用户直接控制eval()、 esec()、 readObject() 等函数的参数。
  • 使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的命令注入问题。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解LINUX内核(第三版)

深入理解LINUX内核(第三版)

(美)博韦,西斯特 / 陈莉君;张琼声;张宏伟 / 中国电力出版社 / 2007-10-01 / 98.00元

为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU与外界间的所有交互,并且决定哪些程序将以什么顺序共享处理器时间。它如此有效地管理有限的内存,以至成百上千的进程能高效地共享系统。它熟练地统筹数据传输,这样CPU 不用为等待速度相对较慢的硬盘而消耗比正常耗时更长的时间。 《深入理解Linux内核,第三版》指导你对内核......一起来看看 《深入理解LINUX内核(第三版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具