作者:Aaron Jewitt
当你的 CISO 问你某个特定浏览器扩展是否曾经被安装在任何工作站上时,你能多快给出正确的答案?恶意浏览器扩展是一个重大威胁,许多组织却无法管理或检测它们。本文介绍了 Elastic 信息安全团队如何使用 osquery 和 Elastic Stack 创建所有浏览器扩展的实时清单和检测规则,并在某个工作站存在已知恶意浏览器扩展时通知团队。这个解决方案完全基于 osquery、Elastic Defend 集成和 Elastic Stack 中的 SIEM 功能构建。
针对浏览器扩展的威胁行为者
越来越多的威胁行为者将目标对准浏览器扩展,用于窃取信息或攻击用户 —— 有些甚至直接攻击合法扩展的开发者,试图在扩展中加入恶意代码。
如果拥有足够的权限,浏览器扩展可以查看或修改你访问的任何网站上的信息,并收集传递给网站的敏感信息,例如用户名、密码或银行账户信息。扩展还可以访问并窃取网站的认证令牌,甚至可以修改网页内容,通过社会工程手法引诱用户下载恶意软件,比如更改链接的跳转地址等。
企业面临的挑战
在企业中管理浏览器扩展面临复杂挑战。
- 扩展是按浏览器中的用户配置文件安装的。
- 每个工作站的每个用户账户都可能在每个浏览器中拥有多个不同的配置文件,比如一个个人配置文件和一个工作配置文件。
- 在一台工作站上看到五个或更多不同用户配置文件的情况很常见 —— 每个配置文件都有自己的一组扩展。
虽然可以使用受管浏览器来为公司配置文件设置扩展的允许或阻止列表,但这些方案无法管理工作站上的非公司配置文件。如果用户从个人配置文件登录工作系统,那些个人扩展仍然会对公司构成风险。另一个风险场景是,个人扩展可能动态更改点击链接的跳转地址,从而诱导用户在工作系统上下载恶意文件。
在 Kibana 中部署和管理 osquery
osquery 是一个开源代理,适用于几乎所有现代操作系统(OS)。它将每个操作系统视为关系型数据库,可以通过查询表格来获取系统当前状态的信息。你可以查询 schema 中 200 多个表,例如运行中的进程、已安装的浏览器扩展、Python 库、加载的 docker 容器、加载的内核模块、开放的网络连接、已连接的 USB 设备等。
在 Elastic,我们用自家的 XDR 功能保护所有工作站,包括将 Elastic Agent 部署到所有工作站以实现分布式防护与响应。Elastic Security 的一个重要功能是可以通过 Kibana 中的 Osquery Manager 集成,轻松地在终端上部署和管理 osquery。osquery 集成包含在 Basic 许可证中 —— 在代理集群中部署不需要额外的许可费用。
将 osquery 与 Elastic 结合使用的优势
Elastic Defend 和其他终端检测与响应(EDR)代理可以实时流式传输工作站上的进程、网络和文件日志。但这些审计日志无法提供操作系统的所有状态信息,比如已安装的浏览器扩展。而这正是 osquery 发挥作用的地方。它可以帮助我们获取工作站当前状态的快照,比如用户安装了哪些 Chrome 扩展。
在 Kibana 中点击几下即可将 osquery 部署到所有工作站,并在 Elastic Stack 中直接管理和查看你的查询 —— 使用 Kibana 管理 osquery 不需要额外基础设施。另一个优势是所有查询结果会立即被写入 Elasticsearch 索引,可用于各种使用场景。将结果写入 Elastic Stack 还能为你提供查询的历史时间线,用来查看系统的硬件和软件更改发生的时间。
更多关于在 Elastic 中使用 osquery 的信息,请查看 osquery 文档指南。
在 Elastic 中使用 osquery
在 osquery 中有两种运行查询的方式 —— 立即作为实时查询执行,或作为定期执行的查询组运行,后者被称为 query pack。
实时查询(Live query)
实时查询会针对一个或多个主机运行单个查询。实时查询非常适合在测试过程中构建和优化查询,或在调查中搜索特定指标。在 Elastic 中运行实时查询时,可以按主机单独选择、选择某个 fleet 策略下的所有主机,或按操作系统选择主机。如果某个代理在运行查询时处于离线状态,只要该代理在接下来的 60 分钟内上线,查询仍会执行;否则查询会被清除。Elastic 版本的 osquery 还提供了 “已保存查询” 功能,使得预配置复杂但常用的查询变得容易,这样其他团队成员也可以重复使用这些查询。
查询包(Query pack)
查询包是一组预配置查询,会按设定的时间间隔定期执行。每个查询可以指定在哪个操作系统平台上运行,因此一个查询包可以安全地用于包含多个操作系统的策略中。查询包可以导出或导入为 .json 文件,方便你在 Kibana 中快速添加。osquery 提供了一些示例查询包用于入门,也可以试用我们用来清点浏览器扩展的 browser_monitoring
查询包。
使用 osquery 创建所有扩展的清单
Elastic 信息安全团队配置了 browser_monitoring
查询包,在所有工作站上每六小时运行一次,以创建所有浏览器扩展的清单。我们之所以每六小时运行一次查询,是因为 Elastic 是一家全球分布的公司,无法预测用户的具体工作时间。

由于多个用户配置文件带来的复杂性,收集浏览器扩展信息的查询需要使用 JOIN 操作符,将 users 表与扩展表连接在一起。 JOIN 操作符会使用两个表中共同存在的字段将它们合并。在这个例子中,是用户 ID 的 uid 字段。
SELECT * FROM users JOIN chrome_extensions USING (uid)
查询包的结果也可以直接在 osquery UI 中查看,并带有链接,可在 Kibana Discover 或 Lens 中打开每个查询的结果。

所有查询结果都会直接存储在 logs-osquery_manager.result*
索引模式中。定时查询包的结果可以通过 action.id
字段找到。对于查询包结果,该字段遵循命名规则 pack_{pack_name}_{query_name}
。我们使用的查询包名为 browser-monitoring
,查询名为 chrome_extensions
。要查看此查询的结果,可以查询 action_id: "pack_browser-monitoring_chrome_extensions"
。
在 Discover 中查看 osquery 结果时,你会看到 osquery schema 表中的每个字段都用 osquery.*
字段名进行索引。查看 Chrome 扩展信息时,我们最常用的字段有 osquery.identifier
、osquery.name
、osquery.permissions
、osquery.profile
和 osquery.version
。

以下是 chrome_extension 查询响应中可用字段的完整列表:
-
osquery.identifier
是每个扩展的唯一标识符。通过这个标识符,你可以在 Google Chrome Web Store 查找该扩展,或使用 Secure Annex 或 crxaminer.tech 等服务查询扩展的信誉评分。 -
osquery.name
是扩展在 Chrome Web Store 和浏览器中显示的名称。 -
osquery.profile
是安装该扩展的 Google Chrome 配置文件。用户在单个账户中拥有多个不同的 Chrome 配置文件非常常见。 -
osquery.permissions
是授予扩展的权限。这个字段可以用来筛选拥有危险权限的扩展,例如访问或修改所有网站请求的权限。特别要注意那些拥有类似https://*/*
权限的扩展,这意味着扩展可以访问你访问的所有 https 网站。 -
osquery.version
是扩展的安装版本。有些情况下,某个扩展可能存在一个被攻击的版本,需要将其移除。 -
osquery.update_url
是扩展检查更新时使用的 URL。如果该值不是标准更新路径https://clients2.google.com/service/update2/crx
,说明该扩展是“旁加载”的,或者通过非标准的方式安装,应当进行调查。
另一个非常重要的 osquery 表是 chrome_extension_content_scripts
。该表包含扩展使用的每个 JavaScript 文件的信息。如果发现某台主机上有被攻击的扩展,可以使用该表中的 osquery.path
、osquery.match
和 osquery.script
字段,找到扩展运行的每个脚本的完整路径。利用这些信息,你可以通过 Elastic Defend 的响应操作功能下载这些文件进行离线分析。
创建恶意扩展的检测规则
现在你已经有了所有浏览器扩展的实时清单,可以开始构建检测规则。最直接的检测是针对已知的恶意扩展。已知恶意扩展列表通常来自威胁情报报告,包含已知的标识符和版本。这个例子中,我们将使用最近报道的 Cyberhaven 扩展被攻击活动的威胁情报。报告底部有一个包含已知恶意扩展名称、ID 和版本的 IOC 集合链接。
Name | ID | Version |
VPNCity | nnpnnpemnckcfdebeekibpiijlicmpom | 2.0.1 |
Parrot Talks | kkodiihpgodmdankclfibbiphjkfdenh | 1.16.2 |
Uvoice | oaikpkmjciadfpddlpjjdapglcihgdle | 1.0.12 |
Internxt VPN | dpggmcodlahmljkhlmpgpdcffdaoccni | 1.1.1 |
Bookmark Favicon Changer | acmfnomgphggonodopogfbmkneepfgnh | 4.00 |
Castorus | mnhffkhmpnefgklngfmlndmkimimbphc | 4.40 |
Wayin AI | cedgndijpacnfbdggppddacngjfdkaca | 0.0.11 |
Search Copilot AI Assistant for Chrome | bbdnohkpnbkdkmnkddobeafboooinpla | 1.0.1 |
VidHelper - Video Downloader | egmennebgadmncfjafcemlecimkepcle | 2.2.7 |
AI Assistant - ChatGPT and Gemini for Chrome | bibjgkidgpfbblifamdlkdlhgihmfohh | 0.1.3 |
TinaMind - The GPT-4o-powered AI Assistant! | befflofjcniongenjmbkgkoljhgliihe | 2.13.0 |
Bard AI chat | pkgciiiancapdlpcbppfkmeaieppikkk | 1.3.7 |
Reader Mode | llimhhconnjiflfimocjggfjdlmlhblm | 1.5.7 |
Primus (prev. PADO) | oeiomhmbaapihbilkfkhmlajkeegnjhe | 3.18.0 |
Tackker - online keylogger tool | ekpkdmohpdnebfedjjfklhpefgpgaaji | 1.3 |
AI Shop Buddy | epikoohpebngmakjinphfiagogjcnddm | 2.7.3 |
Sort by Oldest | miglaibdlgminlepgeifekifakochlka | 1.4.5 |
Rewards Search Automator | eanofdhdfbcalhflpbdipkjjkoimeeod | 1.4.9 |
Earny - Up to 20% Cash Back | ogbhbgkiojdollpjbhbamafmedkeockb | 1.8.1 |
ChatGPT Assistant - Smart Search | bgejafhieobnfpjlpcjjggoboebonfcg | 1.1.1 |
Keyboard History Recorder | igbodamhgjohafcenbcljfegbipdfjpk | 2.3 |
Email Hunter | mbindhfolmpijhodmgkloeeppmkhpmhc | 1.44 |
Visual Effects for Google Meet | hodiladlefdpcbemnbbcpclbmknkiaem | 3.1.3 |
Cyberhaven security extension V3 | pajkjnmeojmbapicmbpliphjmcekeaac | 24.10.4 |
GraphQL Network Inspector | ndlbedplllcgconngcnfmkadhokfaaln | 2.22.6 |
GPT 4 Summary with OpenAI | epdjhgbipjpbbhoccdeipghoihibnfja | 1.4 |
Vidnoz Flex - Video recorder & Video share | cplhlgabfijoiabgkigdafklbhhdkahj | 1.0.161 |
YesCaptcha assistant | jiofmdifioeejeilfkpegipdjiopiekl | 1.1.61 |
Proxy SwitchyOmega (V3) | hihblcmlaaademjlakdpicchbjnnnkbo | 3.0.2 |
ChatGPT App | lbneaaedflankmgmfbmaplggbmjjmbae | 1.3.8 |
Web Mirror | eaijffijbobmnonfhilihbejadplhddo | 2.4 |
Hi AI | hmiaoahjllhfgebflooeeefeiafpkfde | 1.0.0 |
使用这份 IOC 列表,有两种不同的方法来构建检测。最简单的方法是用这些 ID 和版本值,构建一个包含多个条件的 Elasticsearch 查询,使用 OR 操作符连接,针对 osquery 数据中任意一个扩展标识符和版本进行匹配。例如:
action_id: pack_browser-monitoring_chrome_extensions AND (
(osquery.identifier: "nnpnnpemnckcfdebeekibpiijlicmpom" AND osquery.version: "2.0.1")
OR
(osquery.identifier: "kkodiihpgodmdankclfibbiphjkfdenh" AND osquery.version: "1.16.2")
OR
(osquery.identifier: "oaikpkmjciadfpddlpjjdapglcihgdle" AND osquery.version: "1.0.12")
)
如果你使用我们的威胁情报集成(threat intelligence integrations)将威胁情报数据导入 Elastic Stack,可以使用指标匹配规则类型(indicator match rule type)创建更动态的检测规则。指标匹配规则会比较两个不同索引模式中的字段,当这些字段匹配时触发告警。如果你的威胁情报支持 Google Chrome 扩展的 ID 和版本,你可以创建一个指标匹配规则,当安装的 chrome 扩展 ID 和版本与已知恶意扩展匹配时触发告警。
以下是一个指标匹配规则的示例配置。指标索引字段名称会根据所使用的威胁情报平台有所不同。

这种方法的优点是每当新的已知恶意扩展列表发布或更新时,无需手动更新检测规则。一旦新的指标被添加到你的威胁情报索引中,你会立即收到告警。
试试看
威胁行为者会继续利用 Chrome 扩展来窃取有价值的信息和攻击系统。如果你无法看到工作站上安装的扩展,就无法保护用户免受这种攻击。借助 osquery 和 Elastic,你可以通过对浏览器扩展的可见性和告警管理,降低企业整体风险,且无需额外许可费用。
使用 Elastic Cloud的 14 天免费试用,自己试试看吧。
关于浏览器扩展如何在现实攻击中被利用的示例,请查看 Elastic Security Labs 的文章《Beyond the wail: deconstructing the BANSHEE infostealer》。
本文中描述的任何功能或特性的发布及时间安排均由 Elastic 全权决定。当前不可用的任何功能或特性,可能不会按时或根本不会交付。
原文:How to detect malicious browser extensions using Elastic | Elastic Blog