A Journey into Synology NAS 系列一: 群晖NAS介绍
前言
之前花过一段时间研究群晖的NAS
设备,并发现了一些安全问题,同时该研究内容入选了安全会议POC2019
和HITB2021AMS
。网上关于群晖NAS
设备安全研究的公开资料并不多,因此基于议题《Bug Hunting in Synology NAS》和《A Journey into Synology NAS》,将之前的一些内容展开,如果有对群晖NAS
设备感兴趣的同学,希望对你们有所帮助。
本系列文章的目的是介绍一些关于群晖NAS
设备的基本信息、请求处理的相关机制和常见攻击面等,以及实际发现的部分安全问题,让读者对群晖NAS
设备有个大体的认识,并知道如何去对设备进行安全分析,而不会聚焦于某个具体漏洞的利用细节。本系列文章大概会分为以下几个部分:
- 群晖环境搭建
- 自定义服务分析,包括
findhostd
和iscsi_snapshot_comm_core
HTTP
请求处理流程,和常见的攻击面分析
群晖NAS
介绍
NAS
(Network Attached Storage
),即网络附属存储,是一种特殊的数据存储设备,包含一些必要的器件如RAID
、磁盘驱动器或可移动的存储介质,和内嵌的操作系统,用于将分布、独立的数据整合并集中管理,同时提供远程访问、共享、备份等功能。简单地可以理解为”联网的磁盘阵列”,并同时具备硬盘存储和网盘存储的优势。
群晖是一家致力于提供网络存储服务器(NAS
)服务的公司,被认为是中小企业和家庭NAS
领域的长期领导者。群晖NAS
的主要产品线包括DiskStation
、FlashStation
和RackSation
,其中DiskStation
是适合我们日常使用的桌面型号。针对每个产品线,都提供了不同的系列来满足不同的要求。
此外,群晖还提供了适用于每一个NAS
的操作系统DiskStation Manager
(DSM
)。它是一个基于Linux
的、网页界面直观的操作系统,提供了丰富的功能包括文件共享、文件同步和数据备份等,以在各个方面提供更好的灵活性和可用性。
环境搭建
在了解了群晖NAS
的基本信息后,需要有一个目标设备来进行测试。目前,常见的有两种方式,如下。
- 直接购买一个群晖
NAS
设备,即”白群晖”,其功能完整,比较方便配置和使用 - 自己组装一个设备,或购买一个其他厂商的
NAS
设备,并安装群晖的DSM
系统,即”黑群晖”,其拥有大部分的功能,对于测试而言是足够的
除了上述两种方式,NAS
社区还提供了另一种方式,即创建一个群晖虚拟机。这种方式更适合于测试用途(比如想测试不同的DSM
版本),因此下面主要对这种方式进行介绍。
这里仅是出于安全研究的目的,如果有实际使用需要,建议购买群晖官方
NAS
设备。
安装DSM 6.2.1
创建一个群晖虚拟机,主要需要如下两个文件。目前社区提供了针对不同NAS
型号和不同DSM
版本的loader
,最新的loader
版本适用于DSM 6.2.1
,注意在安装时最好选择和loader
对应的NAS
型号及DSM
版本。经测试,ds918
系列的loader
支持升级到DSM 6.2.3
,即可以在先安装DSM 6.2.1
版本后再手动升级到DSM 6.2.3
。
- 群晖官方提供的
DSM
文件(pat
文件) - 社区提供的loader
关于
loader
是否可以升级以及是否成功升级等信息可参考这里
以VMware Workspace
为例,创建群晖虚拟机需要先加载synoboot
引导,再安装对应的DSM
。由于下载的引导文件为img
格式,需要先将其转换为vmdk
格式,如下。
1 | qemu-img convert -f raw -O vmdk synoboot.img synoboot.vmdk |
之后正常创建VMware
虚拟机,并使用之前转换得到的vmdk
文件。其中,在选择安装引导的磁盘类型时,一定要选择SATA
类型,选择SCSI
的话可能会造成后续引导无法识别或启动。创建完毕后,再正常添加额外的硬盘,用于数据存储。启动虚拟机后,通过Web Assistant
或Synology Assistant
进行安装和配置,完成之后就可以通过浏览器成功访问NAS
虚拟机了。
Synology Assistant
是一个客户端软件,用于在局域网内搜索和管理对应的NAS
设备。
![](images/cq674350529_synology_918_dsm62.png)
之后,可以通过手动更新的方式将其升级到DSM 6.2.3
版本。前面提到过,通过这种方式只能得到DSM 6.2.3
版本的虚拟机,而目前群晖DSM
的最新版本包括DSM 6.2.4
和DSM 7.0
,无法通过这种方式安装。不过,可以基于刚创建的NAS
虚拟机,借助群晖提供的Virtual Machine Manager
套件来安装DSM 6.2.4
或DSM 7.0
版本的虚拟机。
安装DSM 6.2.4/DSM 7.0
群晖套件Virtual Machine Manager
,通过一个集中且规范的接口集成了多种虚拟化解决方案,可以让用户在NAS
上轻松创建、运行和管理多台虚拟机,当然也包括群晖的虚拟DSM
。
![](images/cq674350529_synology_vmm.png)
简单而言,可以先创建一个DSM 6.2.3
版本的虚拟机,然后在该虚拟机内部,借助Virtual Machine Manager
套件再安装一个或多个virtual DSM
。其中,在安装virtual DSM
时,需要保证对应的存储空间格式为Brtfs
,可以通过额外添加一个硬盘(容量尽量大一点,比如40G
或以上)的方式,新增加存储空间时选择SHR(Brtfs)
即可。另外,一个Virtual Machine Manager
里面似乎只提供了一个Virtual DSM
的免费License
,因此如果安装了多个Virtual DSM
的话,多个虚拟实例无法同时启动。这里通过切换虚拟实例的方式来避免这一问题,对于安全测试而言足够了。
![](images/cq674350529_synology_918_dsm70.png)
由于目前
DSM 7.0
还在测试阶段,一些功能或特性不是特别稳定或成熟,因此本系列文章还是以DSM 6.1
/DSM6.2
版本为主。
安装DSM 7.x
早期的loader
均是由Jun
提供,但最近几年没怎么更新了。针对DSM 7.x
系列版本,社区提供了一个新的TinyCore RedPill (TCRP) loader,基于该loader
,可以直接创建DSM 7.x
系列版本的群晖虚拟机。采用TinyCore Redpill loader
,可能需要进行自定义修改和编译,以得到对应的loader image
,过程相对烦琐。国外有人开源了一个arpl编译工具,可以自动完成相关loader
的编译工作,让DSM7.x
引导的编译和安装变得非常简单,具体可参考这里。
群晖在线Demo
群晖官方也提供了供在线体验的DSM
实例,包括DSM 6.2.4
和DSM 7.0
版本。当然,你也可以基于该坏境去进行安全分析与测试,不过可能会有一些限制比如无法使用SSH
访问shell
等,或者其他顾虑等等。
工具安装
群晖NAS
上提供了SSH
功能,开启后可以访问底层Linux shell
,便于后续的调试与分析等。此外,群晖还提供了一个名为Diagnosis Tool
的套件,其包含很多工具,如gdb
和gdbserver
等,便于对程序进行调试。通常,可以通过套件中心搜索并安装该套件,如果在套件中心中无法找到该套件的话,可以通过在shell
命令行采用命令synogear install
进行安装,如下。
1 | sudo -i # 切换到root用户 |
设备指纹
群晖NAS
主要是用在远程访问的场景下,此时唯一的入口是通过5000/http
(5001/https
)进行访问(暂不考虑使用QuickConnect
或其他代理的情形)。使用设备搜索引擎如shodan
查找暴露在公网上的设备,如下。可以看到,确实只有少量的端口可以访问。
![](images/cq674350529_synology_nas_shodan_search.png)
为了进一步地知道目标设备的DSM
版本、安装的套件和对应的版本等信息,需要获取更精细的设备指纹。通过分析,发现在index
页面中存在对应的线索。具体地,index
页面中存在一些css
链接,表明有哪些内置的模块和安装的第三方套件。同时,其中也包含一些NAS
特有的脚本链接。根据上述信息,可以构建一些query
用于更准确地查找群晖NAS
设备。
1 | Port: 5000/5001 # default |
![](images/cq674350529_synology_nas_index.png)
另外,在每个链接后面还有一个参数v
,其表示最后更改时间的时间戳,即对应构建时的时间戳。以如下链接为例,时间戳1589235146
可转换为时间2020-05-12 06:12:26
。通过在群晖镜像仓库中查找各DSM
版本发布的时间,可以推测该DSM
版本为6.2.3-25426
。类似地,AudioStation
套件的版本为6.5.6-3377
。
1 | webapi/entry.cgi?api=SYNO.Core.Desktop.SessionData&version=1&method=getjs&SynoToken=&v=1589235146 |
同时,默认访问index
页面时还会发送其他请求,其中请求/webapi/entry.cgi?api=SYNO.Core.Desktop.Defs&version=1&method=getjs&v=1589235146
的响应中包含设备的具体型号信息,示例如下。根据upnpmodelname
和unique
等字段,可知设备的型号为VirtualDSM
。
1 | _SYNOINFODEF = { |
进一步地,可以通过访问http://<host>:<port>/ssdp/desc-DSM-eth0.xml
, 获取设备的具体型号、版本以及序列号等信息。需要说明的是,针对某些有多块网卡的设备如DS1517
,访问/ssdp/desc-DSM-eth0.xml
可能会提示页面不存在,这是因为设备的eth0
网口未连通,可以尝试将eth0
换成eth1
、eth2
或eth3
等后再尝试。
通常,设备搜索引擎只会探测
http://<host>:<port>/
下的默认页面,对于该二级页面没有进行探测。
1 | <deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType> |
相关事件/研究
近年来,有一些关于群晖的安全事件,其中包括:
- 在
2018
年的GeekPwn
比赛中,来自长亭科技的安全研究员攻破了群晖DS115j
型号NAS
设备,成功获取了设备上的root
权限; - 在
Pwn2Own Tokyo 2020
比赛中,有2个团队攻破了群晖DS418Play
型号NAS
设备,均成功拿到了设备上的root shell
。
同时,也有一些安全研究人员对群晖设备进行了分析,感兴趣的可以看看。
- Network Attached Security: Attacking a Synology NAS
- SOHOpelessly Broken 2.0 - Security Vulnerabilities in Network Accessible Services
- Vulnerability Spotlight: Multiple vulnerabilities in Synology SRM (Synology Router Manager)
- Vulnerability Spotlight: Multiple vulnerabilities in Synology DiskStation Manager
小结
本文首先对群晖NAS
进行了简单介绍,然后给出了如何搭建群晖NAS
环境的方法,为后续的安全分析做准备。同时,对设备指纹进行了简单讨论,并介绍了与群晖NAS
相关的一些安全事件/安全研究等。后续文章将对群晖NAS
设备上的部分服务、功能或套件等进行分析,并分享一些实际发现的安全问题。
相关链接
- DSM 6.1.x Loader
- 各版本引导下载
- 群晖镜像/套件下载
- DSM 7.x Loaders and Platforms
- Automated Redpill Loader
- 安装黑群晖不求人,arpl在线编译安装群晖教程
- Bug Hunting in Synology NAS
- A Journey into Synology NAS
本文首发于安全客,文章链接:https://www.anquanke.com/post/id/251883