Python 代码审计:常见的注入漏洞与静态检测工具

一、常见注入漏洞类型
  1. SQL 注入
    当用户输入直接拼接 SQL 查询时产生:

    # 漏洞示例
    query = "SELECT * FROM users WHERE name = '" + user_input + "'"
    cursor.execute(query)  # 攻击者可输入 `' OR 1=1 --` 绕过验证
    

    修复方案:使用参数化查询

    cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,))
    

  2. 命令注入
    通过 os.systemsubprocess 执行未过滤的用户输入:

    # 漏洞示例
    os.system("ping " + user_input)  # 输入 `8.8.8.8; rm -rf /` 可执行恶意命令
    

    修复方案:使用 shlex.quote() 过滤或避免直接调用 shell

    subprocess.run(["ping", user_input], check=True)
    

  3. 模板注入
    模板引擎(如 Jinja2)中直接渲染用户输入:

    # 漏洞示例
    template = Template("Hello {{ name }}!")
    template.render(name=user_input)  # 输入 `{{7*7}}` 可泄露计算能力
    

    修复方案:严格过滤输入或使用沙箱环境

  4. 路径遍历
    未校验用户提供的文件路径:

    # 漏洞示例
    with open("/var/www/" + user_input) as f:  # 输入 `../../etc/passwd` 可读取敏感文件
    

    修复方案:使用 os.path.abspath() 和白名单校验


二、静态检测工具推荐
  1. Bandit

    • 功能:专为 Python 设计的 AST 分析工具,检测 SQL 注入、命令执行等漏洞
    • 安装pip install bandit
    • 使用
      bandit -r ./project_dir  # 扫描整个项目
      bandit -f html -o report.html  # 生成 HTML 报告
      

  2. Pylint

    • 功能:通用代码质量分析,通过插件支持安全检查(如 pylint-plugin-security
    • 安装pip install pylint pylint-plugin-security
    • 配置:在 .pylintrc 中添加:
      load-plugins=pylint_plugin_security
      

  3. Semgrep

    • 功能:基于模式的跨语言检测工具,支持自定义规则
    • 安装pip install semgrep
    • 使用
      semgrep --config "p/python"  # 使用官方规则库
      semgrep --config ./custom_rules.yaml  # 自定义规则
      

  4. Safety

    • 功能:依赖包漏洞扫描(如 CVE 漏洞库)
    • 安装pip install safety
    • 使用safety check

三、审计流程建议
  1. 自动化扫描
    使用上述工具进行初步筛查,重点关注高风险函数:

    • SQL 操作:execute()executemany()
    • 命令执行:os.system()subprocess.Popen()
    • 文件操作:open()shutil.copy()
  2. 手动验证

    • 检查用户输入是否经过过滤(如正则表达式、类型转换)
    • 验证敏感操作是否有权限控制
    • 测试边界值和异常输入(如空值、超长字符串)
  3. 持续集成
    将工具集成到 CI/CD 流程(示例 GitHub Actions 配置):

    jobs:
      security_scan:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - name: Run Bandit
            run: pip install bandit && bandit -r .
    

关键原则:始终遵循 最小权限原则输入验证原则,避免信任任何未经验证的用户输入。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐