Files
NebulaShell/问题报告.md
2026-05-04 21:19:34 +08:00

7.4 KiB
Raw Blame History

NebulaShell 代码审查报告

审查日期2026-05-04


一、严重问题

1. plugin-storage 路径穿越漏洞CRITICAL

文件: store/NebulaShell/plugin-storage/main.py:131-132

def _resolve_path(self, path: str) -> Path:
    return self.data_dir.resolve()  # 完全忽略了 path 参数!

_resolve_path 方法完全忽略传入的 path 参数,始终返回 data_dir 本身。这意味着 read_file("../../../etc/passwd")read_file("safe.txt") 都返回同一个路径。虽然这避免了路径穿越,但文件读写功能实际上被破坏了——所有文件操作都指向同一个目录。serve_file 方法(第 96-129 行)有正确的路径穿越检查,但 _resolve_path 没有使用它。


2. plugin-storage 方法实现完全错误CRITICAL

文件: store/NebulaShell/plugin-storage/main.py

多个方法实现与签名完全不符:

  • get()(第 17-20 行):参数是 key, default,但方法体写的是 self._data[key] = valueset 的逻辑),且 _save() 未定义
  • delete()(第 22-24 行):返回 key in self._data 而不是执行删除
  • keys()(第 26-29 行):调用 self._data.clear() 清空数据,然后 _save() 未定义
  • size()(第 31-33 行):返回 self._data.copy() 而不是长度
  • set_many()(第 35-40 行):返回一个字典而不是执行设置操作

3. http-api 路由处理未实现CRITICAL

文件: store/NebulaShell/http-api/router.py:2-4

class HttpRouter:
    def handle(self, request: Request) -> Response:
        pass  # 空实现!

HTTP 路由的 handle() 方法为空,所有 HTTP 请求都会返回 None,导致服务器无法正常响应。


4. http-apiinit() 调用 self.server.start()serverNoneCRITICAL

文件: store/NebulaShell/http-api/main.py:7-8

def init(self, deps: dict = None):
    self.server.start()  # self.server 是 None

__init__self.server = None,但 init() 直接调用 self.server.start(),会抛出 AttributeError


5. code-reviewer 核心逻辑未实现HIGH

文件: store/NebulaShell/code-reviewer/core/reviewer.py:10-34

run_check 方法中使用了未定义的变量 filepath(第 14 行),且没有文件遍历逻辑。main.py 中的 check() 方法也是 pass。整个代码审查插件实际上无法运行


6. code-reviewer 引用检查器使用未定义变量HIGH

文件: store/NebulaShell/code-reviewer/checks/references.py

  • _scan_project_modules(第 43-53 行):使用了未定义的 dir_pathbase_name 变量
  • _scan_plugin_modules(第 55-62 行):同样使用了未定义的变量
  • check()(第 64-104 行):使用了未定义的 tree 变量
  • _is_module_available()(第 125-155 行):参数是 module_name, file_path,但方法体使用了未定义的 module_name(第 125 行)

二、安全问题

7. CORS 配置过于宽松MEDIUM

文件: store/NebulaShell/http-api/server.py:72-74

self.send_header("Access-Control-Allow-Origin", "*")

OPTIONS 预检请求返回 Access-Control-Allow-Origin: *,但配置中实际设置了允许的来源列表。应使用配置中的 CORS_ALLOWED_ORIGINS


8. 限流器线程安全问题MEDIUM

文件: store/NebulaShell/http-api/rate_limiter.py:156-168

_is_rate_limited 方法中使用了 self.requests[limit_key] 但没有加锁,且使用了 popleft()self.requests[limit_key] 初始化为 [](列表,不是 deque会抛出 AttributeError


9. CSRF 中间件缺少 json 导入MEDIUM

文件: store/NebulaShell/http-api/csrf_middleware.py:138

第 138 行使用了 json.dumps(),但 json 只在第 168 行的局部作用域中导入。模块顶部没有 import json


10. 插件加载器 _load_config 安全检查可绕过LOW

文件: store/NebulaShell/plugin-loader/main.py:433-436

for p in ['import ', 'from ', 'open(', 'exec(', 'eval(', 'compile(', 'os.', 'sys.', 'subprocess', 'lambda', 'def ', 'class ']:
    if p in content:

这种字符串包含检查很容易被绕过,例如 import (多加空格)、#import(注释中)等。


三、代码质量问题

11. 大量空方法和未实现功能HIGH

  • oss/plugin/base.py:空文件
  • http-api/router.pyhandle() 空实现
  • code-reviewer/main.pycheck() 空实现
  • code-reviewer/checks/quality.py_calculate_complexity() 空实现
  • code-reviewer/checks/references.py_is_name_defined() 空实现

12. 重复的中间件实现MEDIUM

文件: store/NebulaShell/http-api/middleware.pystore/NebulaShell/http-api/rate_limiter.py

RateLimitMiddleware 在两个文件中都有实现(middleware.py:87-201rate_limiter.py:41-122),功能重复。MiddlewareChain 使用的是 middleware.py 中的版本,而 rate_limiter.py 中的版本未被使用。


13. plugin-storage_load() 方法始终写空数据MEDIUM

文件: store/NebulaShell/plugin-storage/main.py:12-15

def _load(self):
    data_file = self.data_dir / "data.json"
    with open(data_file, "w", encoding="utf-8") as f:
        json.dump(self._data, f, ...)

_load() 方法名暗示加载数据,但实际上是用空数据覆盖文件。每次初始化都会清空持久化数据。


14. plugin-storagestop() 方法在 start() 之前执行配置加载MEDIUM

文件: store/NebulaShell/plugin-storage/main.py:164-181

stop() 方法中加载配置并初始化 shared,但 start() 中只是打印日志。配置加载应该在 start()init() 中完成。


15. 成就系统异常被静默吞掉LOW

多处代码使用 try/except Exception: pass 模式,隐藏了潜在的错误,不利于调试。


16. 硬编码的配置默认值不一致LOW

oss/config/config.pyHOST 默认值为 127.0.0.1,但 http-api/server.py:30HttpServer.__init__ 的默认值是 "0.0.0.0",存在不一致。


四、架构问题

17. 插件加载顺序依赖隐式约定

plugin-loader 通过 load_priority: "first" 标记和硬编码的 core_plugins 集合来控制加载顺序,缺乏清晰的优先级机制。


18. use() 函数绕过插件管理器

plugin-bridge/main.py 中的 use() 函数可以直接从文件系统加载插件实例,绕过了 plugin-loader 的权限检查和生命周期管理。


19. 测试覆盖率不足

测试文件主要集中在配置和日志等基础功能,核心的 HTTP 路由、插件加载、安全中间件等功能缺乏有效测试。


总结

等级 数量 关键问题
CRITICAL 4 路径穿越、方法实现错误、路由空实现、空指针
HIGH 3 代码审查器不可用、未定义变量
MEDIUM 5 CORS、线程安全、重复实现、数据丢失
LOW 3 安全检查绕过、异常静默、配置不一致

最紧急的修复项

  1. 修复 plugin-storage 的所有方法实现
  2. 实现 http-api 的路由处理
  3. 修复 http-apiinit() 空指针问题
  4. 修复 code-reviewer 的未定义变量
  5. 统一限流器实现,修复线程安全问题