Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序

admin 2025年1月15日14:08:46评论18 views字数 8154阅读27分10秒阅读模式

 

III. 说明

书接上回:Electron 应用安全测试基础 | Electron 框架介绍,我们已经了解了创建简单Electron应用程序的过程。本文将概述安装Electron应用程序的过程,并介绍检测操作系统中已安装Electron应用程序的基本步骤。

3.1. 安装应用程序

与在任何操作系统上安装应用程序类似,我们需要的是现有应用程序的可执行文件。在本节中,我们的重点是macOS。不过需要注意的是,安装过程在其他操作系统(如Windows或Linux)上并没有显著差异。

当我们点击之前生成的.dmg文件时,会弹出一个简单的窗口,其中显示的应用程序名称与在构建过程中package.json文件中“productName”参数所指定的名称完全一致。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

此外,在窗口的标题栏中,我们还可以看到应用程序的版本号,该版本号与我们在同一文件中“version”参数中输入的值一致。

假设我们已经安装了该应用程序,那么通常可以在系统的应用程序目录中找到它(例如,macOS的/Applications目录或Windows操作系统中的Program Files目录)。

需要注意的是,与Windows环境不同,Windows允许用户直接在Program Files中查看安装包的内容,而在macOS中,我们需要选择“显示包内容”才能查看已安装应用程序目录中的内容。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

3.2. 手动检测已安装的基于 Electron 的应用程序

正如我们所知,每个操作系统都有其特定的目录结构,用于存储新安装的应用程序。例如:

在 macOS 中,通常位于 /Applications 或 /Users/用户名/Applications 目录下。

在 Windows 中,可以在 Program FilesAppData 或 WindowsApp 中找到。

而在基于 Linux 的系统中,通常位于 /opt 或 /usr/share 目录下。

那么,当我们找到应用程序目录后,如何识别其中是否存在基于 Electron 框架的应用程序呢?简单来说,Electron 框架构建的应用程序具有一个独特的特征,即存在 .asar 格式的文件。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

Sample of .asar File on macOS

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

Sample of.asar File on Windows

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

Sample of.asar File on Linux-Based System (For Example: Ubuntu)

简而言之,.asar 文件是一个归档文件,其中包含了基于 Electron 的应用程序所需的所有 JavaScript、HTML、CSS、图像以及其他资源。本质上,它将运行应用程序所需的所有文件打包在一起(引用自 Electron 官方文档,这种格式还能缓解 Windows 上的长路径名问题,加快 require 操作,并在一定程度上隐藏源码以防止被简单查看)。

除此之外,还有其他格式可以帮助我们在操作系统中识别基于 Electron 的应用程序吗?确实有。其中包括:

macOS 系统中,“Frameworks” 目录内的 “Electron Framework.framework” 文件夹。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

macOS 系统中,通常位于 “Resources” 目录内的 “electron.icns”(图标资源)文件。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

在某些基于 Linux 的系统中,通常存在的 “LICENSE.electron.txt” 文件。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

package.json” 文件(不过,我们可能需要先检查其内容)。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

特定关键词搜索,可唯一表征Electron构建的应用程序中的配置,例如 “contextIsolation” 和 “nodeIntegration”

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

3.3 自动化方法

鉴于需要搜索的变量众多,并且单个主机内可能存在许多应用程序,因此在基本识别过程中可以采取的初步步骤是执行一些自动化操作。

3.3.1 macOS上Electron应用的自动检测

众所周知,macOS有以 .app 命名规则命名的目录(尽管不能严格称其为扩展名)。本质上,这些目录包含运行应用程序所需的所有文件和资源。

尽管这些是目录,但点击时操作系统会执行其中包含的程序。正如第3.1节所述,这些目录的内容也可以进一步探查。

由于macOS应用的资源通常位于 .app 目录中,因此我们可以使用 mdfind 命令来进行密集搜索以确定文件的存在。

mdfind 是macOS中的一个搜索命令,利用Spotlight搜索索引系统根据文件的元数据和内容来查找文件和目录。例如,如果我们想查找所有扩展名为 .png 的文件,可以在终端中运行命令 mdfind '.png',输出结果将显示系统上所有 .png 文件。

以下是一个简单的示例脚本,可以帮助用户在macOS上识别Electron应用程序:

import osimport subprocessdef get_app_name(app_path): return os.path.basename(app_path)def get_electron_version(filename): try: output = subprocess.check_output(f"strings '{filename}' | grep 'Chrome/' | grep -i Electron | grep -v '%s' | sort -u | cut -f 3 -d '/'", shell=True) return output.decode().strip() except subprocess.CalledProcessError: return Nonedef generate_github_link(version): return f"https://github.com/electron/electron/releases/tag/v{version}"def format_row(app_name, electron_version, filename): return f"{app_name:30s} {electron_version:20s} {filename}"def find_electron_apps(): try: apps = subprocess.check_output("mdfind 'kind:app'", shell=True).decode().splitlines() apps = sorted(set(apps)) print("_" * 100) print(format_row("App Name", "Electron Version", "File Name")) print("=" * 100) for app in apps: filename = os.path.join(app, "Contents/Frameworks/Electron Framework.framework/Electron Framework") if os.path.isfile(filename): app_name = get_app_name(app) electron_version = get_electron_version(filename) print(format_row(app_name, electron_version, filename)) print("n") print("=" * 60) print("App Name" + " " * 24 + "GitHub Link") print("=" * 60) for app in apps: filename = os.path.join(app, "Contents/Frameworks/Electron Framework.framework/Electron Framework") if os.path.isfile(filename): app_name = get_app_name(app) electron_version = get_electron_version(filename) github_link = generate_github_link(electron_version) if electron_version else "Not Found" print(f"{app_name:30s} {github_link}") except Exception as e: print(f"Error: {e}")if __name__ == "__main__": find_electron_apps()# As a note, this script is a simple port to Python (with additional information) from a bash script that made and improved by @CubicleApril. The original script can be seen at: https://gist.github.com/april/3da7c3720b0d9f3ee7dc9a95f623578d.# Note: In the final output section, there is a small addition regarding a link containing updated information about using Electron.# Repo: https://github.com/yokokho/Find-Electron-Apps-on-macOS

那么,这个脚本基本上是做什么的呢?简而言之,在获取macOS上已安装的应用程序列表后,该脚本将尝试定位 “Electron Framework.framework” 的存在。而对于用于构建该应用的Electron版本,脚本通过检查 “Electron Framework” 二进制文件来进行搜索。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

3.3.2. 在Windows上自动检测基于Electron的应用程序

与我们在macOS部分的解释类似,Windows上也有特定的目录,通常用于安装应用程序,这些目录包含运行应用程序所需的文件和资源。这些目录的例子包括 Program Files、AppData(包括诸如“Programs”这样的子目录)和 WindowApp。在某些情况下,应用程序也可能位于用户的目录中,例如 Downloads 或 Documents 目录,因为该应用程序可能是便携版应用程序。

需要强调的是,WindowApp 目录默认受到Windows的安全措施的限制,无法直接访问。要查看 WindowApp 内的目录列表,需要配置特定的权限。

鉴于这种情况,以下是一个简单的PowerShell脚本示例,旨在帮助用户识别在Windows上安装的基于Electron的应用程序:

function Is-ElectronApp { param($directory) Get-ChildItem -Path $directory -Filter "*.asar" -Recurse -ErrorAction SilentlyContinue | ForEach-Object { $appName = if ($_.FullName -like "*Program Files**") { $splitPath = (Split-Path -Path $_.Directory).Split('') $splitPath[2..($splitPath.Length - 3)] -join '' } elseif ($_.FullName -like "*AppDataLocalPrograms*" -or $_.FullName -like "*AppDataLocalLowPrograms*" -or $_.FullName -like "*AppDataRoamingPrograms*") { (Split-Path -Path $_.Directory).Split('')[6] } elseif ($_.FullName -like "*AppDataLocal*" -or $_.FullName -like "*AppDataLocalLow*" -or $_.FullName -like "*AppDataRoaming*") { (Split-Path -Path $_.Directory).Split('')[5] } elseif ($_.FullName -like "*Users$env:USERNAMEDesktop*" -or $_.FullName -like "*Users$env:USERNAMEDownloads*" -or $_.FullName -like "*Users$env:USERNAMEDocuments*") { (Split-Path -Path $_.Directory).Split('')[4] } else { Split-Path -Path $_.Directory } $appPath = $_.Directory [PSCustomObject]@{ AppName = $appName AppPath = $appPath } }}$drives = Get-PSDrive -PSProvider 'FileSystem'$directoriesToSearch = @("Program Files", "Program Files (x86)", "Users$env:USERNAMEAppDataLocal", "Users$env:USERNAMEAppDataLocalLow", "Users$env:USERNAMEAppDataRoaming", "Users$env:USERNAMEDesktop", "Users$env:USERNAMEDownloads", "Users$env:USERNAMEDocuments")$electronApps = foreach ($drive in $drives) { foreach ($directory in $directoriesToSearch) { $fullPath = Join-Path -Path $drive.Root -ChildPath $directory if (Test-Path -Path $fullPath) { Is-ElectronApp -directory $fullPath } }}if ($electronApps) { $electronApps | Format-Table -AutoSize} else { Write-Output " "Electron-based applications not found."}# Repo: https://github.com/yokokho/Find-Electron-Apps-on-Windows

总之,该脚本尝试定位Windows上的驱动器字母,然后继续搜索通常可以找到应用程序的常见路径(如 Program Files、AppData,以及一些用户目录,如 Desktop、Downloads 和 Documents)。

与macOS使用mdfind功能不同,在Windows中(根据我有限的知识),我们需要在脚本中手动定义特定的路径。虽然可能还有其他潜在路径,比如 WindowApp,但至少这可以作为识别Windows OS中基于Electron的应用程序存在的初步步骤。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

需要注意的是,我们可能会在输出中遇到重复的信息。这是因为我们使用了“.asar”作为搜索关键字,而在某个目录中可能存在多个“.asar”文件。此外,应用程序名称(AppName)的检索仍然基于目录名称,当用户使用与应用程序名称不同的目录名称时,这可能导致输出不准确。

3.3.3. 在Linux上自动检测基于Electron的应用程序

接下来,我们将进入自动检测话题的最后部分。基于Linux的系统也有专门的目录用于存储已安装的应用程序,如 /usr/share 或 /opt 目录。此外,用户还可能选择将应用程序安装在 /home 目录下(例如,在 Documents 目录中)。

从技术上讲,我们可以使用 locate 命令快速定位 .asar 文件或与Electron相关的其他文件。然而,需要注意的是,如果我们尚未更新 updatedb 数据库,结果可能不会是最优的。由于我们的目标是在低权限用户下执行脚本,因此我们选择不使用 locate 命令。

考虑到这种情况,我们尝试创建了一个简单的Python脚本,其流程大致与我们为Windows开发的脚本相同:

import osdef is_electron_app(directory): for file in os.listdir(directory): if file.endswith('.asar') or file == 'LICENSE.electron.txt': return True return Falsedef get_app_name(directory): split_directory = directory.split('/') if directory.startswith('/usr/share/'): if len(split_directory) > 3: return split_directory[3] elif directory.startswith('/opt/'): if len(split_directory) > 2: return split_directory[2] elif directory.startswith('/home/'): if len(split_directory) > 4: return split_directory[4] else: return os.path.basename(directory)def find_electron_apps(): directories_to_search = ['/opt', '/usr/share', '/home'] electron_apps = [] for directory in directories_to_search: for root, dirs, files in os.walk(directory): if is_electron_app(root): app_name = get_app_name(root) electron_apps.append((app_name, root)) dirs[:] = [] if electron_apps: print("_" * 100) print(f"{'App Name':30s} {'Location'}") print("=" * 100) for app_name, location in electron_apps: print(f"{app_name:30s} {location}") else: print("Electron-based applications not found.")if __name__ == "__main__": find_electron_apps()# Repo: https://github.com/yokokho/Find-Electron-Apps-on-Linux

总的来说,这个脚本搜索了常见的应用程序安装目录,如 /usr/share 或 /opt 以及用户可能选择安装应用程序的 /home 目录。基本上,这个脚本采用了与之前的 PowerShell 脚本类似的方法,通过遍历常见的目录来定位与 Electron 相关的文件。虽然它可能没有涵盖所有潜在的路径,但至少可以为在 Linux 环境中识别基于 Electron 的应用程序提供一个初步的步骤。

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序img

作为说明,应用程序名称(App Name)的确定仍然依赖于目录名称,如果用户使用与应用程序名称不同的目录名称,可能会导致不准确的输出。

好了,我们快接近这一部分的结束了。希望读者现在对基于 Electron 的应用程序有了基本的了解,包括安装过程和跨不同操作系统的检测方法。在下一部分,我们将尝试探索如何提取存储在 .asar 格式中的文件,并强调这个过程的重要性。

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。

原文始发于微信公众号(白帽子左一):Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月15日14:08:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序http://cn-sec.com/archives/3631737.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息