在$ SAFE> = 1的ruby中可能存在哪些漏洞?

时间:2010-08-05 17:39:53

标签: ruby security

Ruby's safe mode不允许通过潜在危险的操作使用受污染的数据。它的级别不同,0表示禁用,然后1-4表示安全级别。启用安全模式后可能存在哪些漏洞?你知道在安全模式启用时发给ruby程序的任何CVE编号吗?在启用安全模式的情况下,CWE Violations(或cwe系列)可以是什么?

2 个答案:

答案 0 :(得分:8)

所有应用程序级漏洞完全不受$ SAFE级别的影响。注入攻击不会通过“不安全的操作”,例如跨站点脚本和SQL注入。这或多或少包括Web应用程序的每个漏洞类,除了本地和远程文件包含。请参阅OWASP Top 10,$ SAFE对其中许多内容没有帮助。

$ SAFE级别确实可以保护您免受系统级漏洞的影响。如果攻击者能够将Ruby代码编写到/ tmp中的文件中,那么如果$ SAFE> = 2,他们将无法欺骗您的程序加载该代码。

这当然不包括Ruby本身的任何漏洞。这些更严重,可以完全绕过$ SAFE。

Ruby解释器本身中的普通旧缓冲区溢出,整数溢出等与$ SAFE无关。

无论是否启用$ SAFE,Rails都会出现历史漏洞。由于用户输入存储在Rails应用程序中,恶意数据可以在以后弹出,这很复杂。

Ruby应用程序中的漏洞报告其他比Rails和MRI很难得到。

$ SAFE的另一个大问题是没有真正的列表(我知道)将完全概述为$ SAFE做什么和不保护。关于你唯一能做的就是在eval.c中搜索 ruby​​_safe_level (这是1.8.4中较旧的eval.c)。评论提供了这种描述,但它很模糊。

/* safe-level:
   0 - strings from streams/environment/ARGV are tainted (default)
   1 - no dangerous operation by tainted value
   2 - process/file operations prohibited
   3 - all generated objects are tainted
   4 - no global (non-tainted) variable modification/no direct output
*/

我想我想说的是$ SAFE是关于系统安全性的。它做得很好,但没有真正的方法来确切知道什么是和不受保护。它不应该是你唯一的防线,它更像是一个安全网,所以没有任何东西可以用于“不安全的操作”。另一方面,它与应用程序安全性无关,也不会保护您的数据或用户免受攻击。最重要的是,MRI具有完全绕过$ SAFE的漏洞历史。

答案 1 :(得分:5)

由于$SAFE >= 1仅保护您在不安全操作中使用受污染的输入,例如eval等,因此安全中的任何漏洞Ruby方法仍然是个问题。例如,CVE-2009-4124只要求您在输入中使用ljust / center / rjust函数,并且至少我的ruby 1.8.7版本考虑这些功能安全。这是一个使用$SAFE = 4的Ruby代码段,肯定容易受到上述问题的影响:

$SAFE = 4; ARGV[0].ljust(ARGV[1].to_i)

通常,即使Ruby脚本以安全模式运行,大多数Ruby漏洞仍然可以被定位。

此外,对于$SAFE = 1,您可以untaint个变量,因此只要您untaint并且随后以非安全的方式使用该变量,您的应用程序就会受到攻击仍然很脆弱。