9 月 20 日消息,火绒安全公众号今日发文称,火绒威胁情报中心近期监测到一款专门锁定浏览器主页的病毒正加速蔓延。经溯源,该病毒的源头指向搜狗输入法。
文章称搜狗输入法通过其 Shiply 终端基础发布通用模块,向云端请求控制配置。在下发这些云控配置中,会结合用户画像:例如所在地区、时间等诸多维度进行精准推送。由于 Shiply 平台本身具备灰度发布能力,据此推测,攻击者很可能先通过小范围灰度测试验证效果,再进行大规模传播。
文章称,该病毒的推广模块会首先检测用户设备上的杀毒软件,随后通过篡改配置文件的方式,强制修改 Edge 与 Chrome 两款主流浏览器的主页及默认搜索引擎设置。目前,火绒安全产品可对上述推广模块进行拦截与查杀。
1、样本分析
本文提及的搜狗输入法版本为 15.7.0.2192。
1.1、云控配置获取与推广模块下载
配置拉取源头:搜狗输入法将会借助 SGBizLauncher.exe程序附加参数 -lappid=configupdate 进行拉取云控配置,该 SGBizLauncher.exe程序会被输入法组件 SogouPY.ime执行,执行间隔为六个小时一次。此输入法组件为 DLL 文件,将会通过用户切换至搜狗输入法时被加载。
设置 Shiply SDK 参数:在 SGBizLauncher.exe程序中,将通过 Shiply SDK 拉取配置。在此之前,需设置 APPID、APPKEY、BundleID、应用版本等参数,测试后发现其中 APPID 与 APPKEY 为关键参数,其将会决定拉取的配置。
Shiply 发布平台设置云控配置:搜狗输入法会借助 Shiply 发布平台设置云控配置,此发布平台可以通过规定时间、地区、应用版本号等条件来进行精准下发云控配置,且具备灰度发布等放量策略,可先进行小范围测试。对此次事件进行评估,亦是由于灰度发布或精准下发所致,故而未涉及更多用户。
平台云控配置与本地拉取后数据库对应关系:下图为 Shiply 平台所创建的云控配置,其中创建 smart_task_config_1 与 beacon_main_switch_1 配置键和相对应的配置值,在本地获取上述云控配置时,Shiply SDK 会将这些配置存储于指定的数据库文件中。
该数据库具体路径为:
C:\ProgramData\SogouInput\SGBizConfig\{APPID_SYSTEMID___}.db,此数据库为 SQLite 数据库。
上图为分析测试场景下的云控配置与本地数据库对应关系图,下图为搜狗输入法真实用户场景下的云控配置对应的数据库图,其中 smart_task_config_1 所对应的 JSON 数据内包含推广模块下载地址。
随后从云控配置(JSON 数据)中提取数据后,将数据存储至注册表 SOFTWARE\SogouInput.store.user\search_suggestion项中的 smart_task_config 和 smart_task_supports 键。其中,前者为提取的配置,后者为经加密处理的 allowed_p 字段,此字段代表允许的进程,即执行该任务的进程必须与 allowed_p 字段的值相符。
此时搜狗输入法 IME 组件被加载至 explorer.exe进程时,将会调用 ImeInquire 函数,随后便开始检查是否开启搜索候选与搜索推荐。若二者之中有一项处于开启状态,便会进入解析云控配置的逻辑流程。从中能够看出,相关按钮是针对搜索候选和推荐的,不应与修改浏览器主页存在关联。
搜狗输入法将读取 search_suggestion 注册表 smart_task_supports 的值,以获取支持的进程名列表,并与当前进程名进行比对。若匹配则会继续运行进程。
进入任务前判断阶段:
1.首先,读取 HKEY_CURRENT_USER\SOFTWARE\SystemTask项中的 task__{allowed_p} 键。若该键存在,则读取其中的 let_{上次任务执行时间} 和 remain_{剩余任务执行次数},以供后续检测使用。
2.检查当前时间段是否在 allowed_t(允许执行任务时间段)内,根据云控配置(0-28800;43200-50400;75600-86400)所示,时间段分别为 21:00-次日 8:00、12:00-14:00,估测是规避工作时间,避免被技术人员复现该现象。
3.借助 GetLastInputInfo 函数检测用户无操作时间是否超过 no_active_s(无操作时间)的情况。
4.时间为随机数并除以 100 来获取余数,来判断该余数是否> probalility(概率)。
5.检测剩余执行任务次数是否>0。
6.检测当前时间与上次任务执行时间的间隔是否>during_s(任务执行间隔)。
7.最后将任务信息保存至注册表,并开始执行任务。
任务信息保存至注册表:首先会将云端配置中的七个关键参数以下划线的方式连接:task_body_md5、version、durings_s、cycle_c_s、count、probalility、no_active_s,对它们进行 MD5 哈希计算,得出 MD5 值。随后再将 allowed_p、MD5 值、let_{当前时间}、during_{durings}、remain_{剩余任务执行次数}(该值每次任务执行时都减 1)通过分号连接,并将该字符串写入至注册表 HKEY_CURRENT_USER\SOFTWARE\SystemTask项 task__{allowed_p} 键中。
下载推广模块:任务开始后首先解密 task_body64 字段值(该解密算法采用的是 AES 算法并搭配非标准密钥流),获取到下载链接:https://ime.gtimg.com/pc / brspgchange20250811x64_a.dat并开始下载,下载完毕后,运用 MD5 算法计算所得 MD5 值,并与 task_body_md5 进行比对,以确认二者是否一致。
解密推广模块:下载到的 brspgchange20250811x64_a.dat文件经过加密处理,其解密需运用云控配置中的 key(98c0b113a40fe1790d9e116d75dcfcff)与字符串 "secret" 异或出新的 key,随后以该新的 key 为密钥,采用 AES 算法 CBC 模式进行解密。
试图下载新的推广模块:因下载链接有一定的规律,尝试将日期改成 9 月 10 日(即 brspgchange20250910),发现可以下载并且密钥与上次云控配置中的密钥一致,推测此推广模式将会长期持续,新的推广模块将会在下文《推广模块分析》中介绍。
加载推广模块并调用入口点和 cgbp 导出函数:随后,将解密后的推广模块以手动加载的方式载入内存。在完成检查 PE 头、进行 Section 映射、开展重定位处理、修复导入表以及修改 Section 权限等操作之后,会调用模块入口点以进行初始化。之后,通过遍历导出函数的方式获取 cgbp 导出函数地址,并调用该函数,由此进入推广模块的主要逻辑。
1.2、推广模块分析
检测并规避杀毒软件:借助函数 OpenMutexW 与 Process32NextW 检测本计算机中是否存在 360 或火绒的互斥体、进程名,若不存在则继续推广。
检测相应浏览器是否存在:以 Chrome 浏览器为例,将依次检测多个路径下的主程序 chrome.exe是否存在,检测配置文件 Secure Preferences 和 Preferences 是否存在,注册表中是否有 Google Chrome 等方式。
检测相应进程是否存在:以 Chrome 浏览器为例,检测 chrome.exe进程是否存在,仅当该进程不存在时才会进行修改操作。这是由于在 chrome.exe处于开启状态时对配置文件进行修改,修改内容不会被保存。原因在于,关闭 chrome.exe进程时,系统会将配置数据重新写入配置文件,进而导致配置被重置。
修改默认搜索引擎:通过写入 Preferences 与 Secure Preferences 配置文件的方式将 template_url_data 中 url 设置为 https://baidu.wenxin9.com/?word{searchTerms}&type=0002&ie={inputEncoding}
之后用户再次搜索内容时先跳转到 https://baidu.wenxin9.com/?word= 搜索内容 & type=0002&ie=UTF-8,最终跳转至 www.baidu.com/s?tn=75144485_10_dg这类带有来源标识的链接并从中获利。
macs 和 super_mac 配置项的修改原因与逻辑:mac 值是为验证时所用,一旦配置的 mac 值与写入的 mac 值不一致,则会重置配置文件。
1.计算 Unicode 编码的安全标识符(SID)的 SHA1 哈希值,取名为 SID_SHA1。
2.利用 GetSystemDirectoryW 函数,获取系统路径并传递参数于 GetVolumeInformationW 函数中,获取卷序列号(VolumeSerialNumber),取名为 VOL_ID。
3.计算 SID_SHA1 + VOLID 的 CRC8 校验码,以 {SID_SHA1}{VOL_ID}{CRC8} 的形式组合成 19 字节的机器码,取名为 MACHINE_ID。
4.以 {MACHINE_ID}{字段路径}{字段值} 的形式组合并计算其 HMAC-SHA256 哈希值,使用的密钥为 e748f336d85ea5f9dcdf25d8f347a65b4cdf667600f02df6724a2af18a212d26b788a25086910cf3a90313696871f3dc05823730c91df8ba5c4fd9c884b505a8,该密钥为固定值。
5.最终计算出来的哈希值就是 macs 中的多个字段或 super_mac 字段的值。
新版推广模块功能区别:旧版本推广模块仅具备修改默认搜索引擎这一功能。通过静态分析可知,虽存在修改主页的代码,但并未调用。与之不同的是,新版本推广模块会调用修改主页的函数。此时,若打开 Chrome 浏览器,将会跳转至 page.wenxin9.com,随后再跳转至导航页。在导航页内点击百度链接,链接均带有来源标识参数。
1.3、其他推广
搜狗输入法还有其他很多推广手段,这里只提及较打扰使用体验的桌面右下角弹窗。
弹窗推广
弹窗初期:搜狗输入法的弹窗是系统弹窗,该弹窗是通过搜狗输入法组件 biz_helper.exe程序传递参数 type=systoast 启动以试图弹窗。弹窗初期可以通过点击弹窗中的“…”选择《关闭搜狗输入法的所有通知》或《转到通知设置》进入系统通知设置中关闭搜狗输入法弹窗通知,从而关闭弹窗。
弹窗设置变灰或消失:但用户反馈该方法只能满足初期的诉求,一段时间后发现弹窗中“…”后两个按钮都变成灰色,导致进入系统通知设置,也无法关闭搜狗输入法相关选项。
隐藏原理:通过设置搜狗输入法注册表 HKEY_CLASSES_ROOT\AppUserModelId\Sogou.Ime.SysToast.Biz项中 ShowInSettings 键值为 0 的方式,达成按钮呈灰色不可点击且在通知设置中不显示的效果。
搜狗输入法设置中取消勾选:用户发现通过搜狗输入法设置中取消勾选《桌面右下角推荐》选项,想以此操作来消灭弹窗。然而一部分用户又发现该《桌面右下角推荐》选项也消失了,但在分析过程中并未成功复现,估测该行为可能是通过云控下发时针对部分目标用户精准投放所导致。
弹窗开关:至此可以统计出避免弹窗的方法总共有以下三种。
1.全局通知开关:Windows 系统自带设置中全局通知开关,将开关数据存储于注册表 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\PushNotifications项 ToastEnabled 键值中。
2.局部搜狗输入法通知开关:系统自带设置中局部通知开关,将开关数据存储于注册表 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings\Sogou.Ime.SysToast.Biz项 Enabled 键值中。
3.搜狗输入法自带开关:搜狗输入法设置中《桌面右下角推荐》选项,该选项数据将会存储于注册表 HKEY_CURRENT_USER\SOFTWARE\SogouInput.store.user项 systoast_enable 键值中。
云控配置忽略开关:然而发现搜狗输入法会根据云控下发的配置(systoast_general_config_1)忽略全局通知开关(ignore_sglb_switch)、局部搜狗通知开关(ignore_sys_switch)、搜狗输入法设置开关(ignore_ime_switch)等,并无视用户所配置的开关,其中实测发现若关闭系统中开关,则无法弹出窗口。
另外,分析时获取到的云控配置中并未包含 ignore_ime_switch 字段,意味着当前云控配置下搜狗输入法提供的弹窗开关是有效的。
建议:在使用过程中,若需关闭弹窗,可采用以下方法。这些方法大多源自网络上受弹窗困扰的用户。不过由于不同时期、不同用户画像等云控配置存在差异或其他因素,可能导致关闭弹窗的操作无法正常生效。
1.可关闭全局系统通知开关。若不想全局关闭,可通过将注册表值 ShowInSettings 修改为 1,以显示搜狗输入法通知选项,随后进行关闭操作。
2.若上述方法无效,可关闭设置中的《桌面右下角推荐》。若无法看到《桌面右下角推荐》,需先点击搜狗输入法的“帮助反馈”,找到“广告与搜索候选”,进入后查看关闭方法。之后,再次打开搜狗设置,点击“高级”,将页面拉至最下方,此时“桌面右下角推荐”的关闭选项才会出现。(此方案源自 B 站某用户评论)