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

roo*_*ook 9 ruby security

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

Abo*_*uby 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的作用和不保护的内容.关于你能做的唯一的事情就是寻找ruby_safe_leveleval.c(这是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
*/
Run Code Online (Sandbox Code Playgroud)

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


grd*_*dev 5

由于$SAFE >= 1只能在不安全的操作(例如等)中使用受污染的输入来保护您的形式eval,因此安全 Ruby方法中的任何漏洞仍然是一个问题.例如,CVE-2009-4124只要求您在输入上使用函数ljust/ center/ rjust,至少我的ruby1.8.7 版本认为这些函数是安全的.这是一个使用的Ruby片段,$SAFE = 4肯定会受到上述问题的攻击:

$SAFE = 4; ARGV[0].ljust(ARGV[1].to_i)
Run Code Online (Sandbox Code Playgroud)

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

此外,$SAFE = 1您可以使用untaint变量,因此一旦您untaint以及随后以非安全方式使用该变量,您的应用程序就容易受到攻击,该应用程序仍然容易受到攻击.