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

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

内容简介:代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 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() 等函数的参数。
  • 使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的命令注入问题。

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

查看所有标签

猜你喜欢:

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

极简算法史:从数学到机器的故事

极简算法史:从数学到机器的故事

[法] 吕克•德•布拉班迪尔 / 任轶 / 人民邮电出版社 / 2019-1 / 39.00元

数学、逻辑学、计算机科学三大领域实属一家,彼此成就,彼此影响。从古希腊哲学到“无所不能”的计算机,数字、计算、推理这些貌似简单的概念在三千年里融汇、碰撞。如何将逻辑赋予数学意义?如何从简单运算走向复杂智慧?这背后充满了人类智慧的闪光:从柏拉图、莱布尼茨、罗素、香农到图灵都试图从数学公式中证明推理的合理性,缔造完美的思维体系。他们是凭天赋制胜,还是鲁莽地大胆一搏?本书描绘了一场人类探索数学、算法与逻......一起来看看 《极简算法史:从数学到机器的故事》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具