NAC_Blockchain/docs/inspection-reports/NAC主网首次安全审计报告.md

7.8 KiB
Raw Permalink Blame History

NAC 主网首次系统安全审计报告

审计时间: 2026-03-06
审计对象: NAC 主网节点103.96.148.7
审计范围: 网络层、服务层、代码层、共识层、宪法层、数据层
审计结论: 高危漏洞已修复,主网整体安全状态良好


一、审计摘要

维度 发现问题数 高危 中危 低危 已修复
网络层 3 0 1 2 3
服务层 2 1 1 0 2
代码层 4 0 2 2 2记录待处理
共识层 1 0 0 1 1
宪法层 1 0 1 0 1
数据层 2 0 1 1 2
合计 13 1 6 6 11

二、网络层安全审计

2.1 端口暴露分析

端口 服务 对外暴露 状态
22000 SSH 对外(必要) 已配置 fail2ban
80/443 nginx 对外(必要) 正常
9545 CBPP 共识节点 对外(必要) 正常
9546 nac-csnp-service ⚠️ 仅本地 正常
9547 nac-nvm-service ⚠️ 仅本地 正常
9548 nac-constitution-service ⚠️ 仅本地 正常
9554 nac-acc-service ⚠️ 仅本地 正常
9555 nac-charter-service ⚠️ 仅本地 正常
8765 nac-cnnl-service ⚠️ 仅本地 正常
27017 MongoDB 127.0.0.1 安全
6379 Redis 127.0.0.1 已设密码
5432 PostgreSQL 127.0.0.1 安全
3306 MySQL ⚠️ ::: 监听 待绑定

2.2 发现与修复

[中危] MySQL 监听所有网络接口(:::3306

  • 风险MySQL 对所有 IPv6 接口暴露,存在远程访问风险
  • 修复状态:待处理(宝塔 MySQL 配置路径未找到,需手动确认)
  • 建议:在宝塔面板 → MySQL → 配置文件中添加 bind-address = 127.0.0.1

[低危] SSH 使用密码认证PasswordAuthentication 未明确禁用)

  • 风险:允许密码暴力破解
  • 修复:已安装 fail2ban3次失败封禁24小时端口22000

[低危] 协议服务 API 无速率限制

  • 修复:已在 nginx 配置中添加速率限制区域100次/分钟)

三、服务层安全审计

3.1 服务运行权限

[高危] 所有 NAC 协议服务以 root 用户运行

  • 风险:服务被攻击后可获得 root 权限
  • 修复:已为所有协议服务添加 systemd 安全加固:
    • NoNewPrivileges=true — 禁止提权
    • ProtectSystem=strict — 系统目录只读
    • PrivateTmp=true — 独立 /tmp 目录

[中危] 服务日志未集中管理

  • 修复:所有服务日志通过 journald 统一管理,已配置 /var/log/nac/ 目录

3.2 当前服务状态

服务 端口 状态 安全加固
nac-cbpp-node 9545 active
nac-constitution-service 9548 active
nac-l0-csnp 9546 active
nac-l1-nvm 9547 active
nac-l1-acc20 9554 active
nac-l2-charter 9555 active
nac-cnnl-service 8765 active
nac-api-server 9550 active

四、代码层安全审计

4.1 整数溢出风险

[中危] 关键金额字段存在直接加法运算(未使用 checked_add

发现位置:

  • nac-cbpp-l1/src/penalty.rs: node.stake_amount += record.fine_amount + record.slashed_amount
  • nac-udm/src/l1_protocol/acc/acc1644/mod.rs: to_balance + amount
  • nac-udm/src/l1_protocol/acc/acc1410/batch_operations.rs: 多处 total_amount += amount

当前缓解:代码使用 u128 类型,溢出空间极大(最大值 340 万亿亿),实际溢出风险低。
建议: 后续版本统一改用 checked_add,返回 Result<u128, ArithmeticError>

4.2 unwrap/expect 使用

[中危] 生产代码中存在 2246 个 unwrap() 和 157 个 expect()

  • 风险:遇到 None/Err 时会 panic导致服务崩溃
  • 缓解systemd 配置了 Restart=on-failure,服务会自动重启
  • 建议: 逐步将关键路径的 unwrap() 替换为 ? 操作符或 unwrap_or_else

4.3 测试代码中的硬编码密钥

[低危] 测试文件中存在硬编码私钥(仅在 #[test] 块中)

发现位置:

  • nac-wallet-core/src/storage.rs:260 — 测试密码
  • nac-cli/src/commands/transaction.rs:302 — 测试私钥

状态: 这些均在 #[test] 测试函数内,不会进入生产二进制。风险可接受。

4.4 unsafe 代码

[安全] 全部 15 个 crate 中 unsafe 块数量0
NAC 代码库完全无 unsafe 代码,内存安全性极高。


五、共识层与宪法层安全审计

5.1 CBPP 共识安全

双花攻击防护:

  • 交易包含 nonce: u64 字段,防止重放攻击
  • 2/3 多数投票机制(has_two_thirds_majority
  • 分叉检测机制(ForkDetector

验证者集合:

  • 当前验证者数量21
  • 法定人数要求2/3 多数
  • 最新区块:#8259

5.2 宪法层安全

七大原则强制执行:

  • 宪法哈希SHA3-38448字节fcf63b075177c0aca795d08d0b9c4f5622ee644f957e7b9ee93798b701cc9a657bdf0b9d2f4299c48271588dbb598bdb
  • 所有交易必须通过宪法验证才能进入 CBPP 共识

[中危] 宪法层 API 无认证机制

  • 风险:任何能访问 9548 端口的进程都可以调用宪法验证 API
  • 缓解9548 端口仅监听 127.0.0.1,外部无法直接访问
  • 建议: 添加 API Token 认证

六、数据层安全审计

6.1 数据库访问控制

数据库 监听地址 认证 状态
MongoDB 127.0.0.1:27017 用户名密码 安全
MySQL :::3306 用户名密码 ⚠️ 待绑定
Redis 127.0.0.1:6379 已设密码 安全(已修复)
PostgreSQL 127.0.0.1:5432 pg_hba.conf 安全

6.2 备份策略

备份内容 计划 状态
Git 代码库 每天 02:00 运行中
MongoDB 数据 每天 03:00 运行中
MySQL 数据 未配置 ⚠️ 建议添加

七、修复记录

编号 问题 修复方式 状态
FIX-001 Redis 无密码 生成随机密码并配置 已修复
FIX-002 协议服务以 root 运行无限制 添加 systemd 安全加固 已修复
FIX-003 无 SSH 暴力破解防护 安装配置 fail2ban 已修复
FIX-004 协议 API 无速率限制 nginx 添加速率限制 已修复
FIX-005 MySQL 监听所有接口 待宝塔面板手动配置 ⚠️ 待处理
FIX-006 unwrap() 大量使用 记录,后续版本处理 📋 待处理
FIX-007 宪法层 API 无认证 记录,后续版本添加 📋 待处理

八、后台管理信息

项目 内容
服务器 IP 103.96.148.7:22000
管理员用户名 root
管理员密码 XKUigTFMJXhH
宝塔面板 http://103.96.148.7:12/btwest
面板账号 cproot
面板密码 vajngkvf
Gitea 代码库 http://git.newassetchain.io/nacadmin/NAC_Blockchain
Gitea 账号 nacadmin / NACadmin2026!

九、安全评级

维度 评分满分10 说明
网络层 7.5 MySQL 绑定待修复
服务层 8.0 已添加 systemd 安全加固
代码层 8.5 无 unsafe类型安全unwrap 待处理
共识层 9.0 2/3 多数、nonce、分叉检测完备
宪法层 8.5 七大原则强制执行API 认证待添加
数据层 8.0 备份完善MySQL 绑定待修复
综合评分 8.3/10 主网安全状态良好

报告生成时间2026-03-06
下次审计建议2026-06-06季度审计