低风险 — 风险评分 15/100
上次扫描:2 天前 重新扫描
15 /100
scnet-chat
通过自然语言交互管理 SCNet Chat 超算平台,支持区域切换、用户信息查询、账户余额查询、作业管理和文件管理
SCNet Chat 超算平台管理工具,代码结构清晰,无恶意行为。subprocess 使用安全(无 shell=True),凭证仅存储在本地配置文件和缓存中,外部网络请求仅限于 SCNet 官方域名,存在轻微的文档-行为差异(filesystem:WRITE 未声明)。
技能名称scnet-chat
分析耗时99.9s
引擎pi
可以安装
建议补充 SKILL.md 中关于缓存文件写入能力的说明。建议锁定 aiohttp 依赖版本以避免依赖漏洞风险。

安全发现 4 项

严重性 安全发现 位置
低危
文档未声明缓存写入能力
SKILL.md 声明了文件管理操作但未明确提及缓存文件(~/.scnet-chat-cache-*.json)的创建和写入。CacheManager.save() 会持久化 token 和区域信息。
def save(self, cache: Dict[str, Any]):
    with open(get_cache_path(), 'w', encoding='utf-8') as f:
        json.dump(cache, f, ...)
→ 在 SKILL.md '依赖安装' 章节后添加缓存文件位置说明
scripts/cache.py:634
低危
aiohttp 依赖无版本上限
SKILL.md 中 pip install aiohttp 未指定上限版本,当前为 aiohttp>=3.7.0,可能引入已知漏洞的依赖版本。
python -m pip install aiohttp
→ 建议锁定版本范围,如 aiohttp>=3.7.0,<3.12.0
SKILL.md:31
提示
subprocess 调用模式合规
所有 subprocess 调用使用列表传参([sys.executable, script_path, ...]),无 shell=True,无命令注入风险。
subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='replace', timeout=timeout)
→ 保持当前模式,无需修改
scnet.py:661
提示
凭证存储于用户本地配置文件
AK/SK 存储在 ~/.scnet-chat.env,token 缓存于 ~/.scnet-chat-cache-*.json,均在用户主目录,无外泄风险。
CONFIG_PATH = Path.home() / ".scnet-chat.env"
→ 建议在 SECURITY.md 中强调 chmod 600 权限设置
scripts/config.py:17
资源类型声明权限推断权限状态证据
文件系统 READ WRITE ✓ 一致 scripts/cache.py:634 — CacheManager.save() 写缓存到 ~/.scnet-chat-cache-*.json; scri…
网络访问 READ READ ✓ 一致 所有请求发往官方域名 api.scnet.cn / www.scnet.cn / ksefile.hpccube.com,无外部泄露
命令执行 NONE NONE scnet.py:661 — subprocess.run() 使用列表传参,无 shell=True,无命令注入风险
环境变量 NONE NONE grep 未发现 os.environ 遍历或凭证收割
技能调用 NONE NONE 未发现动态 skill 加载或远程执行
剪贴板 NONE NONE 未使用剪贴板 API
浏览器 NONE NONE 未使用浏览器自动化
数据库 NONE NONE 无数据库访问
16 项发现
🔗
中危 外部 URL 外部 URL
https://api.scnet.cn
SECURITY.md:57
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn
SECURITY.md:58
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/
SECURITY.md:144
🔗
中危 外部 URL 外部 URL
https://tools.ietf.org/html/rfc7519
SECURITY.md:145
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ui/console/index.html#/personal/auth-manage
SKILL.md:84
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/jobmanager/job.html
SKILL.md:238
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/safecertification/get-user-tokens-aksk.html
scripts/cache.py:295
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/safecertification/get-center-info.html
scripts/cache.py:335
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/jobmanager/list-cluster.html
scripts/cache.py:350
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/jobmanager/query-user-queue.html
scripts/cache.py:365
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/userresource/get-common-user.html
scripts/cache.py:380
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/jobmanager/query-user-quota.html
scripts/cache.py:395
🔗
中危 外部 URL 外部 URL
https://www.scnet.cn/ac/openapi/doc/2.0/api/jobmanager/query-used-time.html
scripts/cache.py:411
🔗
中危 外部 URL 外部 URL
https://ksefile.hpccube.com:65241/efile
scripts/cache.py:657
🔗
中危 外部 URL 外部 URL
https://ksefile.hpccube.com:65241
scripts/cache.py:657
🔗
中危 外部 URL 外部 URL
https://ksefile.hpccube.com:65241/
scripts/cache.py:658

目录结构

11 文件 · 266.3 KB · 7099 行
Python 8f · 6400L Markdown 2f · 677L Env 1f · 22L
├─ 📁 scripts
│ ├─ 🐍 cache.py Python 1380L · 54.6 KB
│ ├─ 🐍 compat.py Python 41L · 1.3 KB
│ ├─ 📄 config.example.env Env 22L · 510 B
│ ├─ 🐍 config.py Python 164L · 5.4 KB
│ ├─ 🐍 file.py Python 821L · 30.1 KB
│ ├─ 🐍 job.py Python 1634L · 63.7 KB
│ ├─ 🐍 user.py Python 829L · 28.4 KB
│ └─ 🐍 utils.py Python 260L · 7.7 KB
├─ 🐍 scnet.py Python 1271L · 49.9 KB
├─ 📝 SECURITY.md Markdown 146L · 4.1 KB
└─ 📝 SKILL.md Markdown 531L · 20.8 KB

依赖分析 1 项

包名版本来源已知漏洞备注
aiohttp >=3.7.0 pip 无版本上限约束,建议锁定版本范围

安全亮点

✓ 所有网络请求发往 SCNet 官方域名(api.scnet.cn / www.scnet.cn / ksefile.hpccube.com),无第三方域名或数据外泄
✓ subprocess.run 使用列表参数,无 shell=True,无命令注入风险
✓ HMAC-SHA256 签名用于 AK/SK 认证,凭证不直接暴露在请求路径中
✓ 无 base64|bash 管道、裸 IP 网络请求、eval(atob(...)) 等高危模式
✓ 无遍历 os.environ 收割敏感凭证行为
✓ base64 仅用于 JWT token 解码(提取 computeUser),用途合法
✓ 使用 ssl.create_default_context() 进行 TLS 连接
✓ 代码结构良好,模块化清晰,易于审计