【发布时间】:2011-10-27 03:01:49
【问题描述】:
编辑 3 自从我提出这个问题以来,已经发生了相当多的新进展。基本上我没有“看到东西”,并且发现用 Clojure 编写的 web 应用程序容易受到攻击,这促使 Clojure 1.5 发生了变化,并且非常在 Clojure Google 群组上进行了激烈的讨论。
以下是 Hacker News 上某人关于 Clojure 1.5 变化的引述:
另一个稍微有趣的事情是突然增强 读取评估和 EDN[2]。这主要是因为恶劣的天气 Ruby/Rubygems 存在 YAML 漏洞,这导致了激烈的 讨论 Clojure 阅读器在默认情况下应该如何操作。
漏洞已被发现,现在修复 Clojure 为时已晚,因此 read-eval 仍应默认设置为 true (否则它会破坏太多事物)。在 Clojure 中解析输入的任何人都不应使用默认读取函数,而应使用 EDN 函数。
所以我当然没有看到任何东西,人们很快(甚至不到 18 个月)就找到了攻击常见 Clojure webapp 堆栈的方法。
编辑 2 我不知道,但我的问题是以下问题的欺骗(被描述为“杀手问题”):Lisp data security/validation
如果有人对这个问题的答案感兴趣,我建议他们打开上面的问题并阅读 Lisp 大师在那里做出的答案,而不是 “这里没什么可看的,继续前进,就像 PHP 或 JavaScript".
编辑:我想知道,由于它是 Lisp,攻击者是否会“更容易”转换“数据”(即“使用恶意软件制作的用户输入意图”)转化为“代码”。例如,在开始“评估”/解析或任何数据之前,我是否需要转义/替换用户输入中的所有括号?
原始问题
我仍在阅读有关 Lisp 的信息,突然间我想知道,对于整个“代码就是数据”/“数据就是代码”的事情,Lisp 是否需要执行输入清理以防止攻击?
我专门考虑 web 应用程序,比如当用户执行一些 HTTP POST 时。
如果他发送的数据包含以下内容怎么办:
This is some malicious (eval '(nasty-stuff (...)) or whatever.
(我不是 Lisp 程序员,这只是我脑海中的一个例子,并不意味着实际上是卑鄙的代码)
由于 Lisp 的工作方式,有什么特别需要记住的吗?例如,如果某个阴暗面的黑客知道某个网络服务器正在 Clojure 上运行,他是否可以利用这一事实,然后注入“括号之间的代码”,然后在网络服务器上进行评估?
在从 Lisp 接收/解析用户数据(因此可能是精心制作的数据)时,这是否是一个问题?
【问题讨论】:
-
“Easier”在谈论漏洞利用时相对没有意义。正如 ObscureRobot 正确指出的那样,怀疑一切或更好的是仍然不要
eval用户输入。正如 Robot 所指出的那样,LISP 并不是特别特别。 -
几乎没有任何理由在生产代码中使用 eval,除非您提供在线评估器。
-
@ObscureRobot:欺骗:stackoverflow.com/questions/3000193
-
我看不出它与任何其他具有 EVAL 的语言有何不同。你说在另一个问题上去阅读“Lisp 大师”,但他们说的完全一样,即永远不要使用 EVAL。 :-)