Ruby's safe mode不允许有潜在危险的操作使用受污染的数据 . 它的级别不同,0表示禁用,然后1-4表示安全级别 . 启用安全模式后可能存在哪些漏洞?你知道在安全模式启用时发给ruby程序的任何CVE编号吗?什么CWE Violations(或cwe系列)可以启用安全模式?
Ruby's safe mode不允许有潜在危险的操作使用受污染的数据 . 它的级别不同,0表示禁用,然后1-4表示安全级别 . 启用安全模式后可能存在哪些漏洞?你知道在安全模式启用时发给ruby程序的任何CVE编号吗?什么CWE Violations(或cwe系列)可以启用安全模式?
2 回答
所有应用程序级漏洞完全不受$ SAFE级别的影响 . 例如,注入攻击不会像跨站点脚本和SQL注入那样通过"unsafe operation" . 这或多或少包括Web应用程序的每个漏洞类,除了本地和远程文件包含 . 请参阅OWASP Top 10,$ SAFE对其中的许多内容没有帮助 .
虽然$ SAFE级别确实可以保护您免受系统级漏洞的影响 . 如果攻击者能够将Ruby代码编写到/ tmp中的文件中,那么如果$ SAFE> = 2,他们将无法欺骗您的程序加载该代码 .
这当然不包括Ruby本身的任何漏洞 . 这些更严重,可以完全绕过$ SAFE .
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-3657
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-3655
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-3694
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-2337
或者Ruby解释器本身中的普通旧缓冲区溢出,整数溢出等与$ SAFE无关 .
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2489
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-4124
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2726
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2376
无论是否启用$ SAFE,Rails都会出现历史漏洞 . 由于用户输入存储在Rails应用程序中,恶意数据可以在以后弹出,这使事情变得复杂 .
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-4214
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3009
Ruby Rails和MRI以外的Ruby应用程序中的漏洞报告很难得到 .
$ SAFE的另一个大问题是没有真正的清单(我知道),它清楚地概述了$ SAFE的作用和不保护的内容 . 关于你唯一能做的就是在eval.c中搜索ruby_safe_level(这是一个较旧的eval.c,来自1.8.4) . 评论提供了这种描述,但它很模糊 .
我想我想说的是$ SAFE是关于系统安全性的 . 它做得很好,但没有真正的方法来确切知道什么是和不受保护 . 它不应该是你唯一的防线,它更像是一个安全网,所以没有任何东西可以用于“不安全的操作” . 另一方面,它与应用程序安全性无关,也不会保护您的数据或用户免受攻击 . 最重要的是,MRI具有完全绕过$ SAFE的漏洞历史 .
由于
$SAFE >= 1
仅保护您在不安全操作(例如eval
等)中使用污染输入,因此安全Ruby方法中的任何漏洞仍然是个问题 . 例如CVE-2009-4124只要求您在输入上使用函数ljust
/center
/rjust
,并且至少我的ruby
1.8.7版本认为这些函数是安全的 . 这是一个使用$SAFE = 4
的Ruby代码段,肯定容易受到上述问题的影响:通常,即使Ruby脚本以安全模式运行,大多数Ruby漏洞仍然可以被定位 .
此外,使用
$SAFE = 1
,您可以使用untaint
变量,因此,只要您使用该变量并且随后以非安全方式使用该变量,您的应用程序就会受到攻击,该应用程序仍然容易受到攻击 .