MS RFC 56:加强对映射文件和模板的访问控制

作者

丹尼尔·莫里塞特

联系

在mapgears.com的dmorissette

作者

史蒂夫·莱姆

联系

明尼苏达州第纳尔的史蒂夫·莱姆

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

状态

通过并于2009-03-26实施

版本

MapServer 5.4.0、5.2.2和4.10.4。

最后更新

2021-03-27

概述

通过在不受信任的目录中创建映射文件或模板,可能会使用MapServer 5.2.1及更高版本访问任意文件。

该RFC提出了一种机制来加强对映射文件和模板的访问控制,并限制泄漏任意文件内容的风险。

新的访问控制机制将在MapServer 5.4.0、5.2.2和4.10.4中实施和发布。

备注

所有可用的环境变量,包括 MS_MAPFILE 和此处描述的那些,可以选择性地设置它们以隐藏 MAP= 参数)都列在文档中: 环境变量

技术解决方案

将建立以下机制:

  • 强制要求映射文件开头的map关键字和符号集开头的symbolset关键字。

  • 在所有MapServer模板的开头需要一个魔力字符串

  • 使用环境变量控制和限制mapserv cgi对mapfile的访问:

    • MS_MAP_PATTERN

    • MS_MAP_NO_PATH

以上每一点在下面的章节中都有更详细的描述。

强制要求使用map和symbolset关键字

map和symbolset关键字分别在mapfiles和symbolset的开头是可选的。

通过这种更改,映射文件的第一行需要map关键字,而符号文件的第一行需要symbolset关键字。

如果缺少关键字,则分析器将拒绝该文件。

在所有MapServer模板的开头需要一个魔力字符串

通过这种更改,模板的第一行必须包含“mapserver template”魔术字符串,该字符串可以由模板格式的注释分隔符包围,以便于模板编辑(参见下面的示例)。模板文件的第一行将自动从模板中删除,并且不会包含在mapserver输出中。

如果找不到magic字符串,那么mapserver将拒绝该模板。

HTML模板示例:

<!-- MapServer Template -->
<html>
 <head>...</head>
 <body>
 ...
 </body>
</html>

XML模板示例:

<!-- MapServer Template -->
<?xml version="1.0" encoding="UTF-8" ?>
<rootElement>
  ...
</rootElement>

geojson模板示例:

// MapServer Template
  [resultset layer=foo] {
"type": "FeatureCollection",
"features": [
 [feature trim=',']
 {
  "type": "Feature",
  "id": "[id]",
  "geometry": {
   "type": "PointLineString",
   "coordinates": [
    {
     "type": "Point",
     "coordinates": [[x], [y]]
    }
   ]
  },
  "properties": {
   "description": "[description]",
   "venue": "[venue]",
   "year": "[year]"
  }
 },
 [/feature]
 ]
}
[/resultset]

ms-map-pattern环境变量

可选的 MS_MAP_PATTERN 通过mod_env或其他Web服务器等效项设置的环境变量可用于指定一个正则表达式,该正则表达式必须与传递到mapserv CGI的所有映射文件路径匹配。

如果 MS_MAP_PATTERN 未设置,则可以加载任何.map文件。

可以使用ApacheSetEnv指令将映射文件限制到特定目录和子目录。

  • Unix用户 可以在Apache中设置以下表达式,以将映射文件限制为 /opt/mapserver 目录和子目录:

    SetEnv MS_MAP_PATTERN "^\/opt\/mapserver\/([^\.][_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
    
  • Windows Apache/MS4W users 我可以在Apacheconf文件中设置以下表达式,以将可能的map=路径限制为公共 C:/ms4w/apps/ 目录(所有MS4W Mapfile 和应用程序所在的目录),允许编码的URL,允许“。或MAP=路径中的“_”或“-”,但不允许“..”目录遍历:

    SetEnv MS_MAP_PATTERN "^(C:)?\/ms4w\/apps\/((?!\.{2})[_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
    

    备注

    MS4W用户可以在https://ms4w.com/README_INSTALL.html#securing-your-ms4w-installation上查看具体的示例

ms_map_no_path环境变量

可选的 MS_MAP_NO_PATH 可以通过mod_env或其他Web服务器等效项将环境变量设置为任何值,以禁止在map=...中使用显式路径。URL参数。设置 MS_MAP_NO_PATH任何价值 强制在mapserv CGI URL中使用map=<env_ariable_name>机制。

如果未设置此变量,则不会发生任何更改,并且mapserv cgi仍然通过map=接受显式文件路径。URL参数。

例如,在apache的httpd.conf中设置set ms_map_nopath和一些mapfile路径:

SetEnv MS_MAP_NO_PATH "foo"
SetEnv MY_MAPFILE "/opt/mapserver/map1/mymapfile.map"

……然后调用mapserv cgi必须为map=使用环境变量。参数:

http://localhost/cgi-bin/mapserv?map=MY_MAPFILE&mode=...

向后兼容性问题

map和symbolset关键字必须添加到任何尚未包含它们的mapfile和symbolset中。

必须更新所有MapServer模板,以便在第一行包含“MapServer模板”魔力字符串。

新的环境变量是可选的,不会对不使用它们的现有应用程序产生影响。

文件冲击

  • mapserver.h

  • maptemplate.c

  • mapserv.c

票据ID

相关安全票:

投票历史

2009年3月26日,丹尼尔、汤克、佩里克森、杰夫姆、史蒂文、阿塞菲、史蒂文和塔玛斯通过+1。