查看: 412|回复: 0

鸿蒙EDG Kit数据防泄漏内容感知拦截实践

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在企业移动办公场景里,数据流转边界正在变得模糊。客户经理在移动端处理高净值客户个人身份信息和未公开财报时,传统的数据防泄漏方案往往只能“一刀切”:要么禁用整个系统的剪贴板,要么在沙箱层面锁死文件分享。这种安全与效率的博弈,在 HarmonyOS 7.0(API 26)发布 Enterprise Data Guard Kit(EDG Kit)后有了更细粒度的解法。EDG Kit 虽然名字里有“数据守护”,但它不是简单授权开关,而是把能力下沉到内核、系统服务和应用框架层的立体防御网络,核心思路是从被动拦截升级为主动的内容感知和行为审计。我们结合某大型银行企业级移动办公基座项目中的实践,拆解这套基于内容感知的数据防泄漏精细化管控方案。

一、为什么需要“内容感知”

传统 DLP 大多看应用包名、文件扩展名、MimeType,无法识别“剪贴板里那段文本是不是机密数据”。EDG Kit 引入端侧内容感知引擎,数据流转时不仅知道是哪个应用在操作,还会分析它操作的内容本身。系统把纯文本、位图或二进制流交给底层轻量级 AI 模型或高并发正则引擎,在毫秒级返回命中类型、偏移量和置信度。更关键的是,内容感知在设备端 NPU/CPU 隔离环境中闭环完成,不会把敏感内容上传云端。这解决了企业最担心的“审计过程本身泄露数据”的问题。

二、EDG Kit 防护管线的关键能力

我们实际用得最多的是四层防护:内存、剪贴板、文件流、渲染。

内存层,EDG Kit 提供 secureMemoryAlloc 申请受硬件 MMU 隔离的内存区域,lockMemory 可以把加密密钥、解密后的明文凭证锁定在物理内存中,禁止 Swap 到磁盘,避免内存转储和跨进程嗅探。

剪贴板层,dlpPermission 新接口注册行为审计过滤管道。用户点击复制后,数据在真正写入系统剪贴板内存池之前,会被强制重定向到我们的 interceptor 回调。回调内调用内容感知引擎;命中敏感特征就返回 DENY,让底层丢弃该次更新并做安全擦除。

文件流层,securityShare.setFileSharePolicy 可以为沙箱内文件设置条件分享策略:读取该文件流时必须经过动态内容感知,或者分享给未签署企业证书的应用时自动做透明加密,转换为 DLP File Format,避免文件被带出沙箱后明文泄露。

渲染层,除了 window.setWindowPrivacyMode(true) 直接黑屏外,API 26 还支持 setWatermark 在系统底层 Surface 渲染缓冲区内嵌入盲水印。水印是在 GPU 合成阶段打上去的,截屏、录屏都会带上,Hook 上层截图 API 没法绕过。

三、工程结构和权限准备

在接入前要确认应用有 AGC 后台申请的企业 MDM 签名或 DLP 专属权限 ohos.permission.ENTERPRISE_MANAGE_DLP。测试阶段需要在 Profile 中打入权限。否则,底层注册回调会直接抛异常。

我们的工程采用分层设计,方便策略调度和审计日志归集:

entry/src/main/ets/ 下分为 constants(规则特征库)、services(EDG Kit 管理器、内容感知引擎、剪贴板审计、文件流风控、显示风控)、views(安全加固的业务组件)、utils(审计日志上报)。核心服务包括 EdgDlpManager、ContentAwarenessEngine、ClipboardAuditService、FileStreamControlService、DisplayRiskControlService。

四、核心代码实现

下面这段代码是 EdgDlpManager 的典型实现,负责在 Ability 创建早期注册底层剪贴板拦截器和显示风控水印。这里用了单例模式,避免重复注册回调引发策略冲突。
  1. // EdgDlpManager.ets
  2. import { dlpPermission } from '@ohos.security.dlpPermission';
  3. import { enterpriseDataGuard } from '@ohos.enterpriseDataGuard';
  4. import { promptAction } from '@ohos.arkui.UIContext';
  5. export class EdgDlpManager {
  6.   private static instance: EdgDlpManager;
  7.   private isAuditNetworkActive: boolean = false;
  8.   public static getInstance(): EdgDlpManager {
  9.     if (!EdgDlpManager.instance) {
  10.       EdgDlpManager.instance = new EdgDlpManager();
  11.     }
  12.     return EdgDlpManager.instance;
  13.   }
  14.   public async activateAuditNetwork(): Promise<void> {
  15.     if (this.isAuditNetworkActive) return;
  16.     try {
  17.       await this.setupClipboardAuditPipeline();
  18.       await this.setupDisplayRiskControl();
  19.       this.isAuditNetworkActive = true;
  20.     } catch (error) {
  21.       console.error('EDG_Manager', JSON.stringify(error));
  22.       // 生产环境建议此处触发 Fail-Safe,清理缓存并退出进程
  23.     }
  24.   }
  25.   private setupClipboardAuditPipeline(): Promise<void> {
  26.     return new Promise((resolve) => {
  27.       dlpPermission.registerClipboardInterceptor({
  28.         onWriteEvent: async (clipboardData) => {
  29.           const textContent = clipboardData.getPlainText();
  30.           if (!textContent || textContent.trim().length === 0) {
  31.             return dlpPermission.InterceptorResult.ALLOW;
  32.           }
  33.           const hasSensitive = await this.analyzeText(textContent);
  34.           if (hasSensitive) {
  35.             promptAction.showToast({ message: '企业级风控:检测到敏感内容,非授权操作已被阻断' });
  36.             return dlpPermission.InterceptorResult.DENY;
  37.           }
  38.           return dlpPermission.InterceptorResult.ALLOW;
  39.         }
  40.       });
  41.       resolve();
  42.     });
  43.   }
  44.   private async analyzeText(text: string): Promise<boolean> {
  45.     // 实际应调用 ContentAwarenessEngine,这里只作示意
  46.     return text.includes('内部机密') || text.includes('Q3财报未公开');
  47.   }
  48.   private async setupDisplayRiskControl(): Promise<void> {
  49.     const watermarkConfig = {
  50.       text: `工号:${'EMP001'} 时间戳:${Date.now()}`,
  51.       opacity: 0.03,
  52.       angle: -45,
  53.       density: 3
  54.     };
  55.     await enterpriseDataGuard.enableDisplayRiskControl(true, watermarkConfig);
  56.   }
  57. }
复制代码

这里有几个值得注意的细节。

第一,registerClipboardInterceptor 不是“事后监听器”,而是阻塞式接管。复制动作触发后,UI 主线程会短暂挂起,等待回调返回 ALLOW 或 DENY。回调里不要做耗时操作,否则用户能感知到复制卡顿。空数据、纯二进制非敏感数据应直接放行,不送给 NPU 计算。

第二,水印配置中 opacity 为 0.03,肉眼几乎不可见,但截屏后每一小块图片仍然带有工号和时间戳信息。angle 设成 -45,可以提高后期裁剪抹除的难度。density 设成 3,确保只截一个角落也能覆盖到完整水印。

第三,针对文件流加密,我们使用 securityShare.setFileSharePolicy 对指定 URI 设置策略,导出到不合规应用时自动转成 DLP 加密格式。但这个能力需要企业证书环境配合,目标应用没有对应权限时无法解密。

五、遇到过的坑和调优建议

在实际接入中,最常遇到的坑是权限未生效。EDG Kit 的底层接口不像普通 SDK 那样调用失败只返回错误码,某些接口在无 MDM 授权时直接抛异常。建议在 EntryAbility 的 onCreate 阶段就执行初始化,并在异常捕获里判断错误码,不要等到用户操作时才暴露。

其次,内容感知引擎的初始化很耗时。initializeEngine 会把正则表达式和语义树下发到 NPU/CPU 编译预热,冷启动阶段调一次即可,不要频繁重建。我们会在 ContentAwarenessEngine 内部维护单例,并处理并发限流。如果多个业务页面同时触发分析,请求会排队,避免底层算力过载导致系统卡顿。

另外,DlpPolicyConstants 中维护的敏感规则要区分静态正则和动态语义。像身份证号、手机号、银行卡号适合用正则匹配;而“未公开财报关键词”“项目代号”这类模糊语义,正则容易漏报,需要靠端侧模型或更复杂的上下文规则。实现时我们保留了 hitType 和 confidenceScore,便于后续 SOC 系统分级处理。

六、小结

HarmonyOS 7.0 EDG Kit 真正的价值在于把内容感知嵌入到了数据流转的关键路径上。复制、分享、截屏、文件导出这些看似普通的行为,在底层都变成可以被实时审计和阻断的信号。应用层代码不需要把每个页面都改造成安全容器,只要在系统服务层挂好拦截器,就能获得接近系统级的数据防泄漏能力。对于金融机构、政务办公等高敏感场景,这种基于内容感知的精细化管控明显优于传统 DLP 的完全禁用/完全放行。

以上是我们在 EDG Kit 生产接入中的部分经验。实际部署时还需要结合企业自己的审计日志平台、MDM 下发策略和密钥管理体系。鸿蒙生态的这套底层数据守护思路,给企业移动办公安全提供了更细颗粒度的选择。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-7 18:29 , Processed in 0.027650 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部