dep_scan.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """PostToolUse hook (GLOBAL): 依赖变更后提示漏洞扫描。
  4. 检测到依赖清单文件被修改时,输出对应包管理器的漏洞扫描命令提示,
  5. 帮助 AI 在安装/更新依赖后主动检测已知漏洞(npm audit / pip-audit / composer audit)。
  6. 触发文件:
  7. - package.json / package-lock.json → npm audit
  8. - requirements.txt / Pipfile / pyproject.toml → pip-audit
  9. - composer.json / composer.lock → composer audit
  10. - go.mod / go.sum → govulncheck
  11. - pom.xml → mvn dependency-check
  12. - Gemfile / Gemfile.lock → bundle audit
  13. 输出为提示信息(exit 0),不阻断执行;AI 应根据提示决定是否运行扫描。
  14. """
  15. import sys
  16. import os
  17. import json
  18. # 依赖文件 → 扫描命令映射
  19. DEP_FILES = {
  20. "package.json": "npm audit --audit-level=moderate",
  21. "package-lock.json": "npm audit --audit-level=moderate",
  22. "yarn.lock": "yarn audit --level moderate",
  23. "pnpm-lock.yaml": "pnpm audit --audit-level moderate",
  24. "requirements.txt": "pip-audit -r requirements.txt",
  25. "pipfile": "pip-audit",
  26. "pipfile.lock": "pip-audit",
  27. "pyproject.toml": "pip-audit",
  28. "poetry.lock": "pip-audit",
  29. "composer.json": "composer audit",
  30. "composer.lock": "composer audit",
  31. "go.mod": "govulncheck ./...",
  32. "go.sum": "govulncheck ./...",
  33. "pom.xml": "mvn dependency-check:check",
  34. "gemfile": "bundle audit check",
  35. "gemfile.lock": "bundle audit check",
  36. }
  37. def main():
  38. try:
  39. raw = sys.stdin.read()
  40. if not raw.strip():
  41. return 0
  42. data = json.loads(raw)
  43. except Exception:
  44. return 0
  45. tool_input = data.get("tool_input", {}) or {}
  46. path = (
  47. tool_input.get("filePath")
  48. or tool_input.get("file_path")
  49. or tool_input.get("path")
  50. or ""
  51. )
  52. if not path:
  53. return 0
  54. basename = os.path.basename(path).lower()
  55. scan_cmd = DEP_FILES.get(basename)
  56. if not scan_cmd:
  57. return 0
  58. print("[DEP-SCAN] 检测到依赖文件变更: %s" % basename)
  59. print("建议执行漏洞扫描: %s" % scan_cmd)
  60. print("若存在已知漏洞,应在交付前在「已知限制/未验证项」中披露。")
  61. return 0
  62. if __name__ == "__main__":
  63. sys.exit(main())