【问题标题】:Why does the npm YAML library have a max alias number?为什么 npm YAML 库有一个最大别名数?
【发布时间】:2020-07-24 14:06:20
【问题描述】:

我正在使用 npm 包 yaml 将密集的相互引用的 Javascript 对象存储为我以后可以在 Javascript 中恢复的文本格式,并且还可以在内存中进行深度复制(通过序列化然后反序列化深度嵌套的对象。)

我最近遇到了关于最大对象大小的错误消息:

Excessive alias count indicates a resource exhaustion attack

如果 YAML 所做的只是进行别名引用,那么序列化相互引用对象是否存在合法的危险? (遍历图没有循环的危险,对吧?) - 有没有办法禁用这个最大值,或者有什么方法可以将相互引用的对象存储到文本/深度复制它们?

谢谢!


编辑:我接受了flyx 对问题的回答,因为它更好地解释了为什么存在最大别名计数的上下文,但rexfordkelly 更好地解释了如何禁用 npm yaml 库中的检查。

【问题讨论】:

    标签: javascript npm yaml


    【解决方案1】:

    一些 YAML 实现容易出现billion laughs attack。那里给出的例子是

    a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
    b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
    c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
    d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
    e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
    f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
    g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
    h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
    i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
    

    您可以在无法处理它的online demo of js-yaml 中测试它(我对 JS 生态系统了解不多——您使用的 YAML 实现似乎是不同的或修改过的(?),我找不到它的在线演示)。从理论上讲,这应该不是问题,因为 YAML 定义了锚点和别名来生成引用,而不是副本。但是,无论出于何种原因,一些实现都会复制列表(PyYAML 也犯了这个罪,而且相当多的实现是用不同语言重写了 PyYAML)。

    【讨论】:

      【解决方案2】:

      您可以通过在 yaml 解析选项中设置 maxAliasCount=-1 来关闭此检查。

      YAML 试图从本质上防止一种形式的拒绝服务附加。如果您的 YAML 不包含用户控制的内容,并且是正确的,那么禁用这些检查应该没问题。

      但是,是的,在处理 YAML 时会有资源耗尽的危险。

      我会对其进行测试和分析。

      【讨论】:

      • 非常感谢,这是对我的实际问题的更好回答,但考虑到我在标题中提出的问题更多地要求上下文,所以我接受了 flyx,但我感谢你和你的时间绝对帮助我摆脱困境!非常感谢。
      猜你喜欢
      • 2017-08-17
      • 2014-04-11
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多