Skip to content

Latest commit

 

History

History
164 lines (127 loc) · 9.43 KB

File metadata and controls

164 lines (127 loc) · 9.43 KB

2026-03-16 09:40 (Asia/Shanghai)

完成内容:

  • 确认 ROADMAP P0-P4 全部落地,275 个测试通过,零回归
  • 版本号从 0.2.0 升至 0.3.0(pyaegis/cli.py + pyproject.toml)
  • 补写 CHANGELOG v0.3.0,完整记录跨模块调用图、框架感知 Source、条件约束规则引擎、LLM Auto-Remediation、增量扫描、Django CBV 追踪等全部 P1-P4 特性
  • commit 9d52176 已 push 到 main
  • 用 pip-audit 核查依赖漏洞:PyAegis 直接依赖(pyyaml 6.0.3)无已知漏洞;Dependabot moderate 告警来自 dev/docs 依赖(mkdocs-material 间接依赖),不影响运行时安全,暂不处理

遇到问题:

  • pip-audit 扫描系统全局环境返回 38 个漏洞,均为其他项目依赖,与 PyAegis 无关;改用 pip show 逐一确认直接依赖版本
  • gh CLI 未登录,无法通过 API 查 Dependabot 详情;浏览器节点也未连接;通过 pyproject.toml 依赖树人工分析确认漏洞来源
  • PowerShell 不支持 &&,所有命令改用 Set-Location + 分号分隔

下一步:

  • 可选:升级 mkdocs-material 或其间接依赖以消除 Dependabot 告警(pip install --upgrade mkdocs-material)
  • 可选:为 v0.3.0 打 git tag 并发布 GitHub Release
  • 可选:PRODUCT_RESEARCH.md 产品调研文档
  • 可选:pyaegis fix 端到端集成测试补全

PyAegis 进度日志


2026-03-16 09:34 (Asia/Shanghai)

完成内容:

  • 全面审查 ROADMAP:确认 P0(跨模块调用图)、P1(框架感知 Source)、P2(条件约束规则引擎)、P3(LLM Auto-Remediation)、P4(增量分析缓存)均已实现,275 个测试全部通过,零回归
  • 清理项目根目录遗留的 11 个调试/临时脚本(build_taint.pywrite_taint.pybytes_check.py 等),删除约 947 行无效代码
  • commit b0bc9ec 已 push 到 main
  • 注意:GitHub Dependabot 检测到 1 个 moderate 级依赖漏洞,待处理

遇到问题:

  • PowerShell 不支持 && 作为命令分隔符,改用 workdir 参数 + 分步执行
  • 部分已删除文件为 untracked(从未 git add),需用 git add -u 而非 git rm 来 stage 删除

下一步:

  • 查看并修复 GitHub Dependabot moderate 漏洞(pip-audit 或直接升级依赖)
  • 考虑为 CHANGELOG 补充 v0.3.0 条目,记录 P1-P4 的完整落地
  • 可选:pyaegis fix 子命令 CLI 入口(LLMRemediationEngine 已有实现,CLI 尚未暴露)
  • 可选:PRODUCT_RESEARCH.md 产品调研文档

2026-03-16 09:20 (Asia/Shanghai)

完成内容:

  • 实现 Django CBV self.request 跨方法污染追踪(commit ef34542
    • taint.py _analyze_function:在进入任意 CBV HTTP 方法(get/post/put/patch/delete/head/options/trace)时,预种 _instance_taints["self"]["request"],模拟 Django View.setup()self.request = request 赋值行为
    • taint.py _is_tainted_expr:新增「污点接收者传播」规则——当方法调用的 receiver(obj.method())本身是污点时,调用返回值也视为污点。解决 self.request.GET.get('key') 这类链式调用无法传播污点的问题
    • 新增 10 个测试(tests/test_django_cbv_self_request.py),覆盖全部 8 个 HTTP 动词、sanitizer 截断、FBV 回归、CBV+FBV 混合场景,全部通过
    • 全量 275 个测试通过,零回归

遇到问题:

  • PyASTParser() 需要 filepath 参数,测试 helper 改为写临时文件后解析
  • CBV self.request 预种后,self.request.GET.get('cmd') 仍不报——因为 .get()ast.Call,走 inter-procedural 路径找不到符号就返回 False;加入 receiver 污点传播规则后修复
  • pre-commit black 格式化两个文件,re-add 后重新提交

下一步:

  • TaintTracker 中支持实例方法调用追踪(self.method() 形式,无 GlobalSymbolTable 时的轻量路径)
  • 推进 ROADMAP P2:强化规则引擎条件约束(subprocess.run(cmd, shell=False) 误报消除)
  • 可选:PRODUCT_RESEARCH.md 产品调研文档

2026-03-16 09:10 (Asia/Shanghai)

完成内容:

  • 实现框架感知精确污染参数注入(commit 4f3a613
    • registry.py 新增 get_tainted_params() 聚合函数,合并所有匹配 modeler 的结果(解决 Flask/FastAPI 路由模式重叠时 source_params 丢失问题)
    • FlaskModeler.get_tainted_params():返回所有非 self URL kwargs
    • FastAPIModeler.get_tainted_params():合并 args + source_params,去重
    • DjangoModeler.get_tainted_params():已有实现,无需修改
    • taint.py analyze_cfg:路由函数分支改为调用框架接口精确污染,无结果时才回退到全量非 self 参数
  • 新增 19 个测试(tests/test_precise_taint_params.py),全部通过,零回归(总计 269 个测试)

遇到问题:

  • registry.py edit 时 docstring 首行 """ 丢失导致 IndentationError,直接覆写修复
  • registry 首次实现只取第一个匹配 modeler,Flask 先注册导致 FastAPI source_params 被跳过;改为合并所有匹配 modeler 结果后修复
  • 测试文件中间有重复 import 被 flake8 拦截(E402),整理到顶部后通过

下一步:

  • 推进 ROADMAP P1:Django CBV 跨方法 self.request 污染追踪
  • TaintTracker 中支持实例方法调用追踪(self.method() 形式)
  • 可选:创建 PRODUCT_RESEARCH.md 产品调研文档

2026-03-16 09:02 (Asia/Shanghai)

完成内容:

  • 新增 DjangoModeler(pyaegis/frameworks/django_modeler.py
    • 覆盖 FBV(request 参数启发式)、装饰器模式(login_requiredcsrf_exemptrequire_POSTapi_view 等 20+ 种)、CBV HTTP 方法(get/post/put/patch/delete/head/options/trace)、DRF @api_view、URL conf 显式路由元数据
    • get_tainted_params() 返回全部非 self 参数(request + URL kwargs)
  • 注册 DjangoModeler 到框架注册表(与 Flask、FastAPI 并列)
  • 新增 16 个测试(单元 + 集成),全部通过,零回归(总计 250 个测试)
  • commit 4a10241 已 push 到 main

遇到问题:

  • pre-commit black 自动格式化了两个文件,flake8 拦截未使用的 import(ast、pytest、GlobalSymbolTable),清理后重新提交成功

下一步:

  • 在 TaintTracker 中利用 get_tainted_params() 接口,让 DjangoModeler(以及 Flask/FastAPI)精确控制哪些参数被污染,而非全量污染
  • 推进 ROADMAP P1:完善 Django CBV 跨方法 self.request 污染追踪
  • 可选:创建 PRODUCT_RESEARCH.md 产品调研文档

2026-03-16 07:35 (Asia/Shanghai)

完成内容:

  • 扩充跨模块 sanitizer 截断链路测试,在 tests/test_cross_module.py 新增 3 个场景:
    1. sanitizer → wrapper → sink:clean 值经包装仍保持 clean(不误报)
    2. callee 内部先 sanitize 再 sink:应不报
    3. 补齐已有跨模块 sanitizer 截断场景,修复 lint
  • 所有测试通过(pytest exit code 0)
  • commit 1b93e033 已 push 到 main

遇到问题:

  • 尝试为 call graph 添加类方法/装饰器支持,但会破坏 interprocedural/cross_module 现有测试(symbol table key 索引方式变化),已回退,避免引入回归

下一步:

  • 重新设计类方法/装饰器支持方案,确保不破坏现有测试
  • 推进 PRODUCT_RESEARCH.md 的产品调研文档(当前不存在)
  • 继续扩展污点分析核心能力

2026-03-16 08:30 (Asia/Shanghai)

完成内容:

  • 重新设计并实现 GlobalSymbolTable 类方法索引支持
  • 新增 _register_function() 辅助方法,统一处理顶层函数和类方法注册
  • 新增 _register_class_methods(),遍历 ast.ClassDef 体,注册全部方法
  • qualname 格式:module.ClassName.method_name(顶层函数格式不变,零回归)
  • by-name 索引和 by-file 索引同步更新,get_by_name() 对类方法正常工作
  • 新增 4 个测试:qualname 查找、args 含 self、get_by_name、跨模块 dao 场景
  • 全套 234 个测试通过,commit 5f1a3d1

遇到问题:

  • 第一次 edit 工具调用未生效(oldText 有隐形字符差异),第二次精准替换成功
  • 测试里误留了未使用的 import,pre-commit flake8 拦截,已清理

下一步:

  • 利用新的类方法索引,在 TaintTracker 中支持实例方法调用追踪(self.method() 形式)
  • 推进 ROADMAP P1:框架感知 Source 自动发现(FastAPI/Django 完整覆盖)
  • 可选:创建 PRODUCT_RESEARCH.md 产品调研文档

2026-03-16 10:10 (Asia/Shanghai)

完成内容:

  • 实现 ROADMAP P1:FastAPI 显式 Source 标注识别
    • 新增 _FASTAPI_SOURCE_CALLS frozenset,覆盖 Query(), Body(), Header(), Path(), Form(), Cookie(), File(), UploadFile 及其 fully-qualified / starlette 变体
    • 新增 _is_fastapi_source_call() 方法,支持 import alias 解析(如 rom fastapi import Query as Q)
    • 更新 _extract_source_params 同时调用 _is_depends_call 和 _is_fastapi_source_call,正向/关键字参数均覆盖
    • 新增 10 个测试(Query/Body/Header/Path/Form/Cookie/File、alias import、sanitizer 抑制、混合 Depends+Query)
    • 全套 288 个测试通过,零回归
  • commit 7e80280 已 push 到 main

遇到问题:

  • pre-commit black 自动格式化两个文件,flake8 拦截未使用的 pytest import,清理后重新提交成功

下一步:

  • TaintTracker 中支持实例方法调用追踪(self.method() 形式),利用 GlobalSymbolTable 类方法索引
  • ROADMAP P1 剩余:Django ORM raw() vs filter() 语义区分
  • 可选:PRODUCT_RESEARCH.md 产品调研文档