Clojure关键字示例安全问题

nha*_*nha 4 security clojure

阅读此问题后,从用户数据创建Clojure关键字的安全隐患?,特别是这个答案,我试图找到一个案例,我可以在REPL中证明这个问题.这是一个尝试:

user> *clojure-version*
{:major 1, :minor 8, :incremental 0, :qualifier nil}
user> (def a (atom 0))
#'user/a
user> (defn bad-fn []
        (println "called ")
        (swap! a inc))
#'user/bad-fn
user> @a
0
user> (keyword "#=(bad-fn)")
:#=(bad-fn)
user> @a
0
Run Code Online (Sandbox Code Playgroud)

我该如何重现这个问题?

Mic*_*zyk 6

问题不在于调用keyword字符串会立即执行字符串中嵌入的任何代码,但如果您想将字符串表示存储(keyword "foo #=(println :bar)")在文件中,然后使用该文件read,则最终会执行嵌入代码.

当然,根本不建议read用户提供字符串,但这个问题是关于安全性的,所以答案(Brian和我的)描述了可能因滥用各种设施而导致的安全问题以及keyword具体命名的问题.

使用clojure.edn(在2010年发布该问题时不可用)可以缓解#=问题,但不能解决人们不应该期望能够读回(keyword <arbitrary-string>)相同关键字的字符串表示的更广泛的问题,无论哪个读者使用.如果不考虑这一点很容易导致数据损坏.

  • 简短示例(数据损坏):`{(关键字"a:b"):c}` (2认同)