• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-02-29 17:13 Aet 隐藏边栏 |   抢沙发  14 
文章评分 1 次,平均分 5.0

关于sandbox相关

用途

  1. 进程隔离
    1. CEF采多进程架构,主要包括浏览器进程和渲染进程
    2. 沙盒机制将渲染进程与浏览器进程隔离开来,使得即使渲染进程中存在恶意代码或漏洞,也不会直接影响浏览器进程及宿主系统
  2. 权限限制
    1. 沙盒限制渲染进程的权限,防止其访问和修改系统的敏感资源,如文件系统、注册表、网络和设备等
    2. 渲染进程只能访问被允许的资源,从而降低潜在的安全风险
  3. 防止漏洞利用
    1. 通过沙盒机制,可以有效防止攻击者利用渲染进程中的漏洞执行特权操作或提升权限
    2. 即使存在零日漏洞,攻击者也难以突破沙盒的限制,进一步攻击系统
  4. 数据保护
    1. 沙盒机制保护用户数据,防止渲染进程未经授权访问和泄露用户敏感信息
    2. 浏览器中的每个标签页和插件运行在独立的沙盒中,隔离彼此的数据访问

技术

  1. CEF中的沙盒机制依赖于Chromium的沙盒架构,主要通过以下几个关键技术实现:

  2. 多进程架构:

    1. CEF使用多进程模型,将不同的浏览器组件运行在独立的进程中
    2. 主要包括浏览器进程、渲染进程、GPU进程、插件进程等
    3. 每个进程具有不同的职责和权限
  3. 操作系统级别的沙盒:

    1. CEF依赖操作系统提供的沙盒机制
    2. Windows上的Job ObjectTokenIntegrity LevelLinux上的NamespaceSeccompmacOS上的Seatbelt
    3. 通过操作系统提供的安全功能,对渲染进程的权限进行细粒度控制
  4. 进程间通信:

    1. 多进程架构需要各进程之间进行通信
    2. CEF使用ChromiumIPC机制实现进程间的消息传递和数据交换
    3. 通过IPC,浏览器进程与渲染进程可以安全地协同工作,同时确保渲染进程的沙盒隔离
  5. 权限模型:

    1. 每个进程根据其角色和功能分配不同的权限
    2. 渲染进程的权限最小化,仅限于渲染和执行JavaScript代码,不允许直接访问系统资源
    3. 浏览器进程则拥有更多的权限,负责管理和协调各个子进程的工作
  6. 安全策略:

    1. CEF实现了一系列安全策略,如内容安全策略(CSP)、跨域策略、同源策略等,限制渲染进程的行为和资源访问,防止恶意代码绕过沙盒机制

细节

  1. 后续研究源码实现

目标进程

  1. 渲染进程
    1. 渲染进程是主要的沙盒目标,因为它直接处理和执行来自网络的内容,包括 HTMLCSSJavaScript
    2. 渲染进程的权限被大幅度削减,通常不能直接访问文件系统、网络或设备
    3. 每个浏览器标签页或框架可能运行在单独的渲染进程中,确保即使一个标签页被攻破,其他标签页和系统依然安全
  2. 插件进程
    1. 插件进程用于运行浏览器插件,如 Flash 或其他类型的内容插件
      由于插件可能包含漏洞,也需要在沙盒中运行
    2. 每个插件运行在独立的沙盒进程中,防止其对浏览器和系统造成影响
    3. 限制插件进程的权限,确保它们只能访问必要的资源
  3. GPU进程
    1. GPU 进程处理与图形渲染相关的任务
      虽然 GPU 进程的沙盒限制通常不如渲染进程严格,但仍然需要一些限制以防止潜在的攻击
    2. GPU 进程在沙盒中运行,防止其对其他进程和系统资源的非法访问
  4. 网络进程
    1. 网络进程负责处理网络请求和数据传输
    2. 网络进程在沙盒中运行,确保即使网络数据包含恶意内容,也不会直接威胁系统安全

理解

  1. 就是现代操作系统提供了一些内置的机制和功能,用于实现进程隔离和权限限制,即沙盒能力
  2. CEFChromium 中,启用或禁用沙盒实际上是通过配置和设置来告诉操作系统,是否应对特定的子进程应用操作系统的沙盒能力

操作系统的沙盒机制

Windows

  1. 使用 Job Objects 限制进程的资源使用
  2. 使用 Integrity Levels 将进程置于低权限环境中
  3. 使用 AppContainer 将进程隔离

Linux

  1. 使用 Namespaces 隔离进程的文件系统、网络等资源
  2. 使用 Seccomp 限制系统调用

macOS

  1. 使用 Seatbelt Profiles 定义进程可以访问的资源和权限

关于wrap相关

  1. cef导出的是c风格的API,在wrap这一层这里,对这些api进行了封装,接入了cef的应用程序要使用cef的功能的话,只需要调用wrap里面封装好的函数和类
  2. 这样做的作用
    1. wrap层封装了 C API。提供了一套 C++ 风格的 API,使开发者能更方便使用 CEF 的功能
    2. 这层封装通常包括了对浏览器进程、渲染进程、V8 引擎等核心功能的 C++ 类和方法,使得开发者可以更直观和高效地编写代码

CefApp详解

概述

  1. 负责管理 CEF 应用程序的整个生命周期
    1. 在应用程序启动和结束的不同阶段,CefApp 类会触发相应的回调方法,供开发者处理相关的逻辑
  2. 在应用程序启动阶段,开发者可以通过继承 CefApp 类并重写其中的方法,来进行初始化和配置
  3. 负责管理 CEF 的进程,包括浏览器进程、渲染进程、插件进程等
    1. 通过重写 CefApp 的方法,可以对不同类型的进程进行定制化的管理
  4. 通过继承 CefApp 类并重写其中的方法,开发者可以实现自定义的功能
  5. 负责管理 CEF 应用程序所需的资源,包括内存、文件、图片等
    1. 通过 CefApp 类的方法,可以实现资源的加载、释放和管理
  6. 与操作系统进行交互,处理操作系统相关的事件和消息
    1. 例如,可以通过重写 CefApp 的方法来处理操作系统的窗口消息、键盘事件等
  7. 在多进程的架构下,CefApp 类负责协调不同进程之间的通信和协作
    1. 通过重写 CefApp 的方法,可以实现进程之间的消息传递和数据共享

OnBeforeCommandLineProcessing

  1. 提供在 CEFChromium 处理之前查看或修改命令行参数的机会
  2. 对于浏览器进程,process_type 值将为空
  3. 不要保留传递给此方法的 CefCommandLine 对象的引用
  4. cef_settings_t.command_line_args_disabled 值可用于以空的命令行对象开始
    1. 在调用此方法之前,将设置 CefSettings 中指定的任何等同于命令行参数的值
  5. 使用此方法修改非浏览器进程的命令行参数时要小心,因为这可能会导致未定义的行为,包括崩溃。

OnRegisterCustomSchemes

  1. 提供注册自定义方案的机会
    1. (自定义方案)是一种允许开发者注册自定义协议方案的机制
      这种机制允许开发者通过自定义的协议来访问和处理特定类型的资源,而不局限于常见的 HTTPHTTPS 等协议
    2. 通过自定义方案,开发者可以访问本地文件系统中的资源,而不需要通过 HTTP 或其他网络协议
    3. 开发者可以通过自定义方案来加载自定义的资源,例如内存中的数据、应用程序中的特定文件等
    4. 自定义方案可以用于实现特定功能,例如访问特定硬件设备、与其他应用程序进行通信等
  2. 不要保留对 registrar 对象的引用
    1. 此方法在每个进程的主线程上调用,并且注册的方案在所有进程中应该相同
  3. CEF 中,要实现 Custom Schemes
    1. 通过 CefSchemeRegistrar::AddCustomScheme 方法注册自定义方案
      这个过程通常在 CefApp 类的 OnRegisterCustomSchemes 方法中完成
    2. 通过 CefResourceHandler 类的派生类来处理对自定义方案的请求
      这个过程通常在自定义的 CefApp 类中实现

GetResourceBundleHandler

  1. 返回资源包事件的处理程序
    1. 如果cef_settings_t.pack_loading_disabledtrue,则必须返回处理程序
      如果没有返回处理程序,资源将从包文件加载
    2. 此方法由浏览器和渲染进程在多个线程上调用

GetBrowserProcessHandler

  1. 返回浏览器进程特定功能的处理程序
    1. 此方法在浏览器进程中的多个线程上调用

GetRenderProcessHandler

  1. 返回渲染进程特定功能的处理程序
    1. 此方法在渲染进程主线程上调用

CefClient详解

概述

  1. 负责处理与浏览器相关的各种事件,例如页面加载完成、页面标题变化、页面加载进度更新等
  2. 可以用于实现浏览器的各种功能,例如自定义右键菜单、处理鼠标事件、处理键盘事件等
  3. 开发者可以控制浏览器的行为,例如禁用或启用 JavaScript、禁用或启用图片加载、设置浏览器的缓存策略等
  4. 可以用于自定义浏览器的用户界面(UI),例如添加自定义工具栏、添加自定义菜单等
  5. 可以用于处理来自 JavaScript 的消息,例如通过 JavaScript 调用本地代码、在页面中执行特定的 JavaScript 代码等
  6. 开发者可以实现自定义的资源加载逻辑,例如加载本地文件、加载内存中的数据、拦截和修改网络请求等
  7. 提供了扩展浏览器功能的接口,开发者可以根据自己的需求来实现各种定制化的功能,并与浏览器进行交互

GetAudioHandler

  1. 返回音频渲染事件的处理程序

GetCommandHandler

  1. 返回命令的处理程序
    1. 如果没有提供处理程序,则将使用默认实现

GetContextMenuHandler

  1. 返回上下文菜单的处理程序
    1. 如果没有提供处理程序,则将使用默认实现
    2. 上下文菜单通常指的是在浏览器中右键单击时弹出的菜单,也称为右键菜单或上下文菜单

GetDialogHandler

  1. 返回对话框的处理程序
    1. 如果没有提供处理程序,则将使用默认实现

GetDisplayHandler

  1. 返回浏览器显示状态事件的处理程序

GetDownloadHandler

  1. 返回下载事件的处理程序
    1. 如果没有返回处理程序则不允许下载

GetDragHandler

  1. 返回拖动事件的处理程序

GetFindHandler

  1. 返回查找结果事件的处理程序

GetFocusHandler

  1. 返回焦点事件的处理程序

GetFrameHandler

  1. 返回与 CefFrame 生命周期相关的事件的处理程序
  2. 此方法将在 CefBrowser 创建期间调用一次,并且出于性能原因,结果将被缓存

GetPermissionHandler

  1. 返回权限请求的处理程序

GetJSDialogHandler

  1. 返回 JavaScript 对话框的处理程序
    1. 如果没有提供处理程序,则将使用默认实现

GetKeyboardHandler

  1. 返回键盘事件的处理程序

GetLifeSpanHandler

  1. 返回浏览器生命周期事件的处理程序

GetLoadHandler

  1. 返回浏览器加载状态事件的处理程序

GetPrintHandler

  1. 返回 Linux 上打印的处理程序
    1. 如果没有提供打印处理程序,则 Linux 平台将不支持打印

GetRenderHandler

  1. 返回屏幕外渲染事件的处理程序

GetRequestHandler

  1. 返回浏览器请求事件的处理程序

OnProcessMessageReceived

  1. 当从其他进程收到新消息时调用
    1. 如果消息已处理,则返回true,否则返回 false
  2. 在此回调之外保留对 message 的引用是安全的

View BrowserView Browser

view

  1. ViewUI 层级结构中的一个基本单元,用于显示和管理用户界面的一部分内容
  2. View 可以是按钮、标签、文本框、图像等可见的用户界面元素
  3. View 提供了处理用户输入事件、绘制界面元素、布局管理等功能

BrowserView

  1. BrowserView 是用于将 Browser 内容嵌入到应用程序的 UI 中的容器
  2. BrowserViewBrowser 的内容显示在应用程序的窗口中,并提供了与 Browser 交互的界面
  3. BrowserView 可以视作是一个可以显示 Web 内容的 UI 视图

Browser

  1. Browser 是一个完整的浏览器实例,用于加载和渲染 Web 内容,并提供与 Web 页面交互的功能
  2. Browser 负责管理一个或多个标签页(Tab),每个标签页对应一个独立的 Web 页面
    1. 每个 Tab 对应一个主框架(Main Frame),如果该 Tab 内有嵌入的 iframe,则还会有多个子框架
  3. Browser 提供了加载 URL、导航、执行 JavaScript、管理插件等功能

Frame

  1. Browser是一个完整的浏览器实例,包含一个或多个CefFrame
    1. 主框架是页面的主文档
    2. 其他框架则对应于嵌入的iframe
  2. 每个 CefFrame 对应于一个 HTML 文档或一个 iframe
    1. 浏览器中的主文档是一个 CefFrame,每个嵌入的 iframe 也是一个独立的 CefFrame
    2. iframeHTML 中的一种元素,用于在一个 HTML 文档中嵌入另一个 HTML 文档
    3. 它允许在同一个浏览器窗口中显示多个独立的 HTML 页面,每个页面可以来自不同的源
  3. iframe作用:
    1. 可以嵌入来自不同 URL 的内容,例如嵌入另一个网站的页面、嵌入广告、嵌入视频播放器等
    2. iframe 中的内容与主页面相互隔离,具有独立的上下文环境
      这意味着 iframe 中的 JavaScriptCSS 不会影响主页面,反之亦然
    3. 通过 iframe,你可以嵌入来自不同域的内容,而不必担心跨域限制
      (尽管跨域通信仍然受到限制,需要使用 postMessage 等方法进行安全的跨域通信)

关系

  1. ViewBrowserView
    1. BrowserView 是一个特化的 View,用于浏览器内容显示
  2. BrowserViewBrowser
    1. BrowserView 包含一个 CefBrowser 实例,负责将其内容呈现在 UI
  3. BrowserFrame
    1. CefBrowser 管理主框架和所有子框架(iframe

关系图示

  1. View:应用程序的用户界面容器
  2. BrowserView:显示浏览器内容的视图组件
  3. Browser:完整的浏览器实例,管理页面和框架
  4. Frame:表示 HTML 文档或 iframe 的框架

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-06-08
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享