ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

内网“软件户口清查”实战:揪出非法入境软件的完整排查指南

内网“软件户口清查”实战:揪出非法入境软件的完整排查指南

做网络安全和运维这些年,我见过太多看起来风平浪静、实际上满地窟窿的内部网络。你以为一台电脑上只有正式邮件、办公套件、业务系统客户端,但等你真正翻一遍,会发现里面住着各种来路不明的家伙:网页下载器的全家桶、软件激活工具、免安装绿色版、某个已经调岗多年的工程师留下的远程控制程序…… 这些就是今天想聊的“非法入境”的软件。它们平时安安静静待在系统某个角落,不弹窗、不报错,像定时炸弹一样,等着某个漏洞被触发、某个外联地址被唤醒,然后整个网络陪你一起买单。

这篇文章不是泛泛地讲安全意识,而是把我自己排查这类问题的完整套路写出来:先怎么定义“非法入境”,再怎么做资产盘点,遇到删不掉、查不出、误杀、量大管不过来的情况分别怎么处理。目标只有一个:让你看完之后,能立刻在自己管理的网络里做一次“软件户口清查”,把藏在暗处的东西翻到明面上来。

1. 内容整体设计与思路拆解

1.1 先下定义:什么软件算“非法入境”?

我见过很多网管朋友对“非法入境”的理解不太一样,有人觉得只有破解软件才算,有人觉得只要跟业务无关的软件都算。实际操作下来,我建议用三条标准来判断,满足任何一条,都要纳入排查范围。

第一条是来源不可控。软件不是通过公司正规采购、IT部门统一分发、软件商店或官方渠道获取的,而是从第三方下载站、网盘、聊天群分享、别人U盘拷过来的。来源不可控意味着你根本不知道安装包在传输过程中有没有被二次打包,里面有没有夹带私货。

第二条是未经登记授权。这台机器上跑的软件没有出现在软件台账里,IT部门没有记录,安全团队没有审批过。比如某个员工为了图省事,自己在服务器上装了一个远程桌面工具方便下班后连回去加班,这种工具本身不违法,但你完全不知情,就是一个巨大的管理黑洞。

第三条是存在未知风险。文件没有数字签名、发布者信息缺失、版本异常、运行后会产生可疑进程和网络连接,或者官方早就停止维护、漏洞满天飞。满足这条就算暂时没出事,也属于高危对象。

我经常用一个比喻:正规软件就像有户籍有身份证的居民,可以查到它从哪里来、归谁管;“非法入境”的软件就像没有登记的黑户,你根本不知道它平时在干什么。这个定义非常关键,因为后面所有排查和治理动作,都是围绕这三条标准展开的。

1.2 为什么不能只指望杀毒软件?

很多老板和管理者会问:我们公司装了杀毒软件,还有防火墙,为什么还要搞什么软件盘点?这个问题我每次都要耐心解释。杀毒软件解决的是“已知恶意代码”的问题,它的核心能力是匹配病毒库、查杀恶意样本、拦截恶意行为。但“非法入境”软件中的很大一部分,根本不是恶意软件。

举个例子,某个员工从网上下载了一款单机游戏的绿色版压缩包,解压就能玩,里面通常没有传统意义上的病毒特征,杀毒软件查不出来。但这份“绿色版”往往被第三方重新打包过,里面附带了一个用于远程控制的工具组件,或者存在利用已知漏洞的模块。杀毒软件查不到,因为它没有破坏系统文件,没有明显的恶意行为,它的存在本身就是风险。

再比如某实验室的工程师当年为了做项目测试,在服务器上装了一个数据库管理工具,后来项目结束、人员离职,这个工具没人卸载,还保留了启动项和服务。杀毒软件不会认为这是病毒,但它的版本已经好几年没更新,中间被爆出过好几个远程代码执行漏洞。在网络攻防里,这种“沉睡资产”就是攻防演练时最容易被拿来当跳板的突破口。

所以我的思路很明确:杀毒该装还是要装,但那只是最后一道防线。真正要解决问题,得往前一步,先把资产盘清楚,把“户口”理顺,让每一台机器上跑的东西都在掌控之中。

1.3 拆解思路:从“救火”转“盘家底”

刚开始做软件治理的时候,我犯过一个典型错误:一上来就急着清理,看到可疑文件就删,看到可疑进程就杀。结果没过两天,业务部门就炸锅了,某套老系统的加密组件被当成垃圾清掉,导致加密服务起不来;某台机器的打印机驱动也被误删,整个部门没法打发票。那次的教训很深,让我彻底转变了思路。

正确的做法分四步走。第一步是先盘点,把全网所有设备上的软件、进程、服务、自启动项、网络连接全部收集起来,形成一份完整的资产清单。第二步是分类,对照软件台账和官方信息,把资产分成三类:白名单内正常软件、灰度存疑软件、明确非法的红色对象。第三步是处理,但处理红线类要果断,存疑类要谨慎,先隔离再确认,切忌一刀切。第四步是建机制,把“软件准入”变成流程和制度,让非法软件进不来,而不是靠一次次大规模清扫。

这篇文章后面的章节,其实就是按这个思路展开的。你现在看到的不是一次救火行动,而是一次完整的“软件户口清查”。搞明白了这个逻辑,你再看下面的实操细节,就会觉得每条命令、每个步骤都有它的位置。

2. 核心细节解析与来源拆解

2.1 非法入境软件的六大常见来路

我梳理了这几年实际排查中遇到的案例,非法入境软件主要来源于六个方面,你可以对照检查自己的网络。

第一种是下载站全家桶。这是最常见的一种,员工在某下载站搜索“PDF转换器”“压缩软件”,点了一个超大按钮下载,结果装完之后桌面多了三个浏览器、两个购物软件、一个资讯弹窗,系统主页也被改了。这类软件往往自带静默安装的服务和计划任务,专门绕过常规卸载流程,清起来特别费劲。

第二种是破解与激活工具。为了使用某收费软件又不愿意付费,有些人会去找所谓的“激活脚本”“注册机”“补丁包”,这些工具本身是高风险携带体,但它们通常不会表现出明显的病毒特征,反而会伪造签名或修改系统权限。更麻烦的是,这些工具为了保持激活状态,往往会在系统里植入常驻服务,与激活服务器保持通信,一旦服务器被劫持,整个内网都会暴露在威胁之下。

第三种是免安装绿色版、单文件版。这种软件压缩包解压就能用,没有安装向导,也不会写入正常的卸载列表,因此在“控制面板-程序和功能”里根本看不到它的痕迹。但它们照样会在注册表里写启动项、在系统目录里掉落动态链接库文件,排查难度比正常安装的软件高很多。

第四种是开发调试遗留物。开发人员为图方便,在内网服务器上装了一堆临时工具:脚本解释环境、接口调试工具、数据库客户端的绿色版、甚至直接把一个流程自动化脚本挂在服务器上。这些工具在开发阶段确实有用,但一旦开发结束没有清理,它们就变成了挂在系统里的“后门房”,权限配置往往还很宽松。

第五种是离职员工的残留资产。人走了,机器还在,系统里保留着当年装的各种工具、远程控制软件、文件同步网盘,甚至有的还开了共享文件夹。这些年我处理过不少案例,都是离职员工的旧账号和残留软件被利用,用来翻找公司敏感数据。离职账号清理大家都记得,但离职员工机器上的软件资产往往被忽略。

第六种是外设附带与使用个人介质导入。某台打印机附带的未知驱动组件、某台工控设备预装的远程运维程序、员工通过手机U盘把家里的软件包拷到办公电脑上安装,这些路径不经过公司任何审核,属于最典型的“非法入境”。

2.2 这类软件为什么被叫“定时炸弹”:三重隐患拆解

说它们是定时炸弹,不是危言耸听。我习惯从三个维度来解释这个问题,每次都简洁有力。

安全维度的隐患最直观。非法入境软件不受公司统一安全管理,没有统一打补丁的机制,没有标准基线加固,没有纳入日志审计范围。从攻击者的角度看,这类软件就是最好的突破口,很多攻防演练中拿下权限靠的就是某个老旧版本的工具。更糟糕的是,有些非法软件为了保持“存活”,会主动连接外部服务器,如果这个服务器被攻击者控制,那你的内网就是别人随时都能敲门进来的院子。

合规维度的隐患在特定行业尤其致命。在中国境内做等保测评时,软件资产是必审项,测评人员会随机抽取终端,检查是否安装了与业务无关的软件。在涉及知识产权和版权的场景下,公司里存在大量未授权商业软件,一旦被版权方或监管机构发现,轻则面临行政处罚,重则产生商业纠纷。我见过一家公司因为一颗“定时炸弹”被引爆,整个部门停摆一周做审计,代价远超当初省下的那点软件采购费。

运维维度的隐患平时看不见,爆发起来很要命。非法软件常年驻留内存,白占CPU和磁盘;它们之间互相冲突,导致正常的办公软件莫名闪退;它们打开大量端口,让内网IP地址冲突和流量异常变得难以排查。更关键的是,非法软件制造的“脏乱差”环境会直接拉低对正常故障的判断效率,一个单位半小时能解决的问题,在这种环境里可能要排查半天。

2.3 识别特征:用这几个细节一眼看出“来路不明”

在拿到一份软件清单后,怎么快速分辨哪些是“非法入境”?我总结了一套识别方法,不依赖专业工具,看几个细节就能初步锁定嫌疑对象。

第一看路径。正常企业分发的软件,要么装在公司自定义的软件中心目录,要么在统一的“Program Files”下按标准方式注册。如果软件安装路径在用户临时目录、系统临时目录、下载文件夹、或者某级目录极深的个人文件夹下面,那就高度可疑。绿色版软件最喜欢藏在“下载”文件夹或者“文档”目录下,因为双击运行就能用,根本不需要写入系统目录。

第二看发布者和签名。右键点击可执行文件,查看文件属性里的“详细信息”,重点看版权、产品名称、原始文件名、数字签名信息。正常软件通常有完整的公司名称和经过认证的数字签名;而很多非法软件的文件属性是空的,或者发布者显示为“未知”。如果文件名看起来很正常,但发布者跟官方对不上,基本可以判定是篡改过的版本。

第三看安装痕迹和启动行为。在控制面板里看“程序和功能”,如果某款软件不在列表里,但它却在运行或设置了自启动,那十有八九是绿色版或者被脚本强塞进来的。反过来,有些非法软件反其道而行之,把名字伪装成“Microsoft Update”或者“Windows Service”,但在文件和公司信息里露出马脚。

第四看网络行为。这个需要借助后续的工具,当某个进程与不明外部地址建立连接,而且这个地址的域名注册信息跟软件厂商毫无关系,那就要高度警惕了。很多破解工具为了验证授权,会偷偷连回作者指定的服务器,一旦域名到期被回收,攻击者买下这个域名,就能直接给内网下发恶意指令。

这些识别特征拼在一起,就是一条完整的画像。看到可疑对象之后,先别急着下结论,再对照软件台账和官方信息确认一下,减少误判。

3. 实操过程:一次标准的“软件户口清查”行动

3.1 盘点前先画地图:范围与工具准备

动手之前先明确盘点范围,这是我最重视的一步。很多网管朋友第一反应是“把服务器都扫一遍”,但服务器只占整个内网的一小部分,真正的“重灾区”是办公桌面、笔记本电脑、虚拟机以及各类带系统的小型设备。只要是能联网的设备,哪怕是一台贴在墙上没人管的物联网网关,里面也可能藏着预装的远控组件,都应该纳入盘点范围。

建议把盘点对象至少分成四类:服务器与虚拟机、办公台式机和笔记本、网络设备与安全设备、IoT与专用设备。每一类单独建一张表,记录设备名称、IP地址、操作系统、所属部门、责任人、最近一次盘点时间。有了这张地图,后续采集工作才有条理。

工具准备也分两层。第一层是系统自带能力,Windows环境主要用PowerShell、系统日志、任务管理器,Linux环境用systemctl、netstat、crontab等命令,这些不需要额外安装,适合小规模快速摸排。第二层是集中管理平台,适合终端数量几百上千的场景,用一个轻量级资产管理工具在每台终端上安装agent,自动收集软件、进程、自启动项、补丁情况,集中呈现。对绝大多数企业来说,第一步用系统自带工具跑一遍足够发现80%的问题,那些藏得特别深的,再用专项工具做深度分析。

3.2 拿到一份完整软件清单:注册表与PowerShell两手抓

采集软件清单,我推荐两条路并行,互相验证。第一条路是常规卸载列表,它记录了大多数通过安装向导安装的软件。在Windows上,可以用命令行直接导出:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallLocation, UninstallString | Export-Csv -Path C:\temp\installed_software.csv -NoTypeInformation -Encoding UTF8

注意这一条只管64位视角的软件,32位软件的注册表路径在HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*,另外当前用户的安装在HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*。三条线都要跑,才能覆盖大部分安装类软件。

第二条路是查文件系统,专门对付绿色版和免安装软件。配合软件清单,我一般还会扫几个典型目录:用户的“下载”文件夹、“文档”文件夹、C:\Users\Public、%Temp%,看看里面有没有可疑的可执行文件。PowerShell一条命令就能扫描:

Get-ChildItem -Path C:\Users\*\Downloads, C:\Users\*\Documents, C:\Users\Public -Recurse -Include *.exe,*.msi,*.bat,*.ps1 -ErrorAction SilentlyContinue | Select-Object FullName, Length, CreationTime, LastWriteTime | Export-Csv -Path C:\temp\filescan.csv -NoTypeInformation -Encoding UTF8

这里有个重要提醒:尽量避免使用WMIC product命令或Get-WmiObject -Class Win32_Product来获取软件列表。这条命令看起来很方便,但它在查询时会触发Windows Installer对所有已安装产品做一致性核实,可能导致系统短暂卡顿,在配置较低的办公电脑上甚至会卡死好几秒。我早年在客户机房执行过一次,整个机器直接假死,差点把生产服务搞崩了,从此再也不敢用。用注册表方式就不会有这个问题。

拿到清单之后,先跟软件台账做对比。匹配不了的,就是需要重点关注的待核查对象。

3.3 抓现行:看看谁在联网、谁在悄悄启动

软件清单只是静态快照,真正的问题还得靠动态视角来看。我习惯在软件盘点完成之后,再做一次“进程与网络行为审计”,两件事同步做,看到可疑进程时立刻能查到它跟谁通信。

在Windows上,最直接的命令是先列出所有进程和对应的可执行文件路径:

Get-Process | Sort-Object CPU -Descending | Select-Object Name, Id, CPU, Path, Company | Export-Csv -Path C:\temp\process_audit.csv -NoTypeInformation -Encoding UTF8

注意Path列如果为空,说明进程的可执行文件路径无法访问,通常是因为权限不够或者进程伪装了路径,这本身就是可疑信号。Company列是签名公司信息,如果显示为空或与软件名不符,也要重点标记。

接着看网络连接,找出哪些进程正在跟外部地址通信:

Get-NetTCPConnection -State Established | Where-Object { $_.RemoteAddress -notlike '127.*' -and $_.RemoteAddress -notlike '192.168.*' -and $_.RemoteAddress -notlike '10.*' -and $_.RemoteAddress -notlike '172.*' } | Select-Object RemoteAddress, RemotePort, OwningProcess | ForEach-Object { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue [PSCustomObject]@{ RemoteAddress = $_.RemoteAddress RemotePort = $_.RemotePort PID = $_.OwningProcess ProcessName = $proc.Name ProcessPath = $proc.Path } } | Export-Csv -Path C:\temp\network_audit.csv -NoTypeInformation -Encoding UTF8

拿到的外联地址清单,去查一下它是什么来头。如果某个内部IP频繁连接外部陌生端口,而且对应的进程路径又不在软件台账里,那这个对象基本可以确定有问题,需要深入追踪。

自启动项也是非法软件赖着不走的“根据地”。注册表里要查这几个位置:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run HKLM\Software\Microsoft\Windows\CurrentVersion\Run HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

再加上“启动”文件夹。如果你想一次性看全,PowerShell可以这样写:

$runLocations = @( 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run', 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run', 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run' ) foreach ($loc in $runLocations) { if (Test-Path $loc) { Get-ItemProperty -Path $loc | Select-Object * -ExcludeProperty PS* | Format-List } }

计划任务也是重灾区,用下面的命令把可疑任务列出来:

Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } | ForEach-Object { $actions = $_.Actions | ForEach-Object { $_.Execute + ' ' + $_.Arguments } [PSCustomObject]@{ TaskName = $_.TaskName TaskPath = $_.TaskPath State = $_.State Actions = ($actions -join ';') } } | Sort-Object TaskName | Format-Table -AutoSize

这一轮动态审计下来,基本上能把“正在运行的非法入境软件”和“等待触发的非法入境软件”都揪出来。你要记住一个原则:静态清单查“存在”,动态审计查“活跃”,两个都做才算完整。

3.4 用数字签名过滤“嫌疑对象”:一把尺子量到底

面对几百台机器、几千个软件,逐个点开属性看签名太慢。我通常直接用PowerShell批量检查目录下所有可执行文件的签名信息,把没有签名的、签名无效的、公司对不上的全部过滤出来。

以某台机器为例,可以用下面这段脚本处理:

$targetPaths = @("C:\Program Files", "C:\Program Files (x86)") foreach ($path in $targetPaths) { Get-ChildItem -Path $path -Recurse -Include *.exe,*.dll -ErrorAction SilentlyContinue | ForEach-Object { $fileInfo = Get-Item -LiteralPath $_.FullName $versionInfo = $fileInfo.VersionInfo $signature = Get-AuthenticodeSignature -LiteralPath $_.FullName [PSCustomObject]@{ FileName = $fileInfo.Name FilePath = $fileInfo.FullName CompanyName = $versionInfo.CompanyName Description = $versionInfo.FileDescription SignatureStatus = $signature.Status SignerCertificateSubject = $signature.SignerCertificate.Subject } } } | Where-Object { $_.SignatureStatus -ne 'Valid' -or $_.CompanyName -notmatch 'Microsoft|Intel|Google|Adobe|Oracle|IBM' } | Export-Csv -Path C:\temp\unsigned_software.csv -NoTypeInformation -Encoding UTF8

看到“属于正常开发商的软件却没有有效签名”,这就是最典型的“非法入境”,它们是安全团队优先关注的对象。但签名检测也不是万能的,有些正规软件使用旧签名算法,或者下载包里的exe是自解压壳,签名状态会显示异常。这种情况下不要认定它就是病毒,还要结合路径、行为和发布者信息综合判断。

另外,还要注意一种狡猾的伪装:文件属性里的“公司名称”是可以手工伪造的,只要修改文件的版本信息,就能把CompanyName字段改成“Microsoft Corporation”。所以不要只看到公司名像正规就放松警惕,一定要结合数字签名证书的颁发状态来看。数字签名要经过可信根证书链验证才算有效,这个比文件属性里的字符串要靠谱得多。

3.5 审计模式先行:从“事后清理”到“准入拦截”

把家底盘清楚之后,长期治理的落脚点是什么?我最推荐的做法是Windows自带的AppLocker配合审计模式,它是给非法软件建立“边界”最直接的手段。AppLocker可以控制哪些exe、脚本、msi文件允许运行,在企业内网环境中非常实用。

具体操作为:在组策略管理器里找到“应用程序控制策略”-“AppLocker”,分别建好可执行规则、Windows安装器规则、脚本规则。初始阶段把规则设为“仅审核”,而不是“强制执行”。这样系统会在事件日志里记录所有被规则限定的程序的运行尝试,但不会拒绝任何程序运行,业务不会受影响。

审计模式跑一两周,就能收集到一份“实际运行行为清单”。等确认这份清单里没有意外遗漏之后,再把规则从“仅审核”切换成“强制执行”。这一步要非常谨慎,我建议先选一个部门做小范围试点,试点没问题再全公司铺开。如果不做小范围试点就全量强制执行,遇到某个老旧的内部系统依赖非常规路径运行exe,就会突然无法启动,业务影响会非常大。

除了AppLocker,还可以配合系统的“软件限制策略”或新一代的应用程序控制机制。对于Windows 11较新的版本,可以考虑Windows Defender 应用程序控制的白名单策略,比AppLocker更细粒度,但配置复杂度也更高。学校、中小企业从AppLocker入手是性价比最高的选择。

如果不想用系统自带能力,也可以选市面上的软件资产管理工具。这类工具的核心功能都类似:自动收集软件清单、版本变化、补丁状态、卸载残留检测,甚至可以直接推送卸载命令。我建议把这类工具定位为“辅助执行”,真正定规则的还是IT管理者自己,工具只是帮你更快更准地掌握情况。选型时重点看三个能力:对绿色版软件的识别率、对进程级行为的采集粒度、以及审计报告的口径是否灵活可定制。

4. 常见问题与排查技巧实录

4.1 软件删了又冒出来:谁在背后偷偷恢复?

这是在治理非法软件时最让人头疼的问题。很多电脑上删除某个可疑软件后,过几天它又出现了,甚至刚删完重启就回来。造成这种现象的原因通常有三个。

第一个是下载器常驻。很多下载站全家桶会先装一个“下载器”本体,它伪装成正常软件,负责下载并静默安装其他软件。你只删掉了它安装的子软件,没删下载器本体,下次重启下载器会重新干活。查这个我知道的最直接的方法是看计划任务,下载器通常会注册一个“空闲时运行”或“登录时运行”的任务,任务名往往带有随机字符,动作指向一个躲在临时目录下的exe。

第二个是服务恢复机制。某些恶意软件套装会用两个进程互相守护:你杀掉A,B立刻把A拉起;你杀掉B,又反过来。这种情况单点删除永远清不干净,解决办法是断网后同时禁用服务、停止进程、删除计划任务、清注册表启动项,四个动作同时完成,再卸载文件本身,顺序不对就会复活。

第三个是从备份目录恢复。很多激活工具会在系统根目录或隐藏分区里存放一份备用副本,检测到主程序被删,通过预先埋下的服务或者登录脚本自动复制回来。对付这种情况,光靠手动删除没用,必须找出备用副本位置。建议用“Everything”这类文件搜索工具,按文件名关键字搜一遍,把所有同名和相近名的可执行文件全部揪出来,一并处理。

处理这类问题的实战顺序是:先断网、再找持久化机制、最后清文件。顺序反了很难根除,而且容易被恶意组件感知到并触发自我恢复。清理完一定要重启验证,确认没有复现再让人用。

4.2 在任务管理器里看到可疑进程,却找不到文件路径

这种情况经常出现在排查“绿色版软件”或木马组件时。进程在任务管理器里能看到名字和PID,但右键“打开文件位置”没有任何反应,或者提示找不到文件。有两个常见原因,一是进程被设计成从网络映射盘或共享路径运行,断开连接后路径失效;二是进程使用了“伪路径”技巧,进程名和真实文件路径对不上。

处理方法,我建议用命令行来定位。以管理员身份运行PowerShell,执行下面的命令拿到完整路径:

Get-Process -Name "可疑进程名" | Select-Object Id, Name, Path, Company, StartTime

如果Path列是空的,再用系统自带工具来强制查看,比如使用handle.exe(系统自带的进程监测工具)查看进程打开的文件句柄;或者先用procexp(进程动态监测工具)直接看进程的图片名和路径,它的识别能力比任务管理器强得多。

还有一种情况,路径显示在某个临时目录下,而且文件名是随机的,说明这个进程是从浏览器缓存或者某个脚本里解压释放出来的。查的时候先把临时目录里有关联的文件复制一份,再杀掉进程、清理文件,不然你杀完进程之后,文件被锁定删不掉,还得再重启一次。

找到真实路径后,记得看下父进程PID是从哪个程序启动的。进程也有“血缘关系”,如果可疑进程的父进程是一个办公文档的宏或者某个脚本,那说明它是被主动释放出来的,不只是依赖自启动项,处理时要把源头一起解决。

4.3 清理时误伤了正常软件,办公系统直接罢工

这是最容易引发“民怨”的一步,处理不好会让整个清理行动功亏一篑。我早期犯过的错误是直接按照软件名称来删,看到“XXX工具”不在台账里就强行卸载,结果发现它其实是某业务系统的依赖组件,卸载之后整个业务流程废了,业务部门直接投诉到老板那里。

我现在处理这个问题的黄金原则是:先评分级、再分类处理。把扫描出来的存疑软件分三类:

风险级别判定依据处理动作
红色-明确非法带破解、激活、注册机、已知恶意签名,或疑似远控等高风险组件果断隔离,断网、终止进程、卸载、清残留,能删就删
橙色-高度存疑无签名、来源不明、运行行为异常,但与业务依赖关系不明确先冻结运行,记录日志,联系软件厂商确认后处理,不急于删除
黄色-存疑待核使用习惯可疑但功能用途正常,可能是员工私人安装的普通工具登记备案,发通知要求限期说明,由员工确认是否保留或卸载

橙色级别的处理必须谨慎,我见过某台电脑上装了一个老版本的访问数据库的组件,负责给财务系统提供接口支持,IT同事看到它不在台账里就直接卸载,结果财务系统导出报表功能全线崩溃。处理存疑软件前,先到“程序和功能”里看卸载字符串有没有详细的厂商信息,再到事件日志里查这个软件最近有没有被正常业务调用,都确认没问题再动手。

误伤之后的善后也很重要。如果确认某程序确实是正常软件被误杀,恢复方式很简单:重新用官方安装包安装一次即可。但要特别注意,安装之后检查版本号和相关配置,因为业务系统可能依赖特定的旧版本组件,装太高版本反而不兼容。建议在删除任何“存疑软件”之前,先手动记录它的版本号和配置信息,留作后续追溯。

4.4 网络规模大、终端数量多,怎么提高排查效率?

之前说的都是单台机器的排查办法,但有几百台上千台终端时,一台一台跑脚本显然不现实,必须从“手动查”转向“批量管”。

批量清点阶段,优先利用域环境。如果是域网络,可以通过组策略的“软件限制”设置和启动脚本下发,在所有域机器上统一执行我们前面写的PowerShell采集脚本,让每台机器自动生成一份清单并上传到共享目录。这个方法部署一次就能管住上百台机器,成本非常低。

如果没有域环境,或者机器分布在不同网段,那就建议部署一个集中的资产管理Agent。市面上的众多产品都支持自动资产发现、软件采集、进程监控、漏洞关联,甚至有自动上报功能。我要提醒一句:部署Agent是一次改变网络环境的操作,先在测试机组跑通,再分区域逐步推广,不要某天晚上一口气全推下去,万一Agent与现有业务软件有冲突,第二天早上你就等着接投诉电话吧。

运算量大的场景还要学会“抽样 + 定向深挖”。抽样排查按部门、按终端类型分层抽5%-10%,找出共性问题,定向深挖则针对红色区域和橙色区域做全量逐台处理。这样既能覆盖全局,又不会消耗过多人力,最重要的是先清零高危对象。

批量排查过程中,要特别关注几类机器的优先级:长期无人值守的服务器、公网出口附近的终端、运维人员或财务人员使用的电脑、以及新入职员工配发的机器。这些地方的非法软件风险最高,应该排在最前面处理。

4.5 用“白名单状态机”管住日常新增软件

排查清楚了,清理干净了,但如果后续新增软件没人管,“非法入境”问题大概率会在半年内死灰复燃。我个人的经验是建一套“软件白名单状态机”,把每台机器上的软件状态管理起来。

状态机很简单,四步循环:新安装软件先进入“未知状态”,每日自动采集时发现它不在白名单内,就触发“审核中”;审核通过后加入白名单,状态变为“合规”;审核不通过或超过时限未处理,状态变为“违规”,进入待卸载流程。这个机制配合AppLocker使用效果最好:白名单内的软件可以正常运行,白名单外的一律拦截或仅审核。软件不是一劳永逸进了白名单就没事,它的版本号、修订版本、文件哈希一旦变化,就要回到“未知状态”重新审核。

这套流程跑顺之后,日常运维压力小很多,新增软件从“装上了”到“审核完”的过程完全可控。技术上实现不难,核心是要把“软件台账”变成动态数据库而不是一劳永逸的Excel表。状态机不复杂,但真正难的是坚持跑下去。

5. 特殊场景补充:离线内网、工控机和个人设备怎么管?

5.1 离线内网更容易藏污纳垢

有些单位因为保密要求,内网是纯离线的,不连外网。很多人以为没连外网就安全,这恰恰是最危险的地方。离线路的机器不打补丁,病毒库不更新,很多员工就靠U盘、移动硬盘往里面拷贝各种软件,一旦某个U盘带毒或带了某个来源不明的软件,整个离线路都会快速传播。

离线内网治理非法软件的第一步,就是把“外带介质”管控起来。建议设置独立的“摆渡机”,所有U盘和移动硬盘必须在这台机器上杀毒、登记、拷贝,然后再进入离线路核心区。同时给所有终端装统一的软件清单采集脚本,定期导出对比。离线路本身没有攻击者直接连通,但风险集中在介质管理和内部人员操作上,流程管控比技术手段更关键。

5.2 工控机和专用设备那套逻辑跟普通PC不一样

工控机、医疗设备、嵌入式设备上跑的软件往往是没有办法轻易升级的专有系统,这些设备上偶尔会见到为了调试方便接入的第三方工具,处理方式跟办公终端完全不同。

对这类设备的原则是“非必要不装、非授权不动”。如果发现工控机上存在可疑软件,不要贸然卸载,先做整体备份,联系设备厂商确认该软件是否为系统附带的组件,确认非必需再处理。很多控制系统里为了方便维护会预装一个远程运维工具,厂商会说是“正常功能”,但你得搞清楚它开了哪个端口、有没有默认密码、能不能限制到仅本地回环访问。边界不清的情况下,宁可在网络层隔离,也别为了“清理干净”把生产系统和设备搞宕机。

5.3 个人设备与自带设备:风要刮过,但别掀翻屋顶

现在很多公司默认允许员工带自己的笔记本办公。个人设备是“非法入境”软件的重灾区,员工在家下载的东西、游戏、破解软件,全都会带到办公网络里来。但这个领域风声紧,管不好容易激化矛盾。

我的建议是,区分“办公数据”和“个人设备”两个空间。公司不强行要求员工个人设备不能有任何个人软件,但连接公司网络、访问公司系统时,必须装公司指定的终端安全组件,并且只允许访问业务白名单系统。做不到这个要求的,就不要接入办公内网。个人设备上的排查要提前讲清楚,只查公司网段的连接、公司账号相关记录,查完就结束,不翻个人文件。技术边界划得越清楚,落地阻力越小。

博文写到这里,我不打算再整一套漂亮的总结,那没意思。写下这些内容是因为这些年看惯了“平时不盘点、事后救火忙”的场景,每一次“非法入境”软件造成的安全事故,背后都是当初一个微不足道的“先装上再说”。治理这件事没有终点,它不是一个周末突击能解决的,而是一种要长期坚持的工作习惯。你只要记住一句话:软件有户口,出入有记录,白名单做边界,比什么灵丹妙药都管用。我自己也是被坑过好几回才想明白这个道理的,希望你能少走点弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进