Lisp应用程序和webapps需要特殊的输入清理吗?

时间:2011-10-27 03:01:49

标签: security clojure lisp

编辑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接收/解析用户数据(以及因此可能制作的数据)时,这是一个问题吗?

3 个答案:

答案 0 :(得分:7)

我在Lisp中编写了一些webapp(即Common Lisp),以下是我一直记在的内容:

  • 如果您使用read,则应始终将*read-eval*设置为nil以获取任何不受信任的数据
  • 如果你正在处理代码生成 - 例如,HTML,JS,CSS或SQL生成 - 这在Lisp-land中很常见,你不应该忘记使用相应库提供的消毒设施(不使用原始输入字符串)

基本上,就是这样。此外,由于它是Lisp,它通常会使您的系统不易受到攻击,因为:

  • 没有标准攻击(因为Lisp的使用相对较少)
  • 系统在默认方面相当安全 - 这不是唯一的,但是许多面向Web的语言(例如首先是PHP)在默认情况下会受到不安全因素的影响,尽管它可以通过现代框架来缓解

答案 1 :(得分:3)

你应该始终认为注射攻击是可能的,除非另有证明。如果不了解您的特定Lisp环境以及与之进行比较的内容,就无法回答您是否需要进行“特殊”清理。

  • 我们知道机器码攻击是可能的。
  • 我们知道SQL注入是可能的。
  • 我们应该假设有可能劫持任何图灵完备系统,无论是硬件还是软件。

请注意,“code”和“data”之间的软屏障并不是Lisp独有的。 perl,曾经是网络世界的主力eval。所以does PHP。看起来Java字节码注入也是可能的。

答案 2 :(得分:2)

它确实归结为:不使用READ而不使用EVAL。您需要确切地知道要发送给这些函数中的一个或两个的确切内容,以及它们执行的上下文。如果你不打电话给任何一个,那你就没事了。