mcpField
S
security-misconfiguration

security-misconfiguration

github.com/scholarly360安全2245 次安装29 周前更新
代码仓库

关于 security-misconfiguration

面向 Python Web 应用安全审计的技能,覆盖 Flask 和 FastAPI 的常见安全配置问题。它结合 Bandit 扫描、分类检查清单与修复验证流程,帮助整理含 CWE、严重性和修复建议的报告。

主要功能

  1. 01检查调试模式与硬编码密钥
  2. 02审查 API 文档暴露及安全响应头
  3. 03检查 Cookie、XML 与基础设施配置
  4. 04使用 Bandit 执行静态扫描
  5. 05生成含 CWE 和修复建议的报告

适用场景

  1. 01审计 Flask 或 FastAPI 应用
  2. 02发布前检查安全配置
  3. 03修复后重新验证安全问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/scholarly360/owasp-top10-web-skills --skill security-misconfiguration

安装后在 Claude Code 中输入/security-misconfiguration确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
fastapi-hardening.md
flask-hardening.md
security-headers.md

详细介绍

安全配置错误(OWASP A02:2025)

安全配置错误在 OWASP Top 10:2025 中从第 5 位跃升至第 2 位,在3.00% 的应用程序中发现,出现次数超过719,000 次。当系统从安全角度配置不当时,就会出现此问题;而在 Python Web 应用中,攻击面很广。


工作流

  1. 识别框架 — Flask、FastAPI,或两者都有
  2. 运行静态检查 — 使用 Bandit 进行 SAST 扫描(参见工具部分)
  3. 逐项检查清单 — 检查以下各类别,并标记问题
  4. 生成报告 — 列出发现的问题、CWE ID、严重性和修复代码片段
  5. 验证修复 — 修复后重新运行 Bandit 和动态标头扫描

如需深入了解任一类别,请阅读:

  • references/flask-hardening.md — Flask 专属设置和扩展
  • references/fastapi-hardening.md — FastAPI 专属设置和中间件
  • references/security-headers.md — 完整的标头参考,含 CSP 示例

按类别划分的检查清单

1. 暴露调试模式(严重)

Flask

# BAD — never in production
app.run(debug=True)
app = Flask(__name__, debug=True)

# BAD — environment variable
# FLASK_DEBUG=1

# GOOD
app.run(debug=False)
# or: rely on FLASK_ENV=production (Flask 2.x) / FLASK_DEBUG=0
  • Werkzeug 的交互式调试器可通过绕过 PIN 执行任意代码
  • Bandit 规则:B201(flask_debug_true)

FastAPI — 没有相当于调试模式的功能,但暴露 /docs 和 /redoc 的风险类似(参见 §3)


2. 硬编码的机密信息(严重)

检测以下模式:

# BAD
SECRET_KEY = "supersecretkey123"
DATABASE_URL = "postgresql://user:password@host/db"
JWT_SECRET = "my-jwt-secret"
AWS_SECRET_ACCESS_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

正确做法:

import os
SECRET_KEY = os.environ["SECRET_KEY"]          # raises if missing — intentional
DATABASE_URL = os.environ.get("DATABASE_URL")  # or use python-dotenv / pydantic-settings
  • Bandit 规则:B105、B106、B107(hardcoded_password_*)
  • 也要标记:提交到版本控制中的 .env 文件内的机密信息
  • 主要 CWE: CWE-526(环境变量中的敏感信息)、CWE-321(硬编码的加密密钥)

3. 暴露 API 文档(高)

FastAPI — 生产环境中必须禁用 /docs(Swagger UI)和 /redoc:

# BAD — default behaviour exposes full API schema
app = FastAPI()

# GOOD — disable in production
import os
docs_url = None if os.getenv("ENV") == "production" else "/docs"
redoc_url = None if os.getenv("ENV") == "production" else "/redoc"
app = FastAPI(docs_url=docs_url, redoc_url=redoc_url)
  • 如果必须保留文档,应通过身份验证中间件或 IP 允许列表进行保护
  • 也要标记:未设置身份验证的 Flask flask-swagger-ui 或 flasgger 蓝图

4. 缺少或薄弱的安全标头(高)

扫描 HTTP 响应中的以下标头。生产环境中必须全部设置。

标头必需值 / 模式
Strict-Transport-Securitymax-age=31536000; includeSubDomains
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY 或 SAMEORIGIN
Content-Security-Policy根据域名设置;至少禁止 unsafe-inline
Referrer-Policystrict-origin-when-cross-origin
Permissions-Policy根据需要限制摄像头、麦克风和地理位置权限

Flask — 使用 flask-talisman:

from flask_talisman import Talisman
Talisman(app, force_https=True, content_security_policy={
    "default-src": "'self'",
    "script-src": ["'self'", "cdn.example.com"],
})

FastAPI — 使用中间件:

from starlette.middleware.httpsredirect import HTTPSRedirectMiddleware
from starlette.middleware import Middleware
from secure import SecureHeaders  # 'secure' package

secure_headers = SecureHeaders()

@app.middleware("http")
async def set_secure_headers(request, call_next):
    response = await call_next(request)
    secure_headers.starlette(response)
    return response

主要 CWE: CWE-16(配置)、CWE-1021(帧限制不当)


5. Cookie 标志不安全(高)

Flask 会话 Cookie:

# BAD defaults — cookies sent over HTTP, accessible by JS
app.config["SESSION_COOKIE_SECURE"] = False
app.config["SESSION_COOKIE_HTTPONLY"] = False

# GOOD
app.config.update(
    SESSION_COOKIE_SECURE=True,       # HTTPS only
    SESSION_COOKIE_HTTPONLY=True,     # No JS access
    SESSION_COOKIE_SAMESITE="Lax",   # CSRF protection
    SESSION_COOKIE_NAME="__Host-session",  # __Host- prefix enforces additional constraints
    PERMANENT_SESSION_LIFETIME=3600,  # 1-hour expiry
)

FastAPI — 手动设置 Cookie 时:

response.set_cookie(
    key="session",
    value=token,
    httponly=True,
    secure=True,
    samesite="lax",
    max_age=3600,
)

主要 CWE: CWE-614(敏感 Cookie 未设置 Secure)、CWE-1004(敏感 Cookie 未设置 HttpOnly)


6. XML 外部实体(XXE)处理(高)

标记任何未显式禁用外部实体的 XML 解析:

# BAD — lxml with default parser
from lxml import etree
tree = etree.parse(xml_input)  # vulnerable

# BAD — stdlib xml.etree (not vulnerable to XXE by default, but flag for review)
import xml.etree.ElementTree as ET
ET.fromstring(user_input)  # safe in CPython, but document why

# GOOD — lxml with entity expansion disabled
parser = etree.XMLParser(
    resolve_entities=False,
    no_network=True,
    load_dtd=False,
)
tree = etree.parse(xml_input, parser)

# GOOD — use defusedxml for untrusted input
import defusedxml.ElementTree as ET
tree = ET.fromstring(user_input)
  • Bandit 规则:B405、B408、B410(xml_* 规则)
  • 主要 CWE: CWE-611(XXE)

7. 不必要的功能 / 攻击面(中)

检查生产环境中不应存在的服务、路由或中间件:

  • Werkzeug profiler — 在生产环境中移除 ProfilerMiddleware
  • Flask shell — 禁用 /console 路由或限制其访问
  • 管理界面 — flask-admin、sqladmin 必须设置身份验证并限制 IP
  • 调试端点 — 标记任何返回 sys.environ、堆栈跟踪或内部状态的路由
  • 未使用的中间件 — 审核 Flask 中的 app.wsgi_app 链,以及 FastAPI 中的 app.middleware_stack

8. 云端/基础设施配置错误(中)

代码级扫描无法发现所有基础设施配置错误,但应标记以下模式:

  • 代码中的 S3 存储桶名称 — 检查是否存在公开 ACL 模式或缺少存储桶策略
  • 数据库连接字符串 — 如果连接使用 sslmode=disable,则标记
  • CORS 过于宽松:
# BAD — FastAPI
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True)
# allow_origins=["*"] + allow_credentials=True is rejected by browsers but signals intent error

# GOOD
app.add_middleware(CORSMiddleware,
    allow_origins=["https://app.example.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST"],
    allow_headers=["Authorization", "Content-Type"],
)

# BAD — Flask
from flask_cors import CORS
CORS(app, origins="*")

# GOOD
CORS(app, origins=["https://app.example.com"], supports_credentials=True)

关键 CWE: CWE-16(配置)


工具

Bandit(SAST)——主要工具
pip install bandit
bandit -r ./app -f json -o bandit-report.json

# Focus on misconfiguration-relevant rules:
bandit -r ./app -t B105,B106,B107,B201,B405,B408,B410

A02 的关键 Bandit 规则:

规则描述
B105硬编码密码字符串
B106硬编码密码函数参数
B107硬编码密码默认值
B201flask_debug_true
B405import xml.etree — 建议使用 defusedxml
B408import xml.minidom — 建议使用 defusedxml
B410import lxml — 标记以供 XXE 审查
OWASP ZAP(DAST)——标头与配置验证
# Docker quick scan — checks headers, misconfigured endpoints, debug info leaks
docker run -t owasp/zap2docker-stable zap-baseline.py \
  -t https://your-app.example.com \
  -r zap-report.html

ZAP 会自动检测:缺失的安全标头、暴露的堆栈跟踪、目录列表、调试端点和不安全的 Cookie。

python-dotenv + pydantic-settings(预防)
pip install python-dotenv pydantic-settings
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    secret_key: str              # required — fails fast if missing
    database_url: str
    debug: bool = False          # safe default
    env: str = "production"

    class Config:
        env_file = ".env"        # loaded only in dev; never committed

settings = Settings()

关键 CWE 汇总

CWE描述严重性
CWE-16配置(兜底项)高
CWE-489活跃的调试代码严重
CWE-526环境变量中的敏感信息高
CWE-321硬编码的加密密钥严重
CWE-611XML 外部实体(XXE)高
CWE-614敏感 Cookie 缺少 Secure 属性高
CWE-1004敏感 Cookie 缺少 HttpOnly 属性高

快速审计命令

运行这条单行命令,快速扫描任意 Python 项目的 A02 攻击面:

bandit -r . -t B105,B106,B107,B201,B405,B408,B410 --severity-level medium \
  && grep -rn "debug=True\|FLASK_DEBUG=1\|allow_origins=\[.\"\*\"\]\|verify=False" . \
  && echo "Manual checks needed: /docs exposure, cookie flags, security headers"

评论

支持 Markdown