52 / 52 安全检测、响应与重构

第 52 课:综合案例:写一份企业安全评估报告

# 第 52 课:综合案例:写一份企业安全评估报告

免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。

本课是整套教程的最终交付练习:把前 50 课学到的源码阅读、风险识别、检测工程、加固设计和应急思路,整理成一份企业能读懂、能落地、能安排整改的安全评估报告。报告不是把源码贴一遍,而是把源码证据转成业务语言:有什么风险、影响什么资产、怎么发现、怎么整改、谁负责、什么时候完成。

第 52 课:综合案例:写一份企业安全评估报告(配图)

# 1. 报告写作目标

企业读者通常不关心某个函数写了多少行,他们更关心:

企业问题 报告要回答
这个项目总体风险有多高 给出整体风险等级和关键原因
哪些模块最危险 按凭据、驱动、注入、持久化、隐私采集等分类
有哪些证据 给出源码文件、函数、行号和行为说明
如何检测 给出主机、网络、身份、资产侧检测点
如何整改 给出删除、禁用、重构、加固和验证步骤
谁来负责 按研发、安全、运维、合规分工

# 2. 报告结构

2. 报告结构(配图)

建议报告按下面结构组织:

  1. 项目背景和评估边界。
  2. 源码范围和目录结构。
  3. 架构概览和数据流。
  4. 高风险能力清单。
  5. 风险分级矩阵。
  6. 重点风险卡片。
  7. 企业检测建议。
  8. 整改路线图。
  9. 应急响应建议。
  10. 附录:源码证据表、图片、术语解释。

报告正文要少用“这个函数很危险”这种笼统说法,改成“该函数接收远程命令后写入注册表 Run 项,可能造成开机自启动,应在 EDR 中监控对应注册表路径和父进程”。

# 3. 源码范围写法

报告开头要先说明你看了哪些源码,哪些没有覆盖。示例:

范围 内容
主控端 主控\Quick,包括网络服务、界面分发、功能窗口
通信库 主插件\HPSocket,包括 TCP/UDP、心跳、包头、缓冲区
主插件 上线、登录、文件、注册表、启动、终端、屏幕、音频、代理、注入、驱动、解密数据
专栏资料 lessons 目录中的源码解读和图解
不覆盖项 未对二进制样本做动态运行验证,不提供攻击复现步骤

依赖说明: 报告中要把第三方库和系统接口写成“证据链”而不是附件清单:HPSocket 解释通信和心跳,GDI/JPEG/zlib/x264/libyuv 解释视觉采集链,DirectShow/Xvid 解释摄像头链,WASAPI/waveIn/G.729 解释音频链,SQLite/OpenSSL/cJSON/base64/DPAPI 解释凭据读取链,MemoryModule/yapi 解释内存加载和跨位数风险。这样企业读者能看到每个库在风险里的实际作用。

# 4. 风险分级矩阵

4. 风险分级矩阵(配图)

建议使用四级风险:

等级 判断条件 代表能力 处置时限
严重 可能导致凭据泄露、内核级控制、进程注入、远程命令执行 驱动插件、解密数据、注入管理、远程终端 立即处理
可造成持久化、敏感文件操作、横向访问、隐私采集 启动管理、文件管理、代理映射、摄像头/音频 3 天内
存在隐私影响、弱协议、代码质量问题或检测不足 屏幕采集、协议弱加密、资源释放问题 7 天内
文档、命名、可维护性、低影响缺陷 注释缺失、错误信息不统一 排期处理

分级时不要只看“功能名称”,要看影响范围、触发条件、是否需要权限、是否能被检测、是否会影响账号和关键资产。

# 5. 风险卡片模板

5. 风险卡片模板(配图)

每个重点风险建议写成独立卡片。模板如下:

字段 写法
风险编号 R-001
风险标题 简短描述,例如“浏览器凭据读取能力”
风险等级 严重/高/中/低
影响范围 主机、账号、网络、隐私、业务系统
源码证据 文件、函数、行号、关键代码
行为说明 用防御语言解释代码做了什么
检测线索 API、文件、注册表、网络、日志字段
整改建议 删除、禁用、加固、替换设计
验证方式 如何确认整改完成
责任方 研发、安全、运维、平台团队

# 6. 风险卡片示例一:凭据读取

// 源码位置:主插件\解密数据\解密数据\GetBrowserInfo.cpp,约第 441-465 行
bool GetBrowserInfo::GetMasterKey(DATA_BLOB* pDatab)
{
    LPSTR encryptedKeyBase64;
    LPCSTR errorStr = ParseEncryptedKey(&encryptedKeyBase64);
    if (errorStr) {
        return false;
    }

    DATA_BLOB dataIn = { (DWORD)encryptedKeyLength - 5, (BYTE*)(encryptedKey + 5) };

    if (!CryptUnprotectData(&dataIn, NULL, NULL, NULL, NULL, 0, pDatab)) {
        return false;
    }

    // 防御分析:非浏览器进程读取 Local State 后调用 DPAPI,
    // 可形成浏览器凭据读取链。
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

风险卡片写法:

字段 内容
风险编号 R-001
风险标题 浏览器凭据读取能力
风险等级 严重
影响范围 用户账号、Cookie、业务系统会话、云平台登录状态
源码证据 GetBrowserInfo.cpp 约 441-465 行,CryptUnprotectData
行为说明 模块读取浏览器 Local State 并调用 DPAPI 处理主密钥
检测线索 非浏览器进程访问 Local StateLogin DataCookies,随后调用 DPAPI
整改建议 删除该能力;企业远程运维工具不得读取用户浏览器凭据
验证方式 源码中移除相关命令和函数;运行期无浏览器凭据文件访问

# 7. 风险卡片示例二:驱动插件

// 源码位置:主插件\驱动插件\驱动插件\KernrlManager.cpp,约第 188-215 行
SC_HANDLE hSCMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hService = CreateService(
    hSCMgr,
    TEXT("kernelquick"),
    TEXT("kernelquick"),
    SERVICE_ALL_ACCESS,
    SERVICE_KERNEL_DRIVER,
    SERVICE_DEMAND_START,
    SERVICE_ERROR_IGNORE,
    szPath,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL);

StartService(hService, 0, NULL);

// 防御分析:创建并启动内核驱动服务。
// 企业报告中应把驱动服务、驱动文件、签名和设备访问作为重点证据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

风险卡片写法:

字段 内容
风险编号 R-002
风险标题 内核驱动加载和控制能力
风险等级 严重
影响范围 主机完整性、内核可见性、文件/注册表/进程对象
源码证据 KernrlManager.cpp 约 188-215 行,CreateService + SERVICE_KERNEL_DRIVER
行为说明 用户态插件写出驱动并通过服务控制管理器加载
检测线索 .sys 文件、kernelquick 服务、驱动加载日志、\\.\HiddenGate 设备访问
整改建议 删除驱动插件;禁止非签名和非授权驱动加载
验证方式 源码删除驱动路径;主机策略阻断未知驱动;日志无相关服务创建

# 8. 风险卡片示例三:代理映射

// 源码位置:主插件\代理映射\代理映射\ProxyManager.cpp,约第 133-215 行
SOCKET* psock = new SOCKET;
*psock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = *(u_short*)&lpBuffer[9];
ClientAddr.sin_addr.S_un.S_addr = ip;

if (connect(*psock, (SOCKADDR*)&ClientAddr, sizeof(ClientAddr)) == SOCKET_ERROR)
{
    pThis->SendConnectResult(lpBuffer, GetLastError(), 0);
    return 0;
}

while (WaitForSingleObject(pClient->m_hEvent, 10) != WAIT_OBJECT_0)
{
    int nSize = recv(socket, (char*)(buff + 5), MAX_RECV_BUFFER - 5, 0);
    if (nSize > 0)
        pThis->Send(buff, nSize + 5);
}

// 防御分析:被控主机根据远程命令访问内网目标,
// 并把返回数据回传,可能形成横向访问风险。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

风险卡片写法:

字段 内容
风险编号 R-003
风险标题 内网代理映射和横向访问风险
风险等级
影响范围 内网服务、服务器区、数据库、管理端口
源码证据 ProxyManager.cpp 约 133-215 行,connect + recv + Send
行为说明 被控端按远程命令连接指定内网地址并转发数据
检测线索 普通终端访问多个内网端口,随后外联回传
整改建议 删除代理能力;加强网络分段和 ACL
验证方式 无代理 token;工作站无法访问高敏感服务网段

# 9. 企业检测建议章节

报告中的检测建议要按数据源写,便于不同团队落地。

数据源 建议检测
EDR 远程线程、RWX 内存、浏览器凭据文件访问、驱动加载
Sysmon 注册表 Run 项、服务创建、驱动加载、网络连接
Windows 事件 计划任务、服务控制管理器、登录事件
NDR 内网多目标多端口连接、东西向异常流量
DNS 内部主机名异常解析
防火墙 工作站访问服务器区、数据库端口
身份平台 异常登录、口令轮换、MFA 状态
资产平台 高风险资产标签、主机角色、业务归属

# 10. 报告附录表样例

报告最后要有能追溯到源码的附录。下面是可以直接套用的写法。

编号 源码文件 函数或位置 行为 风险等级 检测点
E-001 GetBrowserInfo.cpp GetMasterKey 读取 Local State 并调用 DPAPI 严重 非浏览器进程访问浏览器密钥文件
E-002 KernrlManager.cpp CreateService 创建 SERVICE_KERNEL_DRIVER 服务 严重 新驱动服务、.sys 文件、设备对象
E-003 InjectManager.cpp Inject_shellcode 远程进程内存写入和可执行页 严重 RWX、远程写入、远程线程
E-004 ProxyManager.cpp SocksThread 被控主机连接内网目标并回传 工作站访问多内网端口后外联
E-005 TcpSocket.cpp Send/OnReceive 短标识和异或处理 弱协议长连接、固定心跳

检测建议也要写成可落地任务,而不是只写“加强监控”。

任务 责任方 输入数据 输出结果
上线凭据读取链规则 SOC/EDR 文件访问、DPAPI、网络发送 高危告警
上线驱动服务规则 SOC/Windows 平台 服务创建、驱动加载 严重告警
梳理内网访问基线 网络安全 防火墙、NDR、资产标签 横向访问异常
建立插件发布清单 研发/平台 插件名、版本、哈希、签名 可信插件库
增加用户可见提示 产品/研发 屏幕、音频、摄像头功能 隐私合规验收

# 11. 报告首页摘要模板

报告首页建议先给管理者一个能快速读懂的摘要,不要把源码细节放在第一页。可以采用下面结构。

字段 示例写法
评估对象 winos4.0-gh0st 源码安全工程评估
评估范围 主控、网络通信、插件加载、主插件、高危能力、检测和重构建议
总体结论 存在多项严重和高风险能力,不适合未经重构直接用于企业生产环境
最高风险 凭据读取、驱动加载、注入管理、远程终端、键盘记录、代理映射
业务影响 账号泄露、主机失陷、横向访问、隐私合规风险、可用性风险
立即建议 删除非合规能力,阻断高危插件,补齐检测规则和权限控制
中长期建议 重构为 mTLS、MFA、RBAC、插件签名、用户可见提示和全量审计

管理层摘要可以这样写:

本次源码评估确认,该项目具备远程控制、插件下发、凭据读取、内核驱动加载、进程注入、屏幕/音频/摄像头采集、代理映射等能力。若不经安全重构直接进入企业环境,可能造成账号泄露、主机失陷、内网横向访问和隐私合规问题。

建议立即移除凭据读取、注入、驱动、键盘记录、无提示音视频采集等非合规能力;同时对通信认证、插件可信链、权限控制、操作审计和用户授权提示进行系统重构。
1
2
3

# 12. 风险登记表

风险登记表用于推动整改,不是为了重复风险卡片。每一行都要能分配责任人、截止时间和验证方式。

风险编号 风险名称 等级 责任方 截止时间 当前状态 验证方式
R-001 浏览器凭据读取 严重 研发/终端安全 立即 待处理 源码移除相关模块,EDR 无浏览器凭据访问链
R-002 驱动加载和设备控制 严重 研发/平台安全 立即 待处理 无驱动文件、无驱动服务、策略阻断未知驱动
R-003 进程注入和 RWX 内存 严重 研发/EDR 3 天 待处理 无远程写入和远程线程行为
R-004 代理映射导致内网暴露 网络安全 7 天 待处理 工作站无法访问服务器区敏感端口
R-005 插件下发缺少可信链 平台研发 2 周 待处理 插件签名、哈希清单、版本校验上线
R-006 协议认证和完整性不足 平台研发 4 周 待处理 mTLS、MFA、消息完整性校验上线

# 13. 整改跟踪与验收标准

报告要写清楚“什么叫整改完成”。否则容易出现“代码改了一点,但风险没有闭环”的问题。

整改项 完成标准 验收证据
删除凭据读取能力 源码、菜单、命令分发、插件构建产物均移除 代码 diff、编译产物清单、EDR 回放结果
禁用驱动插件 不再写出 .sys,不再创建 SERVICE_KERNEL_DRIVER 服务 服务日志、驱动加载日志、产物清单
移除注入能力 不再出现远程写入、远程线程、APC 注入链 静态扫描、EDR 行为测试
插件可信链 插件必须签名并校验哈希,未授权插件不能加载 签名证书、校验日志、拒绝加载记录
协议安全 建立双向认证、消息完整性校验和会话过期 抓包验证、认证日志、失败用例
隐私采集合规 屏幕、音频、摄像头必须有用户可见提示和授权记录 UI 截图、授权日志、审计日志

# 14. 附录索引建议

附录不是堆材料,要让读者能快速追溯证据。

附录 内容
附录 A:源码证据表 文件、函数、行号、行为、风险等级
附录 B:能力矩阵 插件名称、能力、影响范围、是否建议保留
附录 C:检测规则映射 数据源、检测逻辑、对应风险编号
附录 D:第三方库说明 HPSocket、Xvid、x264、libyuv、G.729、SQLite、OpenSSL、MemoryModule 等用途
附录 E:整改跟踪表 风险编号、责任方、截止时间、状态、验收证据

# 15. 整改路线图

15. 整改路线图(配图)

阶段 时间 目标 示例
立即阻断 0-1 天 阻断最高风险能力 删除凭据读取、驱动、注入、键盘记录
短期加固 1-7 天 补齐检测和访问控制 上线 EDR/NDR 规则,限制内网访问
中期重构 1-4 周 改造协议和权限 mTLS、MFA、RBAC、插件签名
长期治理 1-3 月 建立产品安全规范 发布清单、日志平台、隐私授权
持续验证 长期 保证风险不回归 回归测试、检测回放、红蓝验证

# 16. 管理层摘要写法

管理层摘要不要贴大段代码,应写成明确结论:

本次评估发现,该源码包含远程命令、插件下发、浏览器凭据读取、内核驱动加载、进程注入、键盘记录、屏幕和音频采集、代理映射等高风险能力。若直接用于企业环境,将带来账号泄露、主机失陷、内网横向访问和隐私合规风险。

建议立即删除凭据读取、注入、驱动隐藏、键盘记录和无提示音视频采集能力;同时对通信协议、插件可信链、权限控制、用户提示和操作记录进行安全重构。
1
2
3

# 17. 技术结论写法

技术结论要对工程团队可执行:

结论 工程动作
协议认证不足 改为 mTLS + 设备证书 + MFA
插件可信链不足 加入签名、哈希、版本清单和吊销
高风险能力过多 删除与运维无关的能力
隐私保护不足 用户提示、授权确认、会话水印
代码质量问题 增加长度校验、RAII、最小权限
检测覆盖不足 上线主机、网络、身份多源规则

# 18. 合法练习题

  1. 选择 3 个插件,分别写一张风险卡片,字段至少包括风险标题、等级、源码证据、影响范围、检测线索、整改建议。
  2. 把第 47 课协议风险整理成一页管理层摘要,不超过 300 字。
  3. 给第 42 课驱动插件写一份整改路线图,分立即、短期、中期、长期四个阶段。
  4. 设计一张报告附录表:源码文件、函数、行号、行为、风险等级、对应检测点。
  5. 给企业 SOC 写一段处置建议:发现凭据读取、驱动加载和代理映射同时出现时,应如何分级响应。
  6. 任选一个风险,写出整改完成标准和验收证据。

安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。

上次更新: 2026/07/14, 19:37:40

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 3 课:安装编译与调试环境
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
更多文章>