在这里插入图片描述

1 -> 概述

随着移动终端安全威胁日益复杂化,终端检测与响应(Endpoint Detection and Response,EDR)类应用在系统安全防护体系中的地位愈发重要。HarmonyOS 6.0在Device Security Kit(设备安全服务)中新增了**病毒防护服务管理(VirusProtectionServiceManager)**场景,这是鸿蒙安全能力矩阵的一次重要扩展。

在此之前,Device Security Kit已覆盖应用设备状态检测、安全检测、可信应用服务、数字盾服务、业务风险检测、安全审计、防窥保护和反诈选择器等多个安全场景。病毒防护服务管理场景的加入,使得系统安全能力从"系统级防护"向"第三方安全服务生态协同"迈进了一大步。

该场景提供了三个核心能力:应用向设备提交自身软件信息查询设备中防病毒软件信息列表启停设备自带的安全防护服务。这意味着鸿蒙系统不仅在底层构建了星盾安全架构,还通过开放标准化的病毒防护服务管理接口(C API),让EDR应用能够真正融入系统安全体系协同工作,为用户提供多层次、可管理、可联动的设备安全防护体验。

本文将从场景设计、API使用细则到实际代码实现,对这一新增能力进行详细解析。

2 -> 场景功能详解

病毒防护服务管理能力目前主要在PC/2in1设备上提供支持,系统能力标识为SystemCapability.Security.SecurityAntivirus,起始版本为6.0.0(20)。

2.1 -> 应用向设备提交自身软件信息

这一能力本质上是建立一套安全应用注册与信息同步机制。第三方EDR应用可以通过API向HarmonyOS安全防护服务注册自己,并定期更新自身状态信息。

注册和信息更新主要解决两个问题:

  • 身份可信性:只有获得ohos.permission.REGISTER_ANTIVIRUS权限的应用才能注册为防病毒应用,确保接入的安全应用经过了系统审核。
  • 状态可感知:系统需要通过注册应用上报的信息,知道当前有哪些EDR应用在运行、版本是否最新、防护开关是否开启等。

EDR应用注册后,系统会将此类应用纳入统一的安全服务管理体系。当用户或管理员需要查看设备安全状态时,可以获得完整的安全防护视图——包括系统自带防护和第三方EDR应用状态。

2.2 -> 查询设备中防病毒软件信息列表

查询能力面向两类场景,对应两类不同角色的应用:

(1)零信任应用查询所有三方EDR注册信息

零信任安全架构的核心是"永不信任,始终验证"。在此架构下,安全态势感知应用需要知道设备上究竟有哪些安全防护措施在工作,才能做出准确的信任评估。通过HMS_SecurityAntivirus_QueryAntivirus接口(需ohos.permission.MANAGE_ANTIVIRUS权限),零信任应用可以获取设备上所有已注册的第三方EDR应用清单,包括每个应用的包名、版本号、防护开关状态等信息。

(2)MDM应用查询系统防病毒功能状态

在企业设备管理场景中,MDM应用需要监管所有用户的设备安全状态。HMS_SecurityAntivirus_QueryPreinstalledAntivirus接口专门面向MDM应用设计,可以查询所有用户的系统防病毒功能状态(需ohos.permission.MANAGE_PREINSTALLED_ANTIVIRUS权限)。

2.3 -> 启停设备自带的安全防护服务

设备自带的安全防护服务是指HarmonyOS系统预置的内置防病毒能力。这一能力的开放主要面向企业设备管理场景

将启停控制权开放给MDM应用,核心价值在于:

  • 统一策略管控:企业IT管理员可以根据安全策略,统一控制所有终端设备的系统防病毒功能状态。例如,在安装了更完善的企业级EDR方案的设备上,可以关闭系统内置功能以避免资源重复和策略冲突;在需要基础的"最小安全基线"保障的场景下,则确保系统内置防护始终开启。
  • 分用户精准管理:鸿蒙系统支持多用户场景(如平板设备上的多用户空间)。EnablePreinstalledAntivirusByAccountDisablePreinstalledAntivirusByAccount接口允许MDM应用针对特定用户ID进行精准控制。

2.4 -> 能力全景梳理

为便于整体把握,以下按照常用场景分类梳理各接口的定位:

  • EDR应用的自我管理(需ohos.permission.REGISTER_ANTIVIRUS
    • RegisterAntivirus:初次注册
    • UpdateAntivirus:更新自身信息(版本号、开关状态等)
    • UnregisterAntivirus:注销
  • 零信任应用的态势感知(需ohos.permission.MANAGE_ANTIVIRUS
    • QueryAntivirus:查询所有已注册的三方EDR应用列表
  • MDM应用的设备管控(需ohos.permission.MANAGE_PREINSTALLED_ANTIVIRUS
    • QueryPreinstalledAntivirus:查询系统防病毒功能状态(所有用户)
    • EnablePreinstalledAntivirus / DisablePreinstalledAntivirus:启停所有用户的防病毒功能
    • EnablePreinstalledAntivirusByAccount / DisablePreinstalledAntivirusByAccount:针对特定用户进行启停控制

3 -> 核心数据结构与枚举

3.1 -> SecurityAntivirus_Antivirus结构体

该结构体用于承载EDR应用的核心信息,是注册、更新和查询操作中传递信息的基本单位,包含以下字段:

  • 包名(bundleName):应用的唯一标识,用于系统的身份识别和权限校验。
  • 当前版本号:便于系统检测EDR应用的更新状态。
  • 上次更新时间:记录信息最后更新的时间戳。
  • 病毒防护开关状态:表示该EDR应用的防护功能是否处于启用状态。
  • 用户ID:在多用户设备上标识所属用户。

3.2 -> 错误码说明

返回的错误码设计较为精细,便于调用方针对性处理:

  • 0 (SECURITY_ANTIVIRUS_SUCCESS):接口调用成功。
  • 201 (SECURITY_ANTIVIRUS_PERMISSION_NOT_GRANTED):权限校验失败,通常是因为调用方未声明必需的权限(如ohos.permission.REGISTER_ANTIVIRUS)。
  • 1019900001 (SECURITY_ANTIVIRUS_PARAM_INVALID):传入参数不符合规范,例如空指针或结构体字段格式错误。
  • 1019900002 (SECURITY_ANTIVIRUS_NO_REGISTER):当前应用未在病毒防护系统中注册,常见于执行更新操作时尚未完成注册。
  • 1019900003 (SECURITY_ANTIVIRUS_INNER_ERROR):系统服务内部发生异常,需要重试或检查系统状态。

4 -> 接口详解与使用步骤

在HarmonyOS NEXT应用开发环境中使用病毒防护服务管理能力,建议按以下步骤完成接入。

4.1 -> 开发环境准备

module.json5中声明所需权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.REGISTER_ANTIVIRUS",
        "reason": "$string:antivirus_register_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.MANAGE_ANTIVIRUS",
        "reason": "$string:antivirus_query_reason"
      },
      {
        "name": "ohos.permission.MANAGE_PREINSTALLED_ANTIVIRUS",
        "reason": "$string:mdm_antivirus_reason"
      }
    ]
  }
}

此外,需要在CMakeLists.txt中链接NDK库:

target_link_libraries(entry PUBLIC libsecurityantivirus_ndk.z.so)

在源文件中引入头文件:

#include "security_antivirus.h"

4.2 -> EDR应用的注册与更新

对于第三方EDR应用,标准接入流程如下:

第一步:注册

在应用初始化阶段(如Ability启动时),调用HMS_SecurityAntivirus_RegisterAntivirus向系统注册。

#include "security_antivirus.h"
#include <stdio.h>

void RegisterMyAntivirus(const char* bundleName) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_RegisterAntivirus(bundleName);
    switch (result) {
        case SECURITY_ANTIVIRUS_SUCCESS:
            printf("EDR应用注册成功: %s\n", bundleName);
            break;
        case SECURITY_ANTIVIRUS_PERMISSION_NOT_GRANTED:
            printf("权限不足,请检查ohos.permission.REGISTER_ANTIVIRUS权限\n");
            break;
        case SECURITY_ANTIVIRUS_PARAM_INVALID:
            printf("包名参数无效\n");
            break;
        case SECURITY_ANTIVIRUS_INNER_ERROR:
            printf("系统内部错误,请稍后重试\n");
            break;
        default:
            printf("未知错误码: %d\n", result);
            break;
    }
}

注册成功后,系统会将此EDR应用纳入安全管理体系,后续查询操作可以检索到该应用的信息。

第二步:定期更新信息

随着应用版本升级或用户操作(如在应用内开启/关闭防护开关),应及时调用HMS_SecurityAntivirus_UpdateAntivirus同步状态。

void UpdateMyAntivirusInfo(const char* bundleName, 
                           const char* version, 
                           int64_t lastUpdateTime, 
                           bool isEnabled, 
                           int32_t userId) {
    SecurityAntivirus_Antivirus antivirusInfo;
    antivirusInfo.bundleName = bundleName;
    antivirusInfo.version = version;
    antivirusInfo.lastUpdateTime = lastUpdateTime;
    antivirusInfo.isEnabled = isEnabled;
    antivirusInfo.userId = userId;
    
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_UpdateAntivirus(&antivirusInfo);
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("EDR应用信息更新成功\n");
    } else if (result == SECURITY_ANTIVIRUS_NO_REGISTER) {
        printf("应用尚未注册,请先调用RegisterAntivirus\n");
    } else {
        printf("更新失败,错误码: %d\n", result);
    }
}

常见触发更新信息的场景包括:

  • 应用版本升级(version字段变化)
  • 用户在应用内开启/关闭病毒防护开关(isEnabled字段变化)
  • 应用定期上报自身状态(lastUpdateTime定期更新)

第三步:注销

当EDR应用被卸载时,系统会自动处理资源释放。但如果应用需要在运行时主动退出防病毒服务场景,可以调用HMS_SecurityAntivirus_UnregisterAntivirus主动从系统中注销。

void UnregisterMyAntivirus(const char* bundleName) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_UnregisterAntivirus(bundleName);
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("EDR应用已从病毒防护系统注销\n");
    }
}

4.3 -> 查询三方防病毒软件信息

零信任管理类应用可以通过查询接口获取设备上所有已注册的第三方EDR应用状态,作为业务风险评估的依据。

#include <stdlib.h>

void QueryAllAntivirusApps(void) {
    SecurityAntivirus_Antivirus** list = NULL;
    uint32_t length = 0;
    
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_QueryAntivirus(list, &length);
    if (result == SECURITY_ANTIVIRUS_PERMISSION_NOT_GRANTED) {
        printf("权限不足,请检查ohos.permission.MANAGE_ANTIVIRUS权限\n");
        return;
    }
    
    if (result != SECURITY_ANTIVIRUS_SUCCESS) {
        printf("查询失败,错误码: %d\n", result);
        return;
    }
    
    // 遍历EDR应用列表
    for (uint32_t i = 0; i < length; i++) {
        SecurityAntivirus_Antivirus* app = list[i];
        if (app == NULL) continue;
        
        printf("应用 %d:\n", i + 1);
        printf("  包名: %s\n", app->bundleName);
        printf("  版本: %s\n", app->version);
        printf("  最后更新: %lld\n", app->lastUpdateTime);
        printf("  防护状态: %s\n", app->isEnabled ? "已启用" : "已停用");
        printf("  用户ID: %d\n", app->userId);
        printf("\n");
    }
    
    // 释放资源(注意:list的内存管理遵循NDK约定)
    // 参照官方文档中关于内存释放的具体要求
}

在实际业务中,零信任应用可以根据查询结果动态调整信任策略。例如:

  • 检测到关键EDR应用长期未更新(lastUpdateTime过旧),可降低设备信任等级。
  • 发现所有EDR应用防护开关均处于关闭状态时,可向用户发出安全提醒。

4.4 -> MDM应用启停设备自带安全防护服务

MDM类应用通过以下接口实现对系统防病毒功能的管控:

按用户精准控制

适用于多用户设备场景(如企业共享平板),管理员可以根据不同用户身份或部门执行差异化安全策略。

#include <inttypes.h>

void EnableAntivirusForUser(int32_t accountId) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_EnablePreinstalledAntivirusByAccount(accountId);
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("用户 %d 的系统防病毒功能已启用\n", accountId);
    } else if (result == SECURITY_ANTIVIRUS_PERMISSION_NOT_GRANTED) {
        printf("权限不足,请检查ohos.permission.MANAGE_PREINSTALLED_ANTIVIRUS权限\n");
    } else {
        printf("启用失败,错误码: %d\n", result);
    }
}

void DisableAntivirusForUser(int32_t accountId) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_DisablePreinstalledAntivirusByAccount(accountId);
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("用户 %d 的系统防病毒功能已禁用\n", accountId);
    }
}

全局控制(影响设备上的所有用户)

void EnableAntivirusForAllUsers(void) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_EnablePreinstalledAntivirus();
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("全部用户的系统防病毒功能已启用\n");
    }
}

void DisableAntivirusForAllUsers(void) {
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_DisablePreinstalledAntivirus();
    if (result == SECURITY_ANTIVIRUS_SUCCESS) {
        printf("全部用户的系统防病毒功能已禁用\n");
    }
}

查询系统防病毒状态

void QueryPreinstalledAntivirusStatus(void) {
    SecurityAntivirus_Antivirus** list = NULL;
    uint32_t length = 0;
    
    SecurityAntivirus_ErrCode result = HMS_SecurityAntivirus_QueryPreinstalledAntivirus(list, &length);
    if (result != SECURITY_ANTIVIRUS_SUCCESS) {
        printf("查询失败,错误码: %d\n", result);
        return;
    }
    
    for (uint32_t i = 0; i < length; i++) {
        SecurityAntivirus_Antivirus* status = list[i];
        printf("用户 %d: 系统防病毒功能状态 = %s\n", 
               status->userId, 
               status->isEnabled ? "已启用" : "已停用");
    }
}

4.5 -> 完整使用示例:集成上述能力的EDR应用

在实际开发中,EDR类应用可以将注册、更新、注销等操作有机整合。以下是一个简化的生命周期管理示例:

// 应用启动时的初始化逻辑(示例)
void OnApplicationStart(const char* bundleName) {
    // 1. 向系统注册自身
    RegisterMyAntivirus(bundleName);
    
    // 2. 同步初始状态信息
    UpdateMyAntivirusInfo(
        bundleName,           // 包名
        "3.2.1",              // 当前版本号
        GetCurrentTimestamp(),// 当前时间戳
        true,                 // 防护开关状态(假设已开启)
        100                   // 当前用户ID
    );
    
    // 3. 注册信息变更监听(如用户在应用内切换防护状态)
    SubscribeToSettingsChange([](bool newEnabled) {
        UpdateMyAntivirusInfo(
            bundleName,
            "3.2.1",
            GetCurrentTimestamp(),
            newEnabled,
            100
        );
    });
}

// 应用退出时的清理逻辑
void OnApplicationExit(const char* bundleName) {
    UnregisterMyAntivirus(bundleName);
}

5 -> 应用场景剖析

5.1 -> 企业设备管理

企业IT管理员可以通过定制MDM应用,实现终端安全策略的统一配置。例如:

  • 对研发部门设备强制启用系统防病毒功能,设定最低安全基线。
  • 对安装了企业自研EDR方案的设备,选择关闭系统内置功能,避免双引擎带来的性能损耗和告警冗余。
  • 针对不同用户空间(如"工作空间"和"个人空间")执行不同的安全策略组合——系统防护全量开启,第三方EDR按需启用。

EnablePreinstalledAntivirusByAccountDisablePreinstalledAntivirusByAccount接口的存在,使这种精细化管控成为可能。

5.2 -> 零信任安全架构落地

零信任安全的核心原则之一就是持续验证设备安全状态。通过查询接口,零信任应用可以实时获取设备上已注册的EDR应用列表和各自防护开关状态,结合其他安全检测结果(如系统完整性检测、恶意网址检测等),做出综合的信任评分。

以移动支付类应用为例,在发起大额交易前可以:

  1. 检查系统完整性检测结果——设备是否被篡改或越狱。
  2. 查询当前系统防病毒功能状态。
  3. 查询所有三方EDR应用的防护状态。
  4. 综合判断设备环境是否安全,根据风险等级决定是否允许交易、是否强制进行额外身份验证。

这种多维度安全评估机制能够有效防范黑产团队通过越狱设备、篡改系统或植入恶意软件发起的攻击。

5.3 -> 安全应用生态协同

此能力的开放还为EDR应用之间的生态协同提供了基础设施。鸿蒙系统不再是一个仅面向用户提供安全功能终端的平台,而是构建了一个可被治理、可被感知、可被联动的企业级安全防护底座。EDR应用、零信任应用和MDM应用三方协同,形成了从单点防护到全局治理的完整闭环。

6 -> 注意事项

使用病毒防护服务管理能力时,需注意以下几点:

  1. 权限声明:必须在module.json5中明确声明相应权限,不同操作所需的权限不同(REGISTER_ANTIVIRUS / MANAGE_ANTIVIRUS / MANAGE_PREINSTALLED_ANTIVIRUS),系统会进行严格的权限校验。任何缺失或越权调用都将收到SECURITY_ANTIVIRUS_PERMISSION_NOT_GRANTED错误。

  2. 先注册后更新:调用UpdateAntivirus之前必须先完成注册,否则会返回SECURITY_ANTIVIRUS_NO_REGISTER错误。

  3. 信息同步频率:建议在状态变化时主动调用更新接口,不必频繁无意义地刷新;但lastUpdateTime字段可以作为系统判断EDR应用是否"活跃"的参考依据。

  4. 设备支持范围:病毒防护服务管理能力当前主要在PC/2in1设备上提供支持,具体设备限制请参考官方文档。

  5. 内存管理:查询操作返回的列表涉及内存分配,务必按照NDK开发规范正确释放内存资源,避免内存泄漏。

  6. 错误重试机制:对于SECURITY_ANTIVIRUS_INNER_ERROR等临时性错误,建议实现指数退避重试策略,避免因系统服务暂时繁忙而导致功能异常。

7 -> 总结

鸿蒙6.0 Device Security Kit新增的病毒防护服务管理场景,标志着鸿蒙安全能力迈入了生态协同的新阶段。

从技术架构上看,这一能力的设计体现了三个关键考量:

第一,标准先行。 通过C API的方式向第三方EDR应用开放接入入口,同时以精细化的权限体系(REGISTER_ANTIVIRUS、MANAGE_ANTIVIRUS、MANAGE_PREINSTALLED_ANTIVIRUS)确保接入方身份可信。开发者无需关心底层实现细节,只需调用标准接口即可完成安全应用的身份注册与信息上报。

第二,角色分离。 EDR应用、零信任应用、MDM应用在这一体系中有各自清晰的定位和职责边界。EDR应用负责自我注册和信息上报,零信任应用负责态势感知和风险评估,MDM应用负责全局策略下发与执行。这种职责分离既保证了体系的灵活性,也符合企业安全管理的合规要求。

第三,企业级设计。 多用户支持、按账户启停、全局管控等能力的开放,使这一特性天然适用于企业设备管理场景。无论是教育平板的分用户管控、金融柜台的终端安全基线强控,还是政企设备的安全策略统一分发,都能找到对应的接口支持。

与Device Security Kit中其他安全能力(如系统完整性检测、恶意网址检测等)相比,病毒防护服务管理解决的不是"具体威胁检测"的问题,而是"安全能力如何协同"的问题。它处在鸿蒙安全体系的一个承上启下的位置——向下感知所有活跃的EDR应用状态,向上为零信任策略决策层提供数据输入,向外为MDM管理层提供控制出口。

对于鸿蒙开发者而言,精确理解这一能力的设计逻辑和使用规范,可以为应用的安全合规设计提供新的技术思路。无论是希望将产品接入鸿蒙安全体系的EDR厂商,还是正在构建零信任架构的安全团队,病毒防护服务管理场景都值得深入关注。


感谢各位大佬支持!!!

互三啦!!!
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐