【发布时间】:2011-09-15 23:34:10
【问题描述】:
我听说 Erlang 中的 atom table 可以填满,让系统为 DDoS 开放,除非您增加可以创建的 atom 数量。看起来 binary_to_existing_atom/2 是解决这个问题的方法。
谁能准确解释binary_to_atom/2 是如何构成安全隐患的,以及binary_to_existing_atom/2 如何解决这个问题?
【问题讨论】:
标签: erlang
我听说 Erlang 中的 atom table 可以填满,让系统为 DDoS 开放,除非您增加可以创建的 atom 数量。看起来 binary_to_existing_atom/2 是解决这个问题的方法。
谁能准确解释binary_to_atom/2 是如何构成安全隐患的,以及binary_to_existing_atom/2 如何解决这个问题?
【问题讨论】:
标签: erlang
当第一次使用原子时,它会被赋予一个内部编号并放入 VM 中的一个数组中。该数组是静态分配的,如果使用了足够多的不同原子,则可以填满。 binary_to_existing_atom 只会将二进制字符串转换为数组中已经存在的原子,如果它不存在,则调用将失败。
如果您将输入数据直接转换为原子而不进行任何完整性检查,则外部客户端可以发送 > 和 > 直到数组已满虚拟机将崩溃。
另一种避免这种情况的方法是不使用 binary_to_atom 而是在不同的二进制文件上进行模式匹配并返回所需的原子。
【讨论】:
list_to_atom/1 和 binary_to_atom/1 是 erlang 代码中非常严重的错误。 总是像这样创建一个主要功能:
to_atom(X) 当 is_list(X) -> 尝试 list_to_existing_atom(X) 的 原子 -> 原子 抓住 _Error:_ErrorReason -> list_to_atom(X) 结束。【讨论】:
list_to_atom 的调用将不会创建一个新原子。因此这里的to_atom 函数不会保存任何内容。这里真正的问题是创建原子。如果有一种方法可以创建无限数量的不同原子,那么最终您将耗尽原子空间(它们永远不会被垃圾收集)。尽量避免这种情况。