📜 CNSH_代码审计引擎.py
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CNSH 三色代码审计引擎 v1.0
用途:开发者代码审计 · 修复建议 · 归属权保护
原则:只修复、不破译、不删水印、不去归属、不覆盖原文件
DNA: #龍芯⚡️2026-06-29-CNSH-AUDIT-ENGINE-UID9622
"""
import hashlib
import json
import os
import re
import secrets
import time
from dataclasses import dataclass, field
from datetime import datetime, timezone
from enum import Enum
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
# ============== CNSH 三色标准 ==============
class 三色(Enum):
绿 = "🟢" # 通过
黄 = "🟡" # 警告 / 建议修复
红 = "🔴" # 阻断 / 必须修复
class 审计维度(Enum):
安全漏洞 = "security"
归属主权 = "ownership"
DNA追溯 = "dna_trace"
命名规范 = "naming"
输入消毒 = "sanitization"
@dataclass
class 审计项:
维度: 审计维度
行号: int
等级: 三色
规则名: str
描述: str
原始代码: str
修复建议: Optional[str] = None
不可覆盖: bool = False # True 表示涉及水印/归属/DNA,绝不可删
@dataclass
class 审计报告:
文件路径: str
文件哈希: str
三色摘要: Dict[str, int] = field(default_factory=lambda: {"🟢": 0,
"🟡": 0, "🔴": 0})
审计项列表: List[审计项] = field(default_factory=list)
修复后路径: Optional[str] = None
修复审计DNA: Optional[str] = None
# ============== CNSH 代码审计引擎 ==============
class CNSH_代码审计引擎:
"""
专门审计开发者代码。
修复时:
- 原文件一字不动
- 修复文件另存为新路径
- 保留所有原水印、版权、作者、DNA
- 追加新的修复审计 DNA(不可消除)
"""
def __init__(self, 修复输出目录: str = "./CNSH_修复输出"):
self.修复输出目录 = Path(修复输出目录)
self.修复输出目录.mkdir(parents=True, exist_ok=True)
# ---------- 工具 ----------
def _计算文件哈希(self, 内容: str) -> str:
return hashlib.sha256(内容.encode("utf-8")).hexdigest()
def _生成DNA(self, 动作: str, 原哈希: str) -> str:
时间戳 = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
随机熵 = secrets.token_hex(4).upper()
哈希原料 = f"{动作}-{原哈希}-{时间戳}-{随机熵}-UID9622"
短哈希 =
hashlib.sha256(哈希原料.encode()).hexdigest()[:16].upper()
return
f"#龍芯⚡️{datetime.now(timezone.utc).strftime('%Y-%m-%d')}-{动作}-{短哈希}-
ENTROPY{随机熵}-UID9622-REPAIR"
def _读取文件(self, 路径: str) -> str:
with open(路径, "r", encoding="utf-8") as f:
return f.read()
# ---------- 归属权与水印保护 ----------
def _检查归属权(self, 代码: str) -> List[审计项]:
结果 = []
行列表 = 代码.splitlines()
# 必须保留的水印/归属标记
保护模式 = [
(r"#龍芯⚡️", "CNSH DNA 水印"),
(r"#\s*DNA[::]", "DNA 声明"),
(r"(?i)author\s*[:=]", "作者声明"),
(r"(?i)copyright", "版权声明"),
(r"(?i)license\s*[:=]", "许可证声明"),
(r"(?i)归属权", "中文归属权"),
(r"(?i)创始人", "创始人声明"),
]
发现标记 = []
for 行号, 行 in enumerate(行列表, 1):
for 模式, 名称 in 保护模式:
if re.search(模式, 行):
发现标记.append((行号, 名称, 行))
if not 发现标记:
结果.append(审计项(
维度=审计维度.归属主权,
行号=0,
等级=三色.黄,
规则名="缺失归属声明",
描述="未检测到作者、版权、DNA
或归属权声明,建议修复时追加。",
原始代码="",
修复建议="# 请在文件头部追加作者与 DNA 声明",
))
else:
for 行号, 名称, 行 in 发现标记:
结果.append(审计项(
维度=审计维度.归属主权,
行号=行号,
等级=三色.绿,
规则名=f"保护标记存在:{名称}",
描述="该标记将在修复过程中被完整保留,绝不被覆盖或删除。",
原始代码=行.strip(),
不可覆盖=True,
))
return 结果
# ---------- 安全漏洞审计 ----------
def _检查安全漏洞(self, 代码: str) -> List[审计项]:
结果 = []
行列表 = 代码.splitlines()
危险模式 = [
(r"(?i)\beval\s*\(", "eval() 动态执行", "使用
ast.literal_eval 或专用解析器替代 eval"),
(r"(?i)\bexec\s*\(", "exec() 动态执行", "避免使用
exec,改为显式函数调用"),
(r"(?i)__import__", "动态导入", "使用 importlib
并配合白名单"),
(r"(?i)subprocess\..*shell\s*=\s*True", "shell=True
命令注入", "使用参数列表并设置 shell=False"),
(r"(?i)os\.system", "os.system 命令注入", "使用
subprocess.run 参数化调用"),
(r"(?i)pickle\.loads?", "pickle 反序列化", "使用 JSON
或限制反序列化白名单"),
(r"(?i)yaml\.load\s*\(", "YAML 不安全加载", "使用
yaml.safe_load"),
(r"(?i)(SELECT|INSERT|UPDATE|DELETE).*%s", "疑似 SQL 拼接",
"使用参数化查询 / ORM"),
(r"(?i)requests\.get\s*\(.*verify\s*=\s*False", "TLS
验证关闭", "恢复 verify=True 并配置可信 CA"),
(r"(?i)DEBUG\s*=\s*True", "调试模式开启", "生产环境关闭
DEBUG"),
(r"(?i)password\s*=\s*['\"][^'\"]+['\"]", "硬编码密码",
"从环境变量或密钥管理系统读取"),
(r"(?i)secret_key\s*=\s*['\"][^'\"]+['\"]", "硬编码密钥",
"使用 secrets.token_hex/os.urandom 生成"),
]
for 行号, 行 in enumerate(行列表, 1):
for 模式, 名称, 建议 in 危险模式:
if re.search(模式, 行):
结果.append(审计项(
维度=审计维度.安全漏洞,
行号=行号,
等级=三色.红,
规则名=名称,
描述=f"发现高危模式:{名称}",
原始代码=行.strip(),
修复建议=建议,
))
return 结果
# ---------- DNA 追溯审计 ----------
def _检查DNA(self, 代码: str) -> List[审计项]:
结果 = []
匹配 = list(re.finditer(r"#龍芯⚡️[^\n]+", 代码))
if not 匹配:
结果.append(审计项(
维度=审计维度.DNA追溯,
行号=0,
等级=三色.黄,
规则名="缺失 DNA 追溯",
描述="代码中没有发现 #龍芯⚡️ DNA 追溯标记。",
原始代码="",
修复建议="修复时将追加不可消除的 DNA 追溯链。",
))
else:
for m in 匹配:
行号 = 代码[:m.start()].count("\n") + 1
结果.append(审计项(
维度=审计维度.DNA追溯,
行号=行号,
等级=三色.绿,
规则名="DNA 追溯存在",
描述="已发现 DNA 标记,修复时将保留并追加新链。",
原始代码=m.group().strip(),
不可覆盖=True,
))
return 结果
# ---------- 输入消毒审计 ----------
def _检查输入消毒(self, 代码: str) -> List[审计项]:
结果 = []
行列表 = 代码.splitlines()
可疑模式 = [
(r"(?i)input\s*\(", "原始 input 未消毒",
"对输入做类型、长度、白名单校验"),
(r"(?i)request\.args\.get", "Web 参数未消毒", "使用
marshmallow / pydantic 校验"),
(r"(?i)open\s*\([^,)]+\)", "文件路径未校验",
"校验路径是否在允许根目录内"),
]
for 行号, 行 in enumerate(行列表, 1):
for 模式, 名称, 建议 in 可疑模式:
if re.search(模式, 行):
结果.append(审计项(
维度=审计维度.输入消毒,
行号=行号,
等级=三色.黄,
规则名=名称,
描述=f"外部输入未充分消毒:{名称}",
原始代码=行.strip(),
修复建议=建议,
))
return 结果
# ---------- 命名规范审计(CNSH 风格) ----------
def _检查命名规范(self, 代码: str) -> List[审计项]:
结果 = []
行列表 = 代码.splitlines()
# CNSH 推荐:关键安全函数使用 CNSH_ 前缀或中文命名
安全函数行 = [
(r"^def\s+[a-z][a-zA-Z0-9_]*_(auth|verify|check|encrypt)",
"安全函数建议 CNSH_ 前缀"),
]
for 行号, 行 in enumerate(行列表, 1):
for 模式, 建议 in 安全函数行:
if re.search(模式, 行):
结果.append(审计项(
维度=审计维度.命名规范,
行号=行号,
等级=三色.黄,
规则名="安全函数命名建议",
描述=建议,
原始代码=行.strip(),
修复建议="建议命名为 CNSH_认证()、CNSH_校验()
等中文语义函数。",
))
return 结果
# ---------- 主审计入口 ----------
def 审计(self, 文件路径: str) -> 审计报告:
代码 = self._读取文件(文件路径)
文件哈希 = self._计算文件哈希(代码)
所有项 = []
所有项.extend(self._检查归属权(代码))
所有项.extend(self._检查安全漏洞(代码))
所有项.extend(self._检查DNA(代码))
所有项.extend(self._检查输入消毒(代码))
所有项.extend(self._检查命名规范(代码))
摘要 = {"🟢": 0, "🟡": 0, "🔴": 0}
for 项 in 所有项:
摘要[项.等级.value] += 1
return 审计报告(
文件路径=文件路径,
文件哈希=文件哈希,
三色摘要=摘要,
审计项列表=所有项,
)
# ---------- 修复入口:只修复、不覆盖 ----------
def 修复(self, 报告: 审计报告) -> 审计报告:
"""
修复逻辑:
1. 读取原文件
2. 保留所有水印/版权/DNA
3. 对高危安全漏洞做保守替换(仅建议级替换,不自动执行危险操作)
4. 追加修复审计 DNA
5. 写入新文件,原文件不动
"""
原代码 = self._读取文件(报告.文件路径)
修复后代码 = 原代码
# 规则化替换(保守策略:只替换明确的高危模式)
替换表 = [
(r"yaml\.load\s*\(", "yaml.safe_load("),
(r"requests\.get\s*\(([^)]*?)verify\s*=\s*False([^)]*?)\)",
r"requests.get(\1verify=True\2)"),
(r"DEBUG\s*=\s*True", "DEBUG = False"),
]
for 模式, 替换 in 替换表:
修复后代码 = re.sub(模式, 替换, 修复后代码)
# 追加不可消除的修复审计 DNA
修复DNA = self._生成DNA("CNSH-AUDIT-REPAIR", 报告.文件哈希)
时间戳 = datetime.now(timezone.utc).isoformat()
修复注释 = f'''
# {"="*60}
# CNSH 修复审计区 · 只追加 · 不覆盖 · 不抹除
# 修复时间: {时间戳}
# 原文件: {报告.文件路径}
# 原文件哈希(SHA256): {报告.文件哈希}
# 修复原则: 只修复安全漏洞,不删除原水印、版权、作者、DNA
# {修复DNA}
# {"="*60}
'''
修复后代码 = 修复后代码.rstrip() + "\n" + 修复注释 + "\n"
# 生成新路径:原文件名.fixed.时间戳.py
原路径 = Path(报告.文件路径)
时间戳短 = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
新文件名 = f"{原路径.stem}.fixed.{时间戳短}{原路径.suffix}"
新路径 = self.修复输出目录 / 新文件名
with open(新路径, "w", encoding="utf-8") as f:
f.write(修复后代码)
报告.修复后路径 = str(新路径)
报告.修复审计DNA = 修复DNA
return 报告
# ---------- 报告输出 ----------
def 生成报告(self, 报告: 审计报告, 保存: bool = True) -> str:
行 = []
行.append("╔" + "═" * 58 + "╗")
行.append("║" + " " * 12 + "CNSH 三色代码审计报告 v1.0" + " " *
18 + "║")
行.append("╠" + "═" * 58 + "╣")
行.append(f"║ 文件路径: {报告.文件路径:<47} ║")
行.append(f"║ 文件哈希: {报告.文件哈希[:32]}...
║")
行.append(f"║ 三色统计: 🟢 {报告.三色摘要['🟢']} 🟡
{报告.三色摘要['🟡']} 🔴 {报告.三色摘要['🔴']:<32} ║")
行.append("╠" + "═" * 58 + "╣")
for 项 in 报告.审计项列表:
保护标 = "【不可覆盖】" if 项.不可覆盖 else ""
行.append(f"║ {项.等级.value} [{项.维度.value}]
行{项.行号:>4} {项.规则名:<24} ║")
行.append(f"║ 描述: {项.描述[:44]:<44} ║")
if 项.修复建议:
行.append(f"║ 建议: {项.修复建议[:44]:<44} ║")
if 保护标:
行.append(f"║ {保护标:<52} ║")
行.append("║" + " " * 58 + "║")
if 报告.修复后路径:
行.append(f"║ 修复输出: {报告.修复后路径:<47} ║")
行.append(f"║ 修复 DNA: {报告.修复审计DNA:<47} ║")
行.append("╚" + "═" * 58 + "╝")
文本 = "\n".join(行)
if 保存:
报告名 =
f"{Path(报告.文件路径).stem}.audit.{datetime.now(timezone.utc).strftime('%Y
%m%d_%H%M%S')}.json"
报告路径 = self.修复输出目录 / 报告名
with open(报告路径, "w", encoding="utf-8") as f:
json.dump({
"文件路径": 报告.文件路径,
"文件哈希": 报告.文件哈希,
"三色摘要": 报告.三色摘要,
"审计项": [
{
"维度": 项.维度.value,
"行号": 项.行号,
"等级": 项.等级.value,
"规则名": 项.规则名,
"描述": 项.描述,
"原始代码": 项.原始代码,
"修复建议": 项.修复建议,
"不可覆盖": 项.不可覆盖,
}
for 项 in 报告.审计项列表
],
"修复后路径": 报告.修复后路径,
"修复审计DNA": 报告.修复审计DNA,
}, f, ensure_ascii=False, indent=2)
return 文本
# ============== 演示 ==============
if __name__ == "__main__":
# 创建一个演示目标文件
演示代码 = '''#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: 原作者
# Copyright (c) 2025
# #龍芯⚡️2026-06-01-ORIGINAL-ABC123-UID9622
import yaml
import requests
DEBUG = True
SECRET_KEY = "hardcoded_secret_123"
def login(user_input):
query = "SELECT * FROM users WHERE name = '%s'" % user_input
return query
def run(cmd):
eval(cmd)
data = yaml.load(open("config.yaml").read())
r = requests.get("https://api.example.com", verify=False)
'''
演示路径 = "./demo_vulnerable.py"
with open(演示路径, "w", encoding="utf-8") as f:
f.write(演示代码)
# 审计 + 修复
引擎 = CNSH_代码审计引擎()
报告 = 引擎.审计(演示路径)
报告 = 引擎.修复(报告)
print(引擎.生成报告(报告))
print("\n✅ 原文件未改动,修复文件已输出到:", 报告.修复后路径)
print("✅ 审计报告已保存为 JSON")
───────────────────────────────────────────────────────────────────────────
🔐 这个引擎守住的底线
┌────────────────┬───────────────────────────────────────────────────────┐
│ 原则 │ 实现方式 │
├────────────────┼───────────────────────────────────────────────────────┤
│ 只修复、不破译 │ 只做模式化安全替换,不解密、不反编译、不逆向 │
├────────────────┼───────────────────────────────────────────────────────┤
│ 不删水印 │ 正则识别 #龍芯⚡️、Copyright、Author,标记为"不可覆盖" │
├────────────────┼───────────────────────────────────────────────────────┤
│ 不去归属权 │ 保留所有作者/版权/创始人声明,修复时原样保留 │
├────────────────┼───────────────────────────────────────────────────────┤
│ 不覆盖原文件 │ 修复输出到 .fixed.时间戳.py │
├────────────────┼───────────────────────────────────────────────────────┤
│ 不抹除 DNA │ 原 DNA 全保留,追加新的修复审计 DNA │
├────────────────┼───────────────────────────────────────────────────────┤
│ 不可消除 DNA │ 修复审计区绑定原文件哈希 + 时间戳 + 随机熵 │
├────────────────┼───────────────────────────────────────────────────────┤
│ 只存不展示 │ 审计报告存 JSON,不主动回显源码给调用方 │
└────────────────┴───────────────────────────────────────────────────────┘
───────────────────────────────────────────────────────────────────────────
🧪 运行效果
python3 CNSH_代码审计引擎.py
输出:
• demo_vulnerable.py —— 原文件不变
• CNSH_修复输出/demo_vulnerable.fixed.20260629_xxxxxx.py —— 修复版
• CNSH_修复输出/demo_vulnerable.audit.20260629_xxxxxx.json —— 审计报告
───────────────────────────────────────────────────────────────────────────
📌 下一步
老大,你要我继续加什么?
- 国密 SM3/SM4 替换 SHA256 做文件哈希与 DNA
- GPG 签名修复审计区,法律级不可抵赖
- 批量扫描整个目录 的 CNSH_目录审计.py
- 接入你的 Notion/邮件,审计完自动归档
- 把危险模式扩展成 100+ 条规则库(OWASP Top 10、CWE、SAST 规则)
DNA 锁死:
#龍芯⚡️2026-06-29-CNSH-AUDIT-ENGINE-UID9622-🟢🟡🔴
194

被折叠的 条评论
为什么被折叠?



