编辑3 自从我提出这个问题以来,已经发生了一些新的发展。基本上我没有“看到东西”,并且发现用Clojure编写的webapps很容易受到攻击,这促使Clojure 1.5和非常对Clojure Google团队进行热烈讨论。
以下是黑客新闻中关于Clojure 1.5变化的人的引用:
另一个有趣的事情是突然增强 read-eval和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是否需要执行输入清理才能防止攻击?
我特意想到的是webapps,比如当用户做一些HTTP POST时。
如果他发送的数据包含以下内容,该怎么办?
This is some malicious (eval '(nasty-stuff (...)) or whatever.
(我不是Lisp程序员,它只是我想到的一个例子,它并不意味着实际意味着代码)
由于Lisp的工作方式,有什么特别要记住的吗?例如,如果一些黑客黑客知道某个网络服务器在Clojure上运行,他是否可以利用这个事实,然后在括号中注入“代码”,然后在网络服务器上进行评估?
从Lisp接收/解析用户数据(以及因此可能制作的数据)时,这是一个问题吗?
答案 0 :(得分:7)
我在Lisp中编写了一些webapp(即Common Lisp),以下是我一直记在的内容:
read
,则应始终将*read-eval*
设置为nil
以获取任何不受信任的数据基本上,就是这样。此外,由于它是Lisp,它通常会使您的系统不易受到攻击,因为:
答案 1 :(得分:3)
你应该始终认为注射攻击是可能的,除非另有证明。如果不了解您的特定Lisp环境以及与之进行比较的内容,就无法回答您是否需要进行“特殊”清理。
请注意,“code”和“data”之间的软屏障并不是Lisp独有的。 perl
,曾经是网络世界的主力eval
。所以does PHP。看起来Java字节码注入也是可能的。
答案 2 :(得分:2)
它确实归结为:不使用READ而不使用EVAL。您需要确切地知道要发送给这些函数中的一个或两个的确切内容,以及它们执行的上下文。如果你不打电话给任何一个,那你就没事了。