范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go语言项目容器化导致的ServerSideMIMESniff

  answerdev/answer 是基于go语言编写的一个问答平台(类似于知乎),前几周在审计该项目时,发现该系统的图片上传功能点存在一个有趣的漏洞。
  该系统的图片上传功能点的工作原理大致如下:
  - step1. 用户上传图片文件,将文件存储在本地文件系统中
  - step2. 当需要访问图片时,使用gin框架提供的静态资源服务器将用户上传的图片文件作为静态资源返回给用户
  internal/router/static_router.go  // RegisterStaticRouter register static api router func (a *StaticRouter) RegisterStaticRouter(r *gin.RouterGroup) {     r.Static("/uploads", a.serviceConfig.UploadPath) }
  为了防止用户上传恶意文件,该系统的文件上传功能设置了一个后缀白名单, 用户只能上传白名单中后缀的文件
  internal/service/uploader/upload.go      FormatExts = map[string]imaging.Format{         ".jpg":  imaging.JPEG,         ".jpeg": imaging.JPEG,         ".png":  imaging.PNG,         ".gif":  imaging.GIF,         ".tif":  imaging.TIFF,         ".tiff": imaging.TIFF,         ".bmp":  imaging.BMP,     }
  起初,我在本地搭建了该项目,对文件上传功能和静态资源服务的进行了测试:我尝试上传文件内容为   , 文件后缀为 ".bmp" ".tif" ".tiff" 的文件,然后通过静态资源服务访问这些文件,我发现返回的响应报文中Content-Type 分别为 image/bmp  image/tiff  image/tiff  ,这些MIME都是正常的图片类型,无法使得浏览器将响应报文中的内容作为html来解析,从而造成XSS 。
  但是,神奇的是当我使用 answer 官方提供的docker镜像来搭建answer时:  docker run -d -p 9080:80 -v answer-data:/data --name answer answerdev/answer:latest
  再次上传同样的文件,然后访问文件,发现返回的http响应报文的Content-Type 竟然变为了  text/html  !
  step1. 上传图片文件
  step2. 访问文件
  罪魁祸首 mime 标准库
  之所以go实现的静态资源服务器会出现这种将 bmp/tif/tiff 等后缀的图片文件的Content-Type设置为text/html的情况,是因为go语言的mime标准库的实现有问题。
  go语言实现的静态资源服务器在返回文件时,大致会执行以下步骤:
  - step1. 调用mime.TypeByExtension()函数来根据文件后缀获取对应的Content-Type
  - step2. 如果mime.TypeByExtension()函数返回的Content-Type为空字符串,则会进行Server-Side MIME Sniff ,即根据文件内容来判断对应的Content-Type
  而mime.TypeByExtension()函数的实现实际上是依赖于外部的mime.types文件的,其本身所维护的文件后缀与 Content-Type 的映射关系非常有限
  /usr/local/go/src/mime/type.go  // TypeByExtension returns the MIME type associated with the file extension ext. // The extension ext should begin with a leading dot, as in ".html". // When ext has no associated type, TypeByExtension returns "". // // Extensions are looked up first case-sensitively, then case-insensitively. // // The built-in table is small but on unix it is augmented by the local // system"s MIME-info database or mime.types file(s) if available under one or // more of these names: // //   /usr/local/share/mime/globs2 //   /usr/share/mime/globs2 //   /etc/mime.types //   /etc/apache2/mime.types //   /etc/apache/mime.types // // On Windows, MIME types are extracted from the registry.
  在容器化过程中,为了追求最小化攻击面、更小的镜像体积,往往会使用alpine系列镜像,而该系列镜像中并没有以上所列的mime.types文件:  /usr/local/share/mime/globs2 /usr/share/mime/globs2 /etc/mime.types /etc/apache2/mime.types /etc/apache/mime.types
  例如:
  /Users/rickshang/Code/SecurityResearch/InTheLab/content_type_lab/golang/fuzzer/main.go  package main  import (     "fmt"     "mime" )  func main() {     exts := []string{".bmp", ".gif", ".jpeg", ".jpg", ".png", ".svg", "ico", ".tif", ".tiff", ".webp"}     for _, ext := range exts {         content_type := mime.TypeByExtension(ext)         fmt.Printf("ext:%s content_type:%+v ", ext, content_type)     } }
  本地运行:  go run main.go  ext:.bmp content_type:image/bmp ext:.gif content_type:image/gif ext:.jpeg content_type:image/jpeg ext:.jpg content_type:image/jpeg ext:.png content_type:image/png ext:.svg content_type:image/svg+xml ext:.ico content_type:image/x-icon ext:.tif content_type:image/tiff ext:.tiff content_type:image/tiff ext:.webp content_type:image/webp
  使用golang官方镜像:golang:1.19-alpine 容器化之后运行:  docker run -it --rm -v /Users/rickshang/Code/SecurityResearch/InTheLab/content_type_lab/golang/fuzzer/main.go:/code/main.go -w /code golang:1.19-alpine go run main.go  ext:.bmp content_type: ext:.gif content_type:image/gif ext:.jpeg content_type:image/jpeg ext:.jpg content_type:image/jpeg ext:.png content_type:image/png ext:.svg content_type:image/svg+xml ext:.ico content_type: ext:.tif content_type: ext:.tiff content_type: ext:.webp content_type:image/webp
  话句话说,如果你的静态资源服务器是基于go语言的mime标准库来实现的,那么你的静态资源服务器在使用alpine镜像容器化之后很可能会出现这种将bmp/tif/tiff等后缀的图片文件的Content-Types识别为text/html的情况,进而导致存储型XSS漏洞。  总结
  该漏洞有趣的点在于,它揭示了安全问题与环境的关系: 测试环境下没有安全问题,不代表生产环境下也没有安全问题。
  容器化在追求最小化攻击面的同时也引入了新的攻击面,go语言mime标准库的问题便是典型的例子。  依赖外部文件的标准库实现 -----> 容器化----->外部文件缺失----> 标准库功能出现安全问题 修复方案
  go语言 mime标准库维护的内置的mime类型映射关系非常有限: go/src/mime/type.go  var builtinTypesLower = map[string]string{     ".avif": "image/avif",     ".css":  "text/css; charset=utf-8",     ".gif":  "image/gif",     ".htm":  "text/html; charset=utf-8",     ".html": "text/html; charset=utf-8",     ".jpeg": "image/jpeg",     ".jpg":  "image/jpeg",     ".js":   "text/javascript; charset=utf-8",     ".json": "application/json",     ".mjs":  "text/javascript; charset=utf-8",     ".pdf":  "application/pdf",     ".png":  "image/png",     ".svg":  "image/svg+xml",     ".wasm": "application/wasm",     ".webp": "image/webp",     ".xml":  "text/xml; charset=utf-8", }
  方案一: 打包镜像时将如下mime.types文件拷贝到容器中:  /usr/local/share/mime/globs2 /usr/share/mime/globs2 /etc/mime.types /etc/apache2/mime.types /etc/apache/mime.types
  方案二: 在实现图片上传功能时,不要将mime标准库内置表之外的后缀类型添加到白名单中,例如: .bmp .ico .tif .tiff
  方案三: 使用nginx作为静态资源服务器  进一步的研究其他语言的静态资源服务器容器化后是否存在同样的问题?  容器化是否会引入其他新的安全问题?
  from https://tttang.com/archive/1880/

起舞弄香韵,对镜贴花黄,香至尊沉香成为女性新宠沉檀龙麝沉香为首,沉香文化从古至今一直备受高阶层人士热捧。进入现代社会,很多人对它的认知却有失偏颇,认为沉香只是成功男人的标配。其实恰恰相反,沉香对女士来说也是有诸多益处的。在上周走访慰问要多些自选动作罗淇尹正值新春佳节,各地纷纷开展领导干部走访慰问活动。有的是联系慰问老党员老干部,有的是服务慰问业绩优异贡献突出的优秀人才干部,有的是慰问单位中有特殊情况的干部职工等等,虽然慰问目100亿!建行联手万科成立基金,用于投资收购存量长租公寓1月17日,建设银行旗下建信住房租赁基金与万科集团联合创立的建万住房租赁投资基金,在京举行揭牌仪式。仪式上,建设银行董事长田国立和万科集团董事会主席郁亮出席并见证了基金的揭牌及首批春节与伙伴去哪儿?广州荔枝湾游船票西关小吃套餐仅49,划算!新春佳节,年味哪里找?广府的春节年俗浓郁且讲究这里还包含着坚持的粤式传统而行花街就是广府人过年的浪漫荔枝湾游船荔枝湾游船,带你遍览两岸风光传统西关手工制作小吃,征服吃货水上花市水幕西部排名榜灰熊7平榜首,湖人有望出后3勇士回第7,再迎好消息20222023赛季NBA常规赛正在如火如荼的进行中,1月17日9场比赛结束后,西部排名榜再次扑朔迷离灰熊轻取太阳,豪取10连胜,第7次追平掘金,再次并列榜首前榜首太阳沦为第12名勇士5换1报价森林狼唐斯,筹码堪称豪赌,绝对不值!勇士队作为卫冕冠军,球队管理层在去年夏天花重金成功留住了夺冠核心班底,但赛季至今,勇士队打得却异常挣扎,仅仅取得了22胜22负的西部第7战绩,这种表现显然无法与总冠军联想到一起。而预订量激增!中国人今年春节出境游目的地TOP10三年的漫长等待终于迎来了曙光,中国关闭边境超过3年,终于在1月8日,开放了境外旅游。为能更妥善接待及迎接中国游客,马来西亚旅游艺术及文化部部长拿督斯里张庆信宣布,将遣派通晓中文的官春节假期快来东山岛,实现你的旅行愿望!春节假期越来越近了大家想好到哪儿玩了吗?忙碌了一年了是时候给自己一场说走就走的旅行春节假期,来东山岛把曾经许下的旅行愿望都一一实现!看海上日出春节假期来东山岛,一定要达成看海上日出春节换机怎么选?这四款热门新机配置拉满个个能打快过年了,各家电商平台纷纷开启年货节活动吸引消费者买买买,除了购置年货,相信大家都想花钱犒劳一下辛苦一整年的自己。正值年前换机热潮,不少朋友都准备在过年前给自己换一台新手机。虽然现宝馨科技拟投资55亿元投建高效异质结电池等及相关产品高端制造项目中证网讯(记者罗京)1月18日晚间,宝馨科技公告,公司拟投资55亿元在安徽省蚌埠市怀远县建设6GW高效异质结光伏电池及6GW光伏组件新能源高端装备相关产品的研发生产及制造等。公告显荒泷极意堂堂斗虫大试合活动完成斗虫挑战得原石活动时间202302161000202302270359参与条件冒险等阶30级且完成魔神任务离岛逃离计划完成魔神任务危途疑踪后体验更佳。活动期间,如果没有完成魔神任务危途疑踪,可在
2018年4月普吉岛自由行漫游卡伦观景台艺术社区大象园2018年4月18日。我在网上看到普吉岛卡伦海滩有一个观景台,在大海对面的山顶上,可以俯瞰下面的大小卡塔卡伦三大海滩卡伦海滩还有一个艺术社区,聚集了很多泰国画家建造的画室画廊另有卡全球品牌大事记(2022年11月)全球品牌大事记,是品牌联盟发展研究中心的常规研究项目。从2022年3月起,品牌联盟对当月发生的全球品牌大事进行观察梳理和总结,并联合中新经纬共同编制及公布。全球品牌大事记,旨在帮助展示品牌未来纯电车型样貌标致概念车CES展首发爱卡汽车海外新车原创近日,据媒体消息,标致全新概念车Inception将在明年1月5日的2023年美国拉斯维加斯消费电子展(CES)上首发。据悉,标致将通过Inception概念车韩国队压哨改写命运,历史首次三支亚洲球队晋级世界杯十六强再次展现我们的激情和努力,加上一点点运气,我们就能创造奇迹。金英权的赛前豪言,在韩国与葡萄牙的比赛中完美兑现。凭借伤停补时的进球,韩国人在最后一刻改写了命运2比1绝杀葡萄牙,进球数跟着大师去旅游意大利蒂沃利小镇哈德良皇帝的别墅在纽约大都会博物馆里,有两根大理石柱子,创作于约公元117138年罗马中期帝国的哈德良(Hadrianic)时期。这两根柱子的三面都用浅浮雕的长春藤藤蔓装饰,是罗马建筑中大量使用彩西安秦始皇帝陵铜车马博物馆项目标签设计公司上海中森止境设计工作室位置中国类型建筑材料混凝土清水混凝土玻璃标签西安陕西分类博物馆展览类建筑文化建筑美丽乡村新农村新农村自建房项目概况ProjectOvervie提醒!这种水果是药物公敌!竟会和多种药物相互作用天气渐寒,又到了吃西柚的好季节。但是药师提醒,西柚是公认的药物公敌,会和已知的近百种心血管药物相互作用,长期服药的市民要警惕,小心美味变毒药。西柚又叫葡萄柚,因其肉嫩多汁,口感酸甜经常吃宵夜会怎么样,科学吃宵夜就选植清爽近年来,随着大都市生活节奏加快工作压力增大,加班后来顿宵夜,已经成为当代年轻人释放压力的方式之一。烧烤火锅大排档宵夜的美食种类繁多,慢慢地肚儿也圆了,身上的肉肉也多了,长期这样的油透析并发症No。1关于高磷血症的几个必读关键点高磷血症是慢性肾脏病(CKD)最常见的并发症之一,广泛存在于CKD35期患者中,尤其是维持性血液透析患者。高磷血症的治疗除限制饮食磷摄入和规律透析外,血液透析患者更需要服用磷结合剂一个普通玩家对开心庄园游戏的评测,看是不是真的能赚钱?开心庄园是一款经营性游戏,比较稳定,所以基本不用考虑公司跑路,文章有点长,一定要看到最后哦。先说第一点只种植收割作物付出的时间及收益种植作物界面游戏前十次是不限制每天收割次数的,只魔兽世界等游戏停服,玩家虚拟财产损失谁担责?前言近几年,由于游戏市场更迭迅速,产品热度持续时间不足,一些网络游戏营收不断走低,加之游戏版权授权费用较高等原因导致游戏运营方在版权到期后选择游戏停服。11月17日,暴雪中国战网官