一个有趣(可怕的)技巧,几乎无法检测到的漏洞。Wolfgang Ettlinger
如果一个后门从字面上无法看到,从而即使在彻底的代码审查中也无法被检测到,会怎样?
我将发布文章中漏洞的屏幕截图,并圈出实际的漏洞

如果你真的非常仔细地查看,你可能会看到它,但我可以理解它很容易被忽略,因为它可以避免任何 lint 问题,并且根本不会弄乱语法高亮。然后,代码的编写方式是,命令被执行
数组中的每个元素,硬编码的命令以及用户提供的参数,都会传递给
exec
函数。此函数执行操作系统命令。
他们认为它值得改变
剑桥团队建议限制双向 Unicode 字符。正如我们所展示的,同形异义词攻击和不可见字符也可能构成威胁。
那么是否有 eslint 设置可以限制双向 Unicode 字符或在开发工作流中实现它?
ESLint 的 comma-spacing 和 comma-dangle 规则将捕获该漏洞。我刚刚在 VS Code 中确认了这一点。AirBnB 和 Google 样式指南都要求这些规则。这只是 lint 很重要的另一个原因。
我觉得 lint 规则应该是每个项目标准的一部分……
对于那些仍然手动 lint 字符的人(就像我一样),以下正则表达式恰好可以识别该漏洞。从本质上讲,它查找 ASCII 之外的非空格字符,以及几个有害的空格字符。
[\x0B\xA0]|[^\s\x20-\x7E]
VS Code 1.63.0 解决了这段完全相同的代码,真是太搞笑了
我太兴奋了,甚至没有注意到发布说明中链接了这篇文章。糟糕。
易于预防
1) 在 lint 规则中设置不允许尾随逗号。2) 拒绝任何不符合您期望形状的输入
为了让 lint 规则捕获此漏洞,您需要要求尾随逗号,而不是禁止它们。该漏洞的工作原理是,它在视觉上看起来像有尾随逗号,而实际上没有。
我的 eslint 会在保存时修剪我的尾随空格。因此,数组行将明显需要关注。在代码审查中,我会发送回第一个尾随逗号。
简单的代码审查修复(即使 linter 正在保护空格),在任何编辑器中只需显示空格字符即可。对于开源项目,您不能只在浏览器中查看代码就接受 PR。
您应该只允许 2 个空格字符:空格和换行符。因此,很容易直观地检查它。
这是一个非常以英语为中心的建议。虽然使用其他语言的程序员通常使用 ASCII 中的变量和函数名称,但 IDE 和代码编辑器永远不应该阻止非 ASCII 字符。它可以阻止同形异义词和不可见字符,但禁止非英语字符可能会在非英语语言中造成很多问题