/etc/network/interfaces 中的转义字符

/etc/network/interfaces 中的转义字符

我想确保我传递到行中的任何字符串wpa-ssid "abc"/etc/network/interfaces不会被用来打破配置。

我在手册中所能找到的就是\可以在一行末尾使用以继续下一行。

\"但是在一条线的中间呢?

我担心的是 SSID 之类的

A"
up rm -rf /\

是否有任何通用编码可用于 SSID 字段中的任意字符?

答案1

在 Debian /etc/network/interfaces(或使用 Debian 的 ifupdown 实用程序的任何其他发行版)中,反斜杠换行序列被删除,并且反斜杠在其他地方并不特殊。双引号字符也不特殊。如果该字符是(非连续)行上的第一个非空白字符,则该字符#开始注释。空字节被视为换行符(我认为解析器使用 C 字符串并且对空字节没有特殊处理,因此它们可能会导致额外的恶作剧)。

配置行采用选项名称后跟值的形式,以空格分隔。前导和尾随空格将被忽略。一些内置选项进一步将行解析为单词; options to 的值iface总是运行到行尾。

例如,该行

wpa-ssid  "a  b"  "cd"  

将选项设置wpa-ssid为 12 个字符的字符串"a  b"  "cd"(保留内部空格)。

WPA Supplicant 的 ifupdown 脚本去掉配置字符串开头和结尾的双引号wpa-ssid,上面的行相当于wpa-ssid a  b"  "cd.这样,您就可以在 SSID 中包含前导和尾随空格。

我在 WPA 请求者 ifupdown 脚本中找不到引用问题,因此看起来 ifupdown 生成的任何内容都是安全的。

因此,您可以允许将任何字符串作为 SSID 注入到 中/etc/network/interfaces,前提是它不包含任何换行符或空字节。在字符串两边添加双引号(如果不这样做,带有前导或尾随空格、以 结尾\、或以 开头或结尾的SSID"将被破坏)。

答案2

此 SO 问答题为:是否有一个标准来定义什么是有效的 SSID 和密码?回答您的一些问题。

摘抄

802.11-2007 规范第 7.3.2.1 节(http://standards.ieee.org/getieee802/download/802.11-2007.pdf) 定义 SSID。

有效的 SSID 是 0-32 个八位位组,具有任意内容。长度为 0 的 SSID 表示通配符 SSID(例如在探测请求帧中)。

没有与 SSID 关联的字符集 - 32 字节的 NUL 字节字符串是有效的 SSID。

这意味着:

  • 操作通用 SSID 时(strcpy() 等),切勿使用普通字符串函数。
  • 例如,在将 SSID 记录到磁盘时,您不应假设 SSID 是可打印的

对于SO问题的答案也有这样的评论:

有标准的更新版本(http://standards.ieee.org/getieee802/download/802.11-2012.pdf),它定义了SSIDEncoding字段。它可以是UNSPECIFIED(对于任意数据)或UTF8

因此,我会参考最新的标准作为指导,并确保您可以根据该标准处理合法的事情。

还有什么?

此外,我可能倾向于通过使用某种形式的 URL 编码函数(显然可以与 SSID 一起使用的函数)规范用户的输入来保护自己,或者简单地删除非法字符,并且在将这些字符串写入此文件之前根本不允许它们使用。

奇怪的人物?

我能发现的与该文件相关的奇怪/特殊字符的唯一问题interfaces是针对 debian-installer 提交的这些类型的错误。

debian-installer 询问我的无线网络信息并成功使用它来无线连接到网络。它还将我的无线网络信息写入/etc/network/interfaces。然而,我输入的 WPA 密钥至少包含一个特殊字符,并且 debian-installer 没有转义或引用 /etc/network/interfaces 中的特殊字符。结果是,重新启动时,系统在启动过程中挂起很长时间,因为它尝试(未成功)重新连接到无线网络。我通过简单地引用 /etc/network/interfaces 中列出的 WPA 密钥来解决该问题。如果密钥包含特殊字符,这应该会自动发生。

此外还存在这些错误,其中一个与 SSID 内的空格有关,其他与密码相关:

在这两种情况下,用双引号引起来的字符串似乎足以保护两者的值。

其他示例

官方文档

仔细阅读官方文档,我在这里发现了这一点:

官方文档展示了这个例子:

ap_scan=2
network={
        ssid="test adhoc"
        mode=1
        frequency=2412
        proto=WPA
        key_mgmt=WPA-NONE
        pairwise=NONE
        group=TKIP
        psk="passphrase"
}

因此,只要正确引用空格,似乎就允许使用空格。还有这个示例解释了如何向该工具提供带有空格的 SSID iwconfig

添加您要创建/加入的网络的名称 (ssid)。如果名称中有空格,请使用单引号。

   $ sudo iwconfig eth1 essid 'name'

网络聚合器

我发现这个例子看起来像是 Debian,所以这个例子可能适合你的情况,但很难确定。我提出它只是因为它显示了一个示例,说明我希望如何公开 URI 编码方法以防止非法字符。

摘抄

示例 4 “ESSID 中的空格”,广播 essid 'Hopstock Gjestenett',使用 WPA 密钥 uiopzxcv

请避免 ESSID 中出现空格。在这种情况下,我们使用encodeURI('Hopstock Gjestenett')来解决,以获得以下启动配方:

   wpa-ssid=Hopstock%20Gjestenett wpa-psk=uiopzxcv

因此,您也许可以使用 .SSID 对 SSID 中显示的空格进行编码%20

SSID

进一步深入挖掘后,我在维基百科页面上找到了这条评论服务集(802.11网络)

每个 BSS 或 ESS 由服务集标识符 (SSID) 标识 - 一个 1 到 32 字节的字符串。这通常是人类可读的字符串,因此通常称为“网络名称”。6在IBSS中,SSID由启动网络的客户端设备选择,并且网络成员的所有设备以伪随机顺序执行SSID的广播。

此评论得到 Blackhat EU 2013 的演示文稿的支持,标题为:使用恶意服务集标识符 (SSID) 的实际利用

摘抄

  • 对于 SSID 中可以使用哪些字符没有明确的限制 (IEEE Std 802.11™-2012)
  • 基于产品的一些限制
    • 一些字符限制(仅限 ASCII)
    • 统一码

因此从技术上讲,SSID 中允许使用任何字符,不同的实现(例如 Windows XP、Windows 7)与各种 Linux 版本允许/禁止 SSID 中的字符子集。

参考

相关内容