资讯动态

NTFS备用数据流/交换数据流(ADS)从原理到排查清除全攻略

发布时间:2026/10/17 23:05:50 来源:尧图企业网站定制
如果你做过Windows环境下的系统维护或者安全排查大概率听过“备用数据流/交换数据流”这个名字。它听起来像某种网络协议实际上却是NTFS文件系统里一个低调到容易被忽略、但影响面极大的文件附加机制。我第一次真正意识到它的存在是因为一个很奇怪的现象某个文件用资源管理器看只有几KB磁盘占用却显示几十MB而且里面还残留着一段不知道哪来的文本。后来才知道那是文件背后挂着一条看不见的“备用数据流”。这玩意儿到底是干什么的为什么叫备用数据流又叫交换数据流它有什么实际用途又为什么会成为恶意代码的藏身之所这篇文章我会从原理讲到实操从命令演示讲到排查思路把关于备用数据流/交换数据流英文简称ADS的那些坑和技巧一次性说清楚。适合正在做Windows运维、安全分析、取证排查的同行也适合刚接触文件系统、想搞明白“文件里怎么还藏了文件”的新手。1. 先用大白话讲清楚备用数据流/交换数据流到底是什么1.1 NTFS的“文件套文件”设计要理解备用数据流先得理解NTFS文件系统的一个基础设计在NTFS里一个文件并不是只有“一份数据”而是由一个“主数据流”和若干个“备用数据流”组成。主数据流就是你在资源管理器里正常读写、正常看到的那部分内容备用数据流则是依附在同一个文件条目下、但独立于主数据流之外的附加数据块。我用一个生活化的类比来解释。主数据流相当于一本公开的书书页上的内容每个人打开都能看到备用数据流则是夹在书脊夹层里的小纸条你用正常翻书的动作永远看不到它但它确确实实跟着这本书一起存在。只有当你知道这张纸条的夹层位置并且用专门的工具去拆开它才能看到里面的内容。更关键的是你复印、压缩、打包这本“书”的时候普通操作往往只复制了书页夹层里的小纸条可能原封不动跟着走也可能直接被丢弃取决于你用的“复印机”是谁家产的。这就是为什么很多人在拷贝、备份、压缩文件时会莫名其妙发现数据“变了样”或者“多了一段东西”。因为在NTFS盘上一个文件的完整数据是“主数据流所有备用数据流”的总和而很多常规工具只处理了主数据流却把备用数据流忽略掉了。1.2 名字缘起备用、交换、附加流都是它“备用数据流”和“交换数据流”这两个中文叫法其实是同一个概念在不同语境下的译法差异。英文里的标准说法是Alternate Data Streams缩写ADS直译是“备用数据流”或者“附加数据流”。有些中文技术资料把它翻成“交换数据流”大概是因为早期NTFS设计参考了苹果文件系统中“数据叉”和“资源叉”互相配合的思路强调主数据流和附加数据流之间可以按需切换使用。反正你在不同文档里看到“备用数据流”“交换数据流”“附属数据流”“附加流”指的都是同一个东西NTFS下依附于文件或目录、独立于主数据流之外的数据通道。搞清楚这一点很重要因为很多人在网上搜“如何查看交换数据流”搜出来的却是另一个操作系统或者网络设备上的概念容易越查越偏。记住一个关键词ADSNTFS。后续所有排查和操作都围绕这两个词展开。1.3 它到底有什么用从文件系统设计初衷说起NTFS设计备用数据流最初是为了兼容其它文件系统的文件属性。在早期Windows的服务器场景里文件和它附带的元信息比如作者、关键词、图标位置、摘要信息是希望绑定在一起的。其它系统可能用一个单独数据库来存NTFS则直接把这类信息塞进文件条目下的附加流里好处是只要文件在NTFS盘上这些附属性息就跟文件形影不离。当时的典型应用包括在文件上挂载自定义摘要、为文档保存缩略图、为目录设置自定义图标、存放下载来源标记等。你从网上下载一个带标记的文件资源管理器弹窗提示“此文件来自其他计算机可能被阻止”这个标记就是存进了文件的备用数据流Zone.Identifier里。你看到的不是“警告框背后的逻辑”而是备用数据流在生活里的一个最直接体现。2. 动手试一遍命令行下的完整操作流程2.1 三分钟上手用记事本给文件加一个“隐藏尾巴”理论看再多都不如自己动手跑一遍。下面这组操作都是在Windows命令行cmd和PowerShell里就能完成的不需要装任何额外工具。请注意你得先在NTFS分区上操作C盘默认就是NTFS问题不大。第一步创建备个普通文件。打开cmd进入某个测试目录输入echo 这是公开内容 demo.txt此时demo.txt里就是一行“这是公开内容”。接下来给它加一条备用数据流echo 这是隐藏的附加内容 demo.txt:secret.txt注意命令里的文件名格式是demo.txt:secret.txt冒号后面的“secret.txt”就是这个备用数据流的名字。执行完再输入dir demo.txt你看到的文件大小仍然是“这是公开内容”那一行的大小extra内容并没有体现在资源管理器或dir常规输出里。刚才那行隐藏内容就落在了demo.txt文件的备用数据流里。这时候你可以直接用记事本访问它notepad demo.txt:secret.txt记事本会直接打开这个“看不见的流”显示“这是隐藏的附加内容”。如果你在资源管理器里双击demo.txt打开的则只有“这是公开内容”。两者看着像两个文件其实属于同一个文件条目。2.2 查看、修改、删除流的全套命令查看一个文件有没有挂备用数据流用dir的/R参数最方便dir /r demo.txt输出里会多出一行demo.txt:secret.txt这就是额外存在的依据。如果文件比较多可以用dir /r对整个目录扫一遍dir /rPowerShell用户可以用Get-Item加Stream参数看得更清楚Get-Item -Path demo.txt -Stream *返回结果会列出流名称和长度。modify流的操作也简单——直接重新向同一个流名写入即可echo 修改后的隐藏内容 demo.txt:secret.txt删除这条流用PowerShell的Remove-Item指定Stream参数Remove-Item -Path demo.txt -Stream secret.txt我用的时候更习惯先用Get-Item -Stream *确认流名再执行删除防止误删了系统级流比如标记下载来源的Zone.Identifier删错会有一些后遗症这点后面会细说。2.3 为什么必须用NTFS盘操作FAT/exFAT直接翻车为什么强调必须在NTFS分区上测试因为FAT32、exFAT这些文件系统根本不支持备用数据流。如果你把一个带ADS的文件复制到U盘exFAT系统会只复制主数据流把备用数据流直接丢掉而且通常不会给出任何明确提示。反过来你在U盘上想执行echo xxx test.txt:secret.txt大概率会报“文件名、目录名或卷标语法不正确”之类的错误。这个特性既是坑也是线索。坑在于你以为把整个文件完整带走了其实丢了一部分数据对方收件人可能毫无察觉。线索在于如果一个文件在拷贝到非NTFS盘后变“干净”了、变“小”了你就能反推它原来可能挂过备用数据流。安全排查里我经常用这个现象判断某个文件是否在NTFS环境里被人动过手脚。3. 这些“隐藏通道”在真实场景里都干了什么3.1 你每天都在用的浏览器下载标记普通用户接触最多的备用数据流其实是浏览器给下载文件打的“来源标记”。当你用浏览器从网上下载一个exe或文档到Windows系统盘默认情况下会写入一条名为Zone.Identifier的备用数据流里面记录着下载来源区域ID。用记事本打开看一下长什么样notepad 下载的文件.exe:Zone.Identifier通常你会看到类似这样两行[ZoneTransfer] ZoneId3ZoneId3表示文件来自Internet区域。系统就是靠这条流来判断“这是不是外部下载的文件”进而决定是否弹出安全警告。有些下载工具会把ZoneId0本机区域或者直接不写这条流这样文件就不会触发“已阻止”提示。安全防护软件在排查可疑文件时也会特意读取这条流来确认来源这是备用数据流在数字取证里的经典用途之一。3.2 合法的系统级用途元数据与文件分类除了下载标记Windows和不少软件也在用备用数据流存放各类附属数据。比如某些文件管理器会把目录的自定义背景、排序方式、分组属性塞进目录的ADS里老版本的Office程序曾把文档摘要信息写入ADSWindows搜索索引、磁盘配额等机制也依赖流属性来标记文件状态。在企业文件服务器上还有一类常见操作是用备用数据流挂“标签”。管理员不改变文件内容本身而是往某个文件上挂一条名为dept:finance的流里面写个部门编号然后靠脚本按流内容做分发、归档、权限复核。这样做的好处是文件外部形态不变却能携带额外的业务信息。实现起来就是前文那几条命令的组合十几行脚本就能做一个轻量的文件标签系统。3.3 恶意软件视角隐蔽驻留与对抗排查备用数据流最让人警惕的使用方式是作为恶意代码的“隐蔽藏身处”。由于常规资源管理器、dir命令不显示流文件大小攻击者可以把远控木马、恶意脚本、勒索说明塞进一个看似正常的文件的备用数据流里。受害者看到的是一个正常的PDF或者图标文件实际上那个PDF文件背后可能挂着一条存在整段恶意代码的流。历史上出现过不少真实样本通过脚本启动器调用wscript.exe去执行某个xxx.txt:payload.vbs流或者把一个程序的完整PE文件写入备用数据流再用一个小加载器从流中读取并注入进程。平时我们做应急响应的时候排查清单里一定有“检查可疑目录下所有文件的ADS”这一步否则很容易漏掉关键的恶意载荷。所以我在这里明确给大家划一条线了解备用数据流的隐藏能力是为了防御、排查和取证不是为了藏东西。真要传文件老老实实用正常渠道针对安全从业者理解攻击手法才能更有效地定位和清除这个认知课很值得补上。4. 检测与清理如何揪出文件背后的影子4.1 系统自带命令从dir /r到PowerShell枚举面对一个目录怎么快速确认里面哪些文件挂了备用数据流最简单的是用dir /r /s递归扫描dir /r /s它会列出所有文件和对应的流名。如果你想要更机器可读的输出PowerShell可以这样写Get-ChildItem -Path C:\某目录 -Recurse -File | Get-Item -Stream * | Where-Object {$_.Stream -ne :$DATA}这段的意思是把某个目录下所有文件的流信息都列出来只保留非默认主数据流非:$DATA的记录。执行后你就能看到每个文件挂着哪些流、流有多大。还有一种更彻底的检查方式对比主数据流大小和磁盘占用。如果一个文件显示的内容只有1KB但属性里磁盘占用明显变大那就要警惕是不是有备用数据流在膨胀磁盘空间。虽然资源管理器通常把主数据流大小显示成文件大小但碰到异常膨胀的文件用dir /r直接核对流列表是最快的初筛手段。4.2 流级别的完整导出与复制技巧如果你想完整复制一个带备用数据流的文件到另一个NTFS位置保留所有流不能用普通复制粘贴。普通复制在大部分情况下会把Zone.Identifier流也复制过去但其它自定义流不一定能保住。最稳的做法是使用系统备份接口或者压缩工具的全流支持模式。一个轻量方案是直接构造一个fsutil的硬链接或使用xcopy的某些模式但更常见的是用PowerShell的Copy-Item加流参数视系统版本而定。如果只是临时查看某个流的内容直接Get-Content -Stream就好Get-Content -Path demo.txt -Stream secret.txt要是怀疑某个流里面其实是一个可执行文件别直接双击运行你应该把它单独导出成一个文件再分析cmd /c type C:\test\demo.txt:payload.exe C:\test\payload.exe然后你就可以对这个导出的文件做常规的静态分析、杀毒扫描或哈希计算。这是取证里很实用的操作建议存进自己的常用命令清单。4.3 清除与防护的几条实用规则确认了不需要的备用数据流清理方法前面提过用Remove-Item -Stream就能删。但防护和清理有几个关键规则要刻在脑子里。第一系统级流不要乱删。比如Zone.Identifier删掉它文件就不再触发下载警告但这会让安全提示失效。很多用户为了“不再弹窗”把所有下载文件的Zone.Identifier都删了结果恶意文件下载后也不会再有任何提示得不偿失。第二删除流和删除文件是两回事。直接删掉整个文件所有备用数据流自然都没了。如果只想清理某个文件的附加流一定要把路径和流名写完整不然很容易误伤别的文件。第三很多备份软件默认只备份主数据流。如果你的重要文件依赖备用数据流存业务标签备份前一定要确认备份工具是否完整支持NTFS流。否则恢复出来的文件表面上还在标签信息已经静默丢失后续归档流程会直接踩坑。5. 常见坑与排查思路实录5.1 备份、压缩、传输导致ADS丢失的连锁效应我最开始在真实环境里注意到ADS就是因为一次备份“丢数据”事故。某天同事反映备份的文档还原后缺少了部分属性信息文件内容和大小看起来都正常但在某个业务系统里就是不被识别。查了很久才发现问题出在备份工具没有完整复制NTFS备用数据流。这类问题有几个典型表现文件从NTFS盘复制到FAT/exFAT盘再复制回来、用压缩软件打包后解压、上传到某些网盘再下载、通过邮件附件发送。这些路径都可能只保留主数据流。如果你发现某个文件在传输后“少了什么”除了检查文件内容本身还得检查它的流列表。我遇到过不少声称“文件损坏”的工单最终定位都是ADS静默丢失文件主体根本没坏。5.2 压缩盘与加密盘另一层麻烦NTFS支持文件压缩和加密这两者与备用数据流混在一起时会引入更多坑。启用压缩属性的文件系统会把流数据压缩存储你在流里读到的是解压后的内容。如果文件还被EFS加密其他用户或者系统账户试图读取备用数据流时可能会直接失败或只能读到加密乱码因为加密是密钥级别的不是简单加层壳。实际运维中要对挂有敏感标签流的文件做EFS加密得先确认应用读取流的方式是否兼容加密文件。尤其是一些脚本可能在普通用户上下文里能正常读取流但一旦文件被加密、切换到服务账户处理时读取就直接报错或显示乱码。排查时要看的不只是文件本身的加密状态还要看调用方的上下文环境。5.3 误以为文件已被删除但程序仍占用另一个常见坑是你删除了一个文件却发现某个进程仍然能访问到内容。这在很多时候不是“文件没删掉”而是有程序打开了这个文件或文件某个流形成了占用。备用数据流会让这个现象更隐蔽因为你看到资源管理器里文件已经消失但另一个进程可能正握着某个路径:某个流的句柄。排查方法是用系统自带句柄查询工具或者PowerShell查看哪些进程打开了该路径。在真正删不掉文件时先别反复强杀进程用openfiles或相关命令定位占用源再决定是停服务还是等句柄释放。这个思路同样适用于目录被挂流的情况——目录的ADS可能存储自定义视图信息删除目录时报“正在使用”多半就是桌面资源管理器开了这个目录并读取了视图流。5.4 杀毒软件与流扫描的特殊关系主流杀毒软件对NTFS的备用数据流是有一整套扫描逻辑的。它们不只查主数据流也会按策略扫描Zone.Identifier、检查已知恶意流名、监测常见隐蔽驻留路径。但在实际测试中我发现不同杀软对自定义流的扫描深度差异很大。有些人会把恶意载荷放在随机命名的流里通过混淆流名逃避部分静态扫描。这里想提醒的是不要以为装了杀毒软件就万事大吉尤其是做渗透测试或者应急响应的人要养成手动检查ADS的习惯。杀软提供的是通用防护针对特定隐藏手法的深入排查还是得靠人工和脚本。反过来如果你在测试自己的工具链避免用真实恶意代码去试杀软用无害的标记文本即可这也是我自己实践中的一条红线。写在后面我的一些实操体会备用数据流/交换数据流这个主题平时不显山不露水一旦遇到相关故障或者安全事件却是能把人卡住很久的暗坑。我个人做系统维护和排查时最常提醒自己的三句话看文件大小别只看资源管理器备份传输前先确认工具认不认NTFS流见到异常体积膨胀的文件第一时间用dir /r和PowerShell流枚举扫一眼。另外分享一个小技巧如果对某个目录的文件完整性没把握可以在命令行里做一次流清单快照保存成文本隔段时间再跑一次对比。流的新增和删除都会在清单里留下痕迹这在没有完整审计系统的普通服务器上也算是一种轻量级的状态追踪方案。希望这篇关于备用数据流/交换数据流的实操复盘能帮你少走一些我走过的弯路。你手上要是也遇到过跟NTFS流相关的怪问题试试从“文件背后还挂着别的东西”这个角度去查大概率会有新发现。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑