文件通知攻击:Linux、Android、Windows 和 macOS 文件通知系统的侧信道泄露
摘要
本研究揭露了跨 Linux、Android、Windows 和 macOS 文件通知系统中的侧信道漏洞,使得攻击者仅凭读取权限即可重建用户行为。该研究被 ACM CCS 2026 收录,展示了严重的平台特定问题,如 Linux 上的按键时序泄露和 Android 上的私密通信暴露。
<p><a href="https://lobste.rs/s/x6yjrc/file_notification_attacks_side_channel">评论</a></p>
查看缓存全文
缓存时间: 2026/09/25 03:08
# 文件通知攻击
来源:https://inoti.fyi/
## Linux、Android、Windows 和 macOS 中文件通知系统的侧信道泄露。
#### 收录于 ACM 计算机与通信安全会议 (CCS)(https://www.sigsac.org/ccs/CCS2026/index.html),2026 年 11 月 15-19 日 — 荷兰海牙
---
**插图**
文件通知系统会在文件发生变更时通知应用程序,*例如*文件被打开、关闭、写入或删除。**仅**拥有对文件或目录的读取权限,攻击者就能监视这些通知并重建用户行为。我们在 Linux、Android、Windows 和 macOS 上都发现了类似的问题。然而,有三个问题非常严重且是其平台所独有的:
1. 在 Linux 上,监视一个可读目录会报告其中每个文件的所有事件,即使攻击者无法直接读取该文件。最严重的情况出现在 `/dev/input`,下文的“击键间隔计时”部分 (https://inoti.fyi/#1-linux-inter-keystroke-timing) 将会讨论。
2. 在 Android 上,`FileObserver` 绕过了 FUSE 层的按应用存储视图,允许一个无特权应用监视另一个应用的私有文件夹。我们在针对 WhatsApp 的测试中展示了这一点,精确揭示了照片、视频和文件何时到达或被删除,详见下文“揭示私人通信”部分 (https://inoti.fyi/#3-android-revealing-private-communication)。
3. 在 Windows 上,监视根目录 (`C:\`) 会报告系统上任何位置被操作的文件的完整路径,无论权限如何,甚至跨用户也是如此 🙂。微软认为这是一个 ✨ 未记录的功能 ✨。我们发现最严重的情况是实时泄露另一个用户访问的网站,如下文“直接网站泄露”部分 (https://inoti.fyi/#4-windows-direct-website-website-leakage) 所示。我们的发现使微软获得了 Pwnies 奖 2026 (https://www.youtube.com/live/8Eo4ZDQTAFs?t=6604) “最差厂商回应”类别的提名。
---
在 Linux 上,文件通知子系统称为 inotify (https://www.man7.org/linux/man-pages/man7/inotify.7.html),自内核 2.6.13 (https://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.13)(2005 年)以来,允许跨用户应用对文件或目录挂载监视。
在 Android 上,这个子系统称为 FileObserver (https://developer.android.com/reference/android/os/FileObserver) 类(自 2008 年起),是围绕 `inotify` 的 Java 封装 (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/FileObserver.java)。
Windows 提供了 ReadDirectoryChangesW (https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw) Win32 API,自 Windows 2000 (https://nvd.nist.gov/vuln/detail/CVE-2007-0843) 起可用。通过此 API,跨用户应用可以对目录挂载监视,获取有关该目录或其中文件操作的 .NET 框架中,FileSystemWatcher (https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?view=net-10.0) 类通过 (https://github.com/dotnet/runtime/blob/main/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs) 连接到 ReadDirectoryChangesW。
在 macOS 上,文件系统事件 (File System Events) (https://developer.apple.com/documentation/coreservices/file_system_events) API 允许应用程序了解所监视目录中的文件何时发生变化。此 API 自 Mac OS X Leopard 版本 10.5 (https://wikipedia.org/wiki/Mac_OS_X_Leopard#Developer_technologies)(2007 年)起就存在;归档链接 (https://web.archive.org/web/20081221100556/https://developer.apple.com/leopard/overview/osfoundations.html) 指向 Apple Developer Connection – Leopard OS Foundations Overview。
---
## 演示
我们在下面展示四个有趣的案例研究。前两个是在 Linux 上:击键间隔计时和认证界面覆盖攻击。第三个是在 Android 上,第四个视频是在 Windows 上:直接网站泄露。
在所有系统中要记住的主要点是**这些文件的内容是未知的**。我们只获得文件的通知,我们证明这足以泄露用户、系统和应用程序的行为。在某些情况下,我们还能了解到我们传统上无法知道的文件的存在。
---
### 1. Linux:击键间隔计时
在 Linux 上,对没有读权限的文件挂载 `inotify` 监视会导致权限拒绝错误。但是,如果该文件的父目录可读,监视该*目录*将报告该文件上发生的所有事件。
这意味着,如果用户无法读取 `/dev/input/event4`,在该*文件*上添加 `inotify` 监视会导致权限拒绝错误。但是,如果用户可以读取 `/dev/input` —— *即*,他们可以列出目录中的文件 —— 那么在*目录*上挂载 `inotify` 监视就会成功,并且用户会收到其中所有文件的通知,如下图所示:
图 1. 在 Linux 上通过监视文件的父目录来绕过读取权限。
在这个系统中,`event4` 恰好对应一次按键。需要注意的是,泄露的不是*哪个*键,而是仅仅发生了按键。尽管这听起来可能不那么严重,但关于击键间隔计时攻击的研究已有 20 多年:按键之间的时间会泄露信息。例如,在单词“WindRunner”中,由于手指已经位于“N”键上方,用户倾向于比其他字符更快地输入第二个“N”。
相关研究包括:Song 等人 (https://www.usenix.org/conference/10th-usenix-security-symposium/timing-analysis-keystrokes-and-timing-attacks-ssh)(2001 年)、Zhang 和 Wang (https://www.usenix.org/conference/usenixsecurity09/technical-sessions/presentation/peeping-tom-neighborhood-keystroke-0)(2009 年)、Monaco (https://ieeexplore.ieee.org/abstract/document/8418605)(2018 年),以及最近的 Qiu 等人 (https://scholar.google.com/scholar?q=KeyTAR%3A%20Practical%20Keystroke%20Timing%20Attacks%20and%20Input%20Reconstruction)(2025 年)。
您的浏览器不支持视频标签。视频 2. 在 `/dev/input` 上挂载的跨用户监视器在每次按键时都会收到通知。
当两个不同用户通过 SSH 登录同一台服务器时,也能观察到这种行为。一个用户可以通过监视 `/dev/pts` 来观察*另一个用户何时按下按键*。
\* 输入应在终端上产生文本更新。在禁用 pwfeedback (https://www.sudo.ws/alerts/pwfeedback.html) 的情况下输入 sudo 密码提示不会生成通知。
您的浏览器不支持视频标签。视频 3. 在 SSH 服务器上,在 `/dev/pts` 上挂载的跨用户监视器在每次按键时都会收到通知。
---
### 2. Linux:认证界面覆盖攻击
我们展示了一个针对在 Wayland 上运行的 KDE Plasma 的认证界面覆盖攻击,其中*同一用户*的进程监视 polkit (https://polkit.pages.freedesktop.org/polkit/) 的 `/usr/bin/pkexec` 的访问,以检测认证提示何时出现。一旦真正的密码对话框即将打开,攻击者迅速在其上方绘制一个假的密码窗口,诱骗用户输入其凭据。尽管 Wayland 旨在阻止输入窥探,但 according to KDE Plasma's security team,KDE 的焦点窃取阻止功能 (https://docs.kde.org/stable5/en/kwin/kcontrol/windowbehaviour/index.html#focus-focusstealing) 并不是设计为一种安全机制。
您的浏览器不支持视频标签。视频 4. 监视 `/usr/bin/pkexec` 的访问让攻击者知道密码提示何时弹出,使他们能够在真实提示上方绘制*假*提示。此处对话框中的视觉差异是有意的。
由于 SteamOS (https://store.steampowered.com/steamos) 也使用 KDE Plasma 6,这里有一张在 SteamOS 上的 KDE 终端(Konsole)绘制在认证提示窗口之上的图片(这是在虚拟机中,实际情况可能有所不同):
图 5. 在 SteamOS 上,我们可以将窗口置于密码认证窗口之上,因为它也使用 KDE Plasma 6。
---
### 3. Android:揭示私人通信
如前所述:
> 在 Android 上,`FileObserver` 绕过了 FUSE 层的按应用存储视图,允许一个无特权应用监视另一个应用的私有文件夹。我们在针对 WhatsApp 的测试中展示了这一点,精确揭示了照片、视频和文件何时到达或被删除。
每个应用在 `/sdcard/Android/` 下都被分配了一个私有文件夹,通过 Android 的 FUSE 层对其他应用隐藏,Android 的 FUSE 层本应使其对所有其他应用隐藏。通常,一个无特权应用对 WhatsApp 的私有媒体文件夹调用 `File.listFiles()`,例如 `/sdcard/Android/media/com.whatsapp/WhatsApp`,内核会返回空的子文件夹且没有文件。FUSE 层完全过滤掉了 WhatsApp 的文件列表,因此该文件夹对其他应用看起来是空的。我们的研究表明,这种保护不适用于文件通知:另一个没有任何权限的无特权应用仍然可以在同一文件夹上挂载 `FileObserver` 监视器,并接收到其中每个文件事件(加上文件名!)的通知,尽管它无法列出其中的任何文件。
以 WhatsApp 为例,传入的媒体显示为带有文件名的 `MOVED_TO` 事件。在我们的日志中,`IMG-20260401-WA0011.jpg` 在 WhatsApp 完成下载和解密后约 100 毫秒被移动到 `WhatsApp Images/`(通过 `.Shared/`),这在我们概念验证应用(巨大的)logcat 输出中可以看到:
左:当被要求发送 WhatsApp 图片时,我们的同事 Roland (https://www.rolandczerny.com/) 在 WhatsApp 上发送了一张图片。右:观察到新的传入 WhatsApp 图片的无特权应用。
发送的媒体是分开存放的,因此攻击者还能得知图片是被发送还是接收的。图片位于 `WhatsApp Images/Sent/`,文档位于 `WhatsApp Documents/Sent/`,其他接收到的内容留在父文件夹中。由于仅文件名就揭示了媒体类型(图片、视频、语音消息或文档)及其创建时间,攻击者可以构建出用户发送和接收内容及时间的精确时间线。删除文件也会生成事件,因此事后删除消息中的媒体内容也能被观察到。
---
### 4. Windows:直接网站泄露
在 Windows 上,对不可读目录挂载 `ReadDirectoryChangesW` 监视会导致权限拒绝错误。但是,将其挂载在根目录(例如 `C:\`)上可以绕过此限制,导致 Windows 报告系统范围内的所有文件系统事件*以及文件名*,无论受影响的文件是否可读。在我们的负责任披露中,微软表示他们认为这是一个未记录的功能。
文件名泄露信息的一个例子是浏览器访问网站时创建的目录。Firefox 为每个使用本地存储、IndexedDB 或缓存的网站创建并使用一个单独的目录。值得注意的是,该目录包含网站的名称。在 Firefox 上,攻击者可以可靠地监控排名前 1000 的网站,F1 得分为 97.8%。
您的浏览器不支持视频标签。视频 6. 在 `C:\` 上挂载的跨用户监视器报告**所有**文件的事件,即使用户无法读取它们。在此视频中,攻击者过滤“http”,而另一个用户在 Firefox 中访问 arstechnica.com (https://arstechnica.com/)。
这里有更多例子:
图 7. 从左上角(顺时针):lemmy.world、flightradar24.com、mastodon.social、amazon.de、wikipedia.org、twitch.tv。
---
### 团队
该团队由奥地利格拉茨工业大学 (Graz University of Technology) (https://www.tugraz.at/en/home) 信息安全研究所 (Institute of Information Security) (https://www.isec.tugraz.at/) (ISEC) 的研究人员组成:
- Sudheendra Raghav Neela https://inoti.fyi/cdn-cgi/l/email-protection#780b161d1d1419380c0d1f0a190256190c https://snee.la/ https://infosec.exchange/@vmcall https://bsky.app/profile/snee.la https://www.linkedin.com/in/nsraghav/
- Xufan Zhao
- Jeanette Angelika Wultsch https://www.linkedin.com/in/jeanette-wultsch-57550b202
- Hannes Weissteiner https://hannesweissteiner.com/ https://infosec.exchange/@hweissi https://bsky.app/profile/hannesweissteiner.com https://x.com/hweissi https://www.linkedin.com/in/hannes-weissteiner-817a90250/
- Stefan Gast https://stefangast.eu/ https://infosec.exchange/@notbobbytables
- Florian Draschbacher https://floriandraschbacher.github.io/ https://www.linkedin.com/in/florian-draschbacher/
- Daniel Gruss https://gruss.cc/ https://infosec.exchange/@lavados https://bsky.app/profile/gruss.cc https://twitter.com/lavados https://www.linkedin.com/in/daniel-gruss-37253716a/
---
## 一些问题与解答
1. 我受到影响了吗?如果您使用 Linux、Android、Windows 或 macOS,您在不同程度上肯定受到影响。
虽然 macOS 通过仅暴露全局可读文件而泄露最少信息,没有泄露私人信息(不像 Linux、Android 和 Windows),但我们发现用户、应用程序和系统行为仍然可以被跟踪,尽管范围要小得多。
2. 有修复措施吗?
### » Linux «
2025 年 12 月,Linux 的问题被部分缓解 (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=635bc4def026a24e071436f4f356ea08c0eed6ff),不再对特殊文件(本质上是字符文件,`/dev/` 下的文件基本都是字符文件)生成“访问”/“修改”事件。我们感谢 Amir Goldstein、Jan Kara、Greg Kroah-Hartman 和 Linux 内核安全团队讨论并部分缓解了该问题。虽然它没有被完全缓解,但最严重的问题得到了缓解。此问题被分配为 CVE-2025-68788 (https://lore.kernel.org/linux-cve-announce/2026011303-CVE-2025-68788-05bd@gregkh/),并在内核 5.10.248 (https://lore.kernel.org/stable/2026011946-jigsaw-acutely-6384@gregkh/)、5.15.198 (https://lore.kernel.org/stable/2026011939-angelic-slimy-b849@gregkh/)、6.1.160 (https://lore.kernel.org/stable/2026011122--02ff@gregkh/T/)、6.6.120 (https://lore.kernel.org/stable/2026011132--064c@gregkh/T/#t)、6.12.65 (https://lore.kernel.org/stable/2026011142--?8f5e@gregkh/T/#t) 和 6.18.3 (https://lore.kernel.org/stable/2026010221-acts-basically-fbfc@gregkh/T/#u) 中得到了缓解。
您可以检查此命令在您按键盘按键时是否生成通知:
```
inotifywait -m -e access,modify /dev/input
```
如果您没有看到任何通知出现(如上面的视频 2),那么您的内核已应用了缓解措施。
### » KDE «
在我们与 KDE 安全团队的邮件往来中,他们回复说焦点窃取阻止功能并非旨在作为安全措施,而是为了避免令人讨厌的弹出窗口导致的竞态条件。
我们发现在 KDE Plasma 5 和 6 中暂时有效的方法是:
打开终端,输入 `pkexec ls`(在哪里执行都可以)。在密码窗口顶部单击右键 > 更多操作 > 配置特殊应用程序设置 > 添加属性 > 置于其他窗口之上(单击 +)> 关闭属性窗口 > 将“置于其他窗口之上”设置为“强制”并单击“是” > 确定。
这里有一个视频引导您操作:
您的浏览器不支持视频标签。视频 8. 在 KDE Plasma 6 上启用密码提示窗口始终置于其他窗口之上。
### » Android «
无
### » Windows «
在我们提交论文并向微软报告之后很久,我们独立发现了:Access check enhancements to prevent unauthorized disclosure of file paths (https://support.microsoft.com/en-US/servicing/os/windows/docs/2025/04/access-check-enhancements-to-prevent-unauthorized-disclosure-of-file-paths),这与我们的 Windows 发现类似,是 Sébastien Huneault 于 2025 年 4 月报告给微软的漏洞。微软引入了一个新的注册表策略 `EnforceDirectoryChangeNotificationPermissionCheck`,该策略缓解了我们报告的行为。此策略默认禁用,即我们在论文
相似文章
协议窥探:AirDrop 与 Quick Share 的漏洞研究
本文首次对苹果 AirDrop 和安卓 Quick Share 进行了跨平台逆向工程与协议感知模糊测试研究,揭示了这些广泛使用的近场传输协议中存在的六个漏洞。
Linux漏洞、禁运失效与补丁窗口缩短
一份关于2026年5月发现的三个严重Linux本地权限提升漏洞的报告,强调了披露模型的崩溃及其对生产环境的影响。
近期 Android 版本中的任意应用都可能泄露特定流量
研究人员在近期的 Android 版本中发现了一项安全漏洞,该漏洞可能导致任何已安装的应用泄露特定的网络流量。
Android网络流量泄露的另一种方式被发现
在Android中新发现的一个泄露问题,使得恶意应用能够利用keep-alive UDP连接来绕过VPN隧道,从而可能暴露用户的真实IP地址,用于跟踪或监视。
CVE-2026-45257:通过kTLS-RX在FreeBSD中的本地权限提升
FreeBSD中存在一个严重的本地权限提升漏洞(CVE-2026-45257),允许无特权用户将任意数据写入任何可读文件的页面缓存,绕过文件权限和标志,最终导致完全获取root权限。该漏洞影响FreeBSD 13.0及更高版本的默认安装,通过sendfile、KTLS和内核内AES-GCM解密的不安全组合实现。