【问题标题】:Erlang: binary_to_atom filling up atom table space security issueErlang:binary_to_atom 填充 atom 表空间安全问题
【发布时间】: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


    【解决方案1】:

    当第一次使用原子时,它会被赋予一个内部编号并放入 VM 中的一个数组中。该数组是静态分配的,如果使用了足够多的不同原子,则可以填满。 binary_to_existing_atom 只会将二进制字符串转换为数组中已经存在的原子,如果它不存在,则调用将失败。

    如果您将输入数据直接转换为原子而不进行任何完整性检查,则外部客户端可以发送 > 和 > 直到数组已满虚拟机将崩溃。

    另一种避免这种情况的方法是不使用 binary_to_atom 而是在不同的二进制文件上进行模式匹配并返回所需的原子。

    【讨论】:

    • 添加到这个答案:如果您在代码中使用 binary_to_atom,通常会出现设计错误。正常。
    【解决方案2】:

    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) 结束。
    这样,如果 atom 已经存在于 Atom 表中,try body 会避免再次创建该 atom。它仅在第一次调用此函数时创建。

    【讨论】:

    • 我很确定这是不对的。如果已存在具有相同“名称”的原子,则对list_to_atom 的调用将不会创建一个新原子。因此这里的to_atom 函数不会保存任何内容。这里真正的问题是创建原子。如果有一种方法可以创建无限数量的不同原子,那么最终您将耗尽原子空间(它们永远不会被垃圾收集)。尽量避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多