第 52 课:综合案例:写一份企业安全评估报告
# 第 52 课:综合案例:写一份企业安全评估报告
免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。
本课是整套教程的最终交付练习:把前 50 课学到的源码阅读、风险识别、检测工程、加固设计和应急思路,整理成一份企业能读懂、能落地、能安排整改的安全评估报告。报告不是把源码贴一遍,而是把源码证据转成业务语言:有什么风险、影响什么资产、怎么发现、怎么整改、谁负责、什么时候完成。

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

建议报告按下面结构组织:
- 项目背景和评估边界。
- 源码范围和目录结构。
- 架构概览和数据流。
- 高风险能力清单。
- 风险分级矩阵。
- 重点风险卡片。
- 企业检测建议。
- 整改路线图。
- 应急响应建议。
- 附录:源码证据表、图片、术语解释。
报告正文要少用“这个函数很危险”这种笼统说法,改成“该函数接收远程命令后写入注册表 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. 风险分级矩阵

建议使用四级风险:
| 等级 | 判断条件 | 代表能力 | 处置时限 |
|---|---|---|---|
| 严重 | 可能导致凭据泄露、内核级控制、进程注入、远程命令执行 | 驱动插件、解密数据、注入管理、远程终端 | 立即处理 |
| 高 | 可造成持久化、敏感文件操作、横向访问、隐私采集 | 启动管理、文件管理、代理映射、摄像头/音频 | 3 天内 |
| 中 | 存在隐私影响、弱协议、代码质量问题或检测不足 | 屏幕采集、协议弱加密、资源释放问题 | 7 天内 |
| 低 | 文档、命名、可维护性、低影响缺陷 | 注释缺失、错误信息不统一 | 排期处理 |
分级时不要只看“功能名称”,要看影响范围、触发条件、是否需要权限、是否能被检测、是否会影响账号和关键资产。
# 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,
// 可形成浏览器凭据读取链。
}
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 State、Login Data、Cookies,随后调用 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);
// 防御分析:创建并启动内核驱动服务。
// 企业报告中应把驱动服务、驱动文件、签名和设备访问作为重点证据。
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);
}
// 防御分析:被控主机根据远程命令访问内网目标,
// 并把返回数据回传,可能形成横向访问风险。
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、插件签名、用户可见提示和全量审计 |
管理层摘要可以这样写:
本次源码评估确认,该项目具备远程控制、插件下发、凭据读取、内核驱动加载、进程注入、屏幕/音频/摄像头采集、代理映射等能力。若不经安全重构直接进入企业环境,可能造成账号泄露、主机失陷、内网横向访问和隐私合规问题。
建议立即移除凭据读取、注入、驱动、键盘记录、无提示音视频采集等非合规能力;同时对通信认证、插件可信链、权限控制、操作审计和用户授权提示进行系统重构。
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. 整改路线图

| 阶段 | 时间 | 目标 | 示例 |
|---|---|---|---|
| 立即阻断 | 0-1 天 | 阻断最高风险能力 | 删除凭据读取、驱动、注入、键盘记录 |
| 短期加固 | 1-7 天 | 补齐检测和访问控制 | 上线 EDR/NDR 规则,限制内网访问 |
| 中期重构 | 1-4 周 | 改造协议和权限 | mTLS、MFA、RBAC、插件签名 |
| 长期治理 | 1-3 月 | 建立产品安全规范 | 发布清单、日志平台、隐私授权 |
| 持续验证 | 长期 | 保证风险不回归 | 回归测试、检测回放、红蓝验证 |
# 16. 管理层摘要写法
管理层摘要不要贴大段代码,应写成明确结论:
本次评估发现,该源码包含远程命令、插件下发、浏览器凭据读取、内核驱动加载、进程注入、键盘记录、屏幕和音频采集、代理映射等高风险能力。若直接用于企业环境,将带来账号泄露、主机失陷、内网横向访问和隐私合规风险。
建议立即删除凭据读取、注入、驱动隐藏、键盘记录和无提示音视频采集能力;同时对通信协议、插件可信链、权限控制、用户提示和操作记录进行安全重构。
2
3
# 17. 技术结论写法
技术结论要对工程团队可执行:
| 结论 | 工程动作 |
|---|---|
| 协议认证不足 | 改为 mTLS + 设备证书 + MFA |
| 插件可信链不足 | 加入签名、哈希、版本清单和吊销 |
| 高风险能力过多 | 删除与运维无关的能力 |
| 隐私保护不足 | 用户提示、授权确认、会话水印 |
| 代码质量问题 | 增加长度校验、RAII、最小权限 |
| 检测覆盖不足 | 上线主机、网络、身份多源规则 |
# 18. 合法练习题
- 选择 3 个插件,分别写一张风险卡片,字段至少包括风险标题、等级、源码证据、影响范围、检测线索、整改建议。
- 把第 47 课协议风险整理成一页管理层摘要,不超过 300 字。
- 给第 42 课驱动插件写一份整改路线图,分立即、短期、中期、长期四个阶段。
- 设计一张报告附录表:源码文件、函数、行号、行为、风险等级、对应检测点。
- 给企业 SOC 写一段处置建议:发现凭据读取、驱动加载和代理映射同时出现时,应如何分级响应。
- 任选一个风险,写出整改完成标准和验收证据。
安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言