深入解析Electron Web API权限 - Doyensec博客
简介
当 Chrome 用户访问一个请求权限的网站时,浏览器会在左上角显示一个显眼的权限提示框。该提示框会一直保持可见,直到用户进行交互、重新加载页面或离开当前页面。提示框通常包含“阻止”和“允许”按钮,以及关闭提示的选项。此外,从 Chrome 98 开始,只有在用户与网站交互时,权限提示才会完整显示。这些安全措施旨在防止恶意网站滥用可能影响用户隐私或安全的 Web API。

既然 Chrome 实现了这样的权限提示框,那么 Electron 是如何处理权限的呢?根据 Electron 的文档,如果通过不安全的导航(如重定向或点击恶意链接)或跨站点脚本攻击渲染器进程,可能会导致严重的安全和隐私问题。本文将深入探讨 Electron 的权限检查机制,比较其与 Chrome 的行为差异,并分析受损的渲染器进程如何可能滥用 Web API。
网络摄像头、麦克风和屏幕录制权限
默认情况下,网络摄像头、麦克风和屏幕录制功能的权限获得批准后,可能会对用户隐私造成严重威胁。如果未实现权限处理程序,Electron 应用的渲染进程可以直接访问用户的网络摄像头和麦克风。相比之下,屏幕录制功能需要在主进程中通过桌面捕获器配置源,因此渲染器进程的利用空间相对较小,除非应用本身需要录制屏幕。
在 Electron 中,这三种权限被合并为一个“媒体”权限,而在 Chrome 中,这些权限是分开的。这种权限合并可能导致问题,例如某些应用仅需要麦克风权限,但却必须同时授予视频录制权限。默认情况下,应用无法仅拒绝视频访问而保留音频访问权限。尽管现代 Electron 应用可以分别处理麦克风和视频权限,但受损的渲染器进程仍然能够访问所有媒体权限。
即使未授予权限,攻击者仍可能通过 navigator.mediaDevices.enumerateDevices() 枚举用户的媒体设备。在 Chrome 中,API 仅返回用户已授权的设备,而在 Electron 中,该 API 会返回所有媒体设备的信息,这可能被用来对用户设备进行指纹识别。例如,即使权限被拒绝,仍可能看到设备名称如“默认-MacBook Pro 麦克风(内置)”。

要完全拒绝访问所有媒体设备(但不阻止设备枚举),需要在主进程中实现权限处理程序并拒绝“媒体”权限请求。
文件系统访问 API
文件系统访问 API 通常允许对本地文件进行读写操作。在 Electron 中,读取文件的功能已实现,但写入文件的权限始终被拒绝。然而,当用户选择文件或目录时,读取权限会自动授予。
在 Chrome 中,当用户选择文件或目录时,浏览器会通过通知明确告知用户授予的访问权限,并在所有相关选项卡关闭后撤销权限。此外,Chrome 会限制用户选择某些敏感目录或文件,以保护用户隐私。例如,用户无法选择包含系统文件的目录。

相比之下,Electron 缺乏类似的通知或限制机制。用户可以选择根目录或其他敏感目录,这可能会授予应用超出预期的访问权限,而用户对此毫不知情。
剪贴板、通知和空闲检测 API
对于剪贴板、通知和空闲检测 API,默认情况下 Electron 的渲染器进程拥有完全访问权限。这意味着受损的渲染器进程可以:
- 读取用户剪贴板内容
- 发送桌面通知
- 检测用户是否处于空闲状态
剪贴板
剪贴板的访问权限与安全性密切相关,因为用户可能会将密码或其他敏感信息复制到剪贴板。通常,Chromium 会限制剪贴板读取操作,只有在用户明确触发时才允许。然而,在 Electron 中,通过为窗口的“加载”事件添加事件处理程序,可以在无需用户交互的情况下读取剪贴板内容。

要拒绝访问剪贴板 API,可以在主进程中拒绝“clipboard-read”权限。
通知
桌面通知可能被滥用于网络钓鱼或其他社交工程攻击。例如,攻击者可以伪造系统通知以诱骗用户点击恶意链接。

要拒绝访问通知 API,可以在主进程中拒绝“notices”权限。
空闲检测
空闲检测 API 的安全风险相对较低,但仍可能被滥用以侵犯用户隐私,例如监控用户的活动状态。

要拒绝访问空闲检测 API,可以在主进程中拒绝“idle-detection”权限。
本地字体访问 API
本地字体访问 API 默认授予渲染器进程访问权限,且主进程不会收到任何权限请求。这意味着受损的渲染器进程可以始终读取用户的本地字体。由于本地字体可以用于设备指纹识别,这种行为可能对用户隐私造成重大影响,甚至可能泄露用户所属的公司或组织。

Electron 应用权限的安全强化
为了提高安全性,建议默认拒绝所有危险的 Web API 权限。这可以通过在主进程的“会话”中添加权限处理程序来实现。例如:
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback) => {
const allowedPermissions = ['media', 'geolocation'];
if (allowedPermissions.includes(permission)) {
callback(true);
} else {
callback(false);
}
});
如果需要为特定 Web API 授予权限,可以通过修改权限处理程序添加例外规则。建议始终验证权限请求的来源是否与预期一致。此外,将权限请求处理程序设置为“null”可以强制重新请求权限,以确保撤销的权限不会被滥用。
结论
Electron 的权限管理机制与 Chrome 存在显著差异,尤其是在默认权限设置和用户通知方面。开发者需要主动实现权限处理程序,以限制渲染器进程对危险 Web API 的访问,从而保护用户的隐私和安全。通过合理的权限管理,可以有效降低受损渲染器进程滥用 Web API 的风险。
原文链接: https://blog.doyensec.com/2022/09/27/electron-api-default-permissions.html
最新文章
- 深入解析Electron Web API权限 – Doyensec博客
- API安全风险及其缓解方法 | Kong公司
- 社交媒体应用中的api集成:关键角色与功能
- 如何获取心知天气开放平台 API Key 密钥(分步指南)
- 什么是 LangGraph?
- API 速率限制策略:流控算法、实现原理与实战方案
- NFC支付是什么?如何改变我们的支付方式
- AI零门槛变现秘籍:最新赚钱公式全公开
- Postman API 测试全面指南(附测试示例)
- OpenAI GPT-4o 图像生成 (gpt-image-1) API – IMG.LY
- 如何使用 OpenAI 的 Sora API:综合使用指南
- 如何使用 amazon scraper api 进行商品数据采集