Krishcalin/API-Security

GitHub: Krishcalin/API-Security

一款零依赖的 Python 静态分析工具,通过扫描源码、配置文件及规范文档来发现 API 安全漏洞并映射 OWASP Top 10。

Stars: 0 | Forks: 0

API Security Scanner Banner

# API 安全扫描器 一个开源、零依赖的基于 Python 的 **API 安全扫描器**,通过全面的静态分析来发现、审计和报告 **REST、GraphQL、gRPC、OpenAPI 规范和 API 网关配置** 中的 API 安全漏洞和配置错误 —— 映射到 **OWASP API Security Top 10 (2023)**。 **无需外部依赖** —— 在 Windows、macOS 和 Linux 上运行纯 Python 3.10+ 标准库。 ## 为什么需要 API 安全? 传统的应用程序扫描器会遗漏 API 特有的威胁。本扫描器通过检测以下问题填补了这一空白: - **失效的对象级别授权 (BOLA)** — 无所有权检查的直接 ID 引用、顺序 ID - **失效的身份认证** — 硬编码的 JWT 密钥、弱算法、禁用验证、URL 中的 API 密钥 - **批量赋值** — 请求体直接解包到模型中、过度的数据暴露 - **不受限制的资源消耗** — 缺少速率限制、无分页、无限制上传 - **失效的功能级别授权** — 无角色检查的管理员端点、权限提升 - **敏感业务流滥用** — 登录时无 CAPTCHA、未受保护的支付流程 - **服务端请求伪造 (SSRF)** — 服务器请求中的用户可控 URL、Webhook 滥用 - **安全配置错误** — CORS 通配符、调试模式、冗长错误、TLS 问题 - **不当的资产管理** — 影子 API、已弃用的端点、暴露的文档 - **不安全的 API 消费** — 未验证的第三方响应、无超时或熔断器 - **注入** — SQL、NoSQL、命令注入、XXE、路径遍历、LDAP 注入 - **敏感信息泄露** — 硬编码的 API 密钥、密码、私钥、数据库连接字符串 - **GraphQL 风险** — 启用内省、无深度限制、批量攻击、Mutation 缺少认证 - **gRPC 风险** — 不安全通道、启用反射、无限消息大小 - **API 网关配置错误** — 无速率限制或认证的 Nginx、Kong、Envoy、AWS API Gateway ## 功能特性 - 跨 22 个类别的 **100+ 安全规则** - **5 种合规框架** — OWASP API Top 10、PCI-DSS v4.0、GDPR、HIPAA、DORA - **API 资产发现** — 自动检测框架、协议、认证方法、网关、数据库 - **多协议** — REST、GraphQL、gRPC、OpenAPI/Swagger、Protobuf - **多语言** — Python、JavaScript/TypeScript、Java、Go、Ruby、PHP - **网关配置扫描** — Nginx、Kong、Envoy、AWS API Gateway - **K8s API 安全** — Ingress TLS、LoadBalancer 限制、NetworkPolicy、Secrets 挂载 - **3 种输出格式** — 彩色控制台、JSON、交互式 HTML - **退出代码** — 如果存在 CRITICAL 或 HIGH 发现则返回 `1`,否则返回 `0`(对 CI/CD 友好) - **单文件** — 整个扫描器是一个可移植的 Python 文件,无需 pip 安装 ## 安全检查组 (100+ 规则) | # | 类别 | 规则 ID | OWASP | 关键检查 | |---|----------|----------|-------|------------| | 1 | **BOLA** | API1-001 至 006 | API1 | 直接对象 ID 访问、无认证的路径参数、顺序 ID | | 2 | **Broken Authentication** | API2-001 至 010 | API2 | 缺少认证装饰器、JWT 硬编码/弱/未验证、URL 中的 API 密钥、CSRF 禁用、OAuth 隐式 | | 3 | **Property Level Auth** | API3-001 至 005 | API3 | 批量赋值、过度数据暴露、响应中的敏感字段、GraphQL 字段暴露 | | 4 | **Resource Consumption** | API4-001 至 006 | API4 | 无速率限制、无分页、无限制上传、无超时、GraphQL 深度/复杂度 | | 5 | **BFLA** | API5-001 至 004 | API5 | 无 RBAC 的管理员端点、权限提升、方法覆盖、未受保护的 DELETE | | 6 | **Business Flow** | API6-001 至 003 | API6 | 登录无 CAPTCHA、未受保护的支付/结账、密码重置滥用 | | 7 | **SSRF** | API7-001 至 004 | API7 | 服务器请求中的用户 URL、开放重定向、Webhook SSRF、文件导入 SSRF | | 8 | **Misconfiguration** | API8-001 至 010 | API8 | CORS 通配符、调试模式、冗长错误、缺少标头、HTTP 服务、TLS 验证禁用 | | 9 | **Inventory Management** | API9-001 至 004 | API9 | 多版本、暴露的 Swagger/文档、已弃用端点、调试端点 | | 10 | **Unsafe Consumption** | API10-001 至 004 | API10 | 未验证的响应、无超时、无熔断器、盲目跟随重定向 | | 11 | **Input Validation** | API-INJ-001 至 007 | — | SQL 注入、NoSQL 注入、命令注入、XSS、LDAP 注入、XXE、路径遍历 | | 12 | **Secrets** | API-SEC-001 至 006 | — | 硬编码的 API 密钥、密码、私钥、AWS 凭证、DB 连接字符串、Bearer Token | | 13 | **Transport / TLS** | API-TLS-001 至 004 | — | HTTP 端点、弱 TLS 版本、弱加密套件、缺少 HSTS | | 14 | **Logging** | API-LOG-001 至 003 | — | 日志中的敏感数据、禁用日志、记录完整请求体 | | 15 | **GraphQL** | API-GQL-001 至 005 | — | 内省、无深度限制、批量、未认证 Mutation、缺少字段认证 | | 16 | **gRPC** | API-GRPC-001 至 004 | — | 不安全通道、反射、无认证拦截器、无限消息大小 | | 17 | **API Gateway** | API-GW-001 至 005 | — | 无速率限制或认证的 Nginx/Kong/Envoy/AWS | | 18 | **Environment Secrets** | API-ENV-001 至 006 | — | .env 中的 API 密钥、DB 密码、JWT 密钥、OAuth 密钥、调试模式 | | 19 | **Container Security** | API-DOCKER-001 至 004 | — | Root 用户、Dockerfile 中的密钥、未版本化的基础镜像、暴露 HTTP 端口 | | 20 | **K8s API Security** | API-K8S-001 至 005 | — | Ingress 无 TLS、LoadBalancer 开放、无 NetworkPolicy、无限制、Secret 作为环境变量 | | 21 | **OpenAPI Spec** | API-SPEC-001 至 005 | — | 无安全方案、查询中的 API 密钥、缺少响应模式、HTTP 服务器 URL | | 22 | **Protobuf** | API-PROTO-001 至 002 | — | 敏感字段无注解、RPC 无认证 | ## 合规框架 每个发现都映射到适用的合规框架: | 框架 | 范围 | |-----------|-------| | **OWASP API Top 10 (2023)** | API1 至 API10 — API 安全的行业标准 | | **PCI-DSS v4.0** | 支付卡数据保护 | | **GDPR** | 欧盟数据隐私法规 | | **HIPAA** | 医疗数据保护 | | **DORA** | 数字运营弹性(金融领域) | ## 前置条件 - **Python 3.10 或更高版本** — 使用 `python --version` 或 `python3 --version` 检查 - **无需 pip 安装** — 仅需 Python 标准库 ## 安装 ### 选项 1:克隆仓库 ``` git clone https://github.com/Krishcalin/API-Security.git cd API-Security ``` ### 选项 2:下载扫描器文件 ``` curl -O https://raw.githubusercontent.com/Krishcalin/API-Security/main/api_security_scanner.py ``` ### 验证是否正常工作 ``` python api_security_scanner.py --version # API Security Scanner v1.0.0 ``` ## 快速开始 ### 1. 扫描您的 API 项目 ``` # 扫描整个项目目录 python api_security_scanner.py /path/to/your/api-project # 扫描单个文件 python api_security_scanner.py /path/to/your/app.py ``` ### 2. 生成报告 ``` # JSON 报告(机器可解析,用于 CI/CD) python api_security_scanner.py ./my-api --json report.json # HTML 报告(交互式,用于利益相关者) python api_security_scanner.py ./my-api --html report.html # 同时生成两种报告 python api_security_scanner.py ./my-api --json report.json --html report.html ``` ### 3. 按严重程度筛选 ``` # 仅 CRITICAL 和 HIGH python api_security_scanner.py ./my-api --severity HIGH # 仅 CRITICAL python api_security_scanner.py ./my-api --severity CRITICAL ``` ### 4. 详细模式 ``` python api_security_scanner.py ./my-api --verbose ``` ## 使用方法 ### CLI 参考 ``` usage: api_security_scanner.py [-h] [--json FILE] [--html FILE] [--severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}] [-v] [--version] target positional arguments: target File or directory to scan options: -h, --help Show help message and exit --json FILE Save JSON report to FILE --html FILE Save HTML report to FILE --severity SEV Minimum severity (CRITICAL, HIGH, MEDIUM, LOW, INFO) -v, --verbose Show files being scanned --version Show scanner version ``` ### 示例 ``` # 扫描当前目录 python api_security_scanner.py . # 扫描 Flask/FastAPI 应用 python api_security_scanner.py src/api/ # 扫描 OpenAPI spec python api_security_scanner.py openapi.yaml # 扫描 GraphQL schema python api_security_scanner.py schema.graphql # 扫描 protobuf 服务定义 python api_security_scanner.py service.proto # 扫描 Nginx API gateway 配置 python api_security_scanner.py nginx.conf # 扫描 .env 以查找暴露的 API secrets python api_security_scanner.py .env # 扫描 K8s API deployment python api_security_scanner.py k8s/api-deploy.yaml # 包含所有输出的完整扫描 python api_security_scanner.py ./my-api --json report.json --html report.html --severity MEDIUM --verbose ``` ## 扫描的文件类型 | 文件类型 | 扩展名 / 名称 | 检查内容 | |-----------|-------------------|-----------------| | **Python** | `.py`, `.pyw` | 所有 OWASP API T10 规则 + 注入 + 密钥 + 日志| | **JavaScript / TypeScript** | `.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`, `.cjs` | 相同规则| | **Java / Go / Ruby / PHP** | `.java`, `.go`, `.rb`, `.php` | 所有源代码规则| | **GraphQL schemas** | `.graphql`, `.gql` | 5 条 GraphQL 特定规则 + BOLA + 属性认证 | | **Protobuf** | `.proto` | 2 条 Protobuf 规则 + gRPC 安全 | | **OpenAPI / Swagger** | `.yaml`, `.yml`, `.json` | 5 条 OpenAPI 规范规则(通过内容自动检测) | | **Nginx / Gateway configs** | `nginx.conf`, `*.conf` | 5 条网关规则 + 配置错误 + TLS | | **Environment files** | `.env`, `.env.*` | 6 条关于 API 密钥、DB 密码、JWT 密钥、调试模式的规则 | | **Dockerfiles** | `Dockerfile`, `*.dockerfile` | 4 条容器安全规则 | | **K8s manifests** | `.yaml`, `.yml` | 5 条 K8s API 规则| ## API 资产发现 扫描器会自动发现并报告代码库中的 API 组件: | 类别 | 检测项 | |----------|----------------| | **Frameworks** | Flask, FastAPI, Django, Express, NestJS, Koa, Hapi, Spring Boot, Gin, Echo, Fiber, Actix, Rails, Laravel, Phoenix, Graphene, Strawberry, Apollo, Ariadne, Nexus | | **Protocols** | REST, GraphQL, gRPC, SOAP, WebSocket, SSE, Protobuf, OpenAPI, Swagger | | **Auth Methods** | JWT, OAuth2, Basic Auth, API Key, Bearer Token, SAML, mTLS, OpenID Connect, Passport.js, Auth0, Cognito, Keycloak | | **API Gateways** | Nginx, Kong, Envoy, Traefik, Apigee, AWS API Gateway, Azure APIM, Istio | | **Databases** | PostgreSQL, MySQL, MongoDB, Redis, Elasticsearch, DynamoDB, SQLite, Cassandra, Neo4j | ## CI/CD 集成 如果存在 CRITICAL 或 HIGH 发现,扫描器将返回退出代码 `1`: ### GitHub Actions ``` name: API Security Scan on: [push, pull_request] jobs: api-security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' - name: Run API Security Scanner run: python api_security_scanner.py . --severity HIGH --json report.json --html report.html - name: Upload Report if: always() uses: actions/upload-artifact@v4 with: name: api-security-report path: | report.json report.html ``` ### GitLab CI ``` api-security-scan: stage: test image: python:3.12-slim script: - python api_security_scanner.py . --severity HIGH --json report.json --html report.html artifacts: paths: [report.json, report.html] when: always ``` ## 使用示例文件进行测试 ``` # 针对所有测试样本运行(预期 190+ findings) python api_security_scanner.py tests/samples/ --verbose # 生成完整报告 python api_security_scanner.py tests/samples/ --html test-report.html --json test-report.json ``` ### 测试示例文件 | 文件 | 用途 | 预期发现 | |------|---------|-------------------| | `vulnerable_api.py` | 不安全的 Flask API(BOLA、认证、SSRF、注入、密钥) | 100+ | | `vulnerable_api.js` | 不安全的 Express.js API | 40+ | | `vulnerable_openapi.yaml` | 不安全的 OpenAPI 3.x 规范 | 10+ | | `vulnerable_api.graphql` | 不安全的 GraphQL Schema | 5+ | | `vulnerable_api.proto` | 不安全的 gRPC protobuf | 10+ | | `.env.api` | 暴露的 API 密钥和调试模式 | 15+ | | `Dockerfile.api` | 不安全的 API 容器 | 5+ | | `nginx_api.conf` | 不安全的 Nginx API 代理 | 5+ | | `k8s_api_deploy.yaml` | 不安全的 K8s API 部署 | 5+ | ## 项目结构 ``` API-Security/ ├── api_security_scanner.py # Main scanner (single file, no dependencies) ├── banner.svg # Project banner ├── CLAUDE.md # Claude Code project instructions ├── LICENSE # MIT License ├── README.md # This file ├── .gitignore # Python gitignore └── tests/ └── samples/ # Intentionally vulnerable test files ├── vulnerable_api.py ├── vulnerable_api.js ├── vulnerable_openapi.yaml ├── vulnerable_api.graphql ├── vulnerable_api.proto ├── .env.api ├── Dockerfile.api ├── nginx_api.conf └── k8s_api_deploy.yaml ``` ## 贡献 1. 在 `api_security_scanner.py` 中将规则字典添加到相应的 `*_RULES` 列表中 2. 遵循 ID 模式:`API{N}-{NNN}` (OWASP) 或 `API-{CATEGORY}-{NNN}` 3. 每条规则必须包含:`id`、`category`、`severity`、``、`pattern`、`description`、`cwe`、`recommendation`、`compliance` 4. 将测试用例添加到触发新规则的 `tests/samples/` 中 5. 运行 `python api_security_scanner.py tests/samples/ --verbose` 进行验证 ## 许可证 本项目采用 MIT 许可证授权 —— 详情请参阅 [LICENSE](LICENSE) 文件。
标签:API 安全, API 网关, BOLA, CISA项目, CORS, DevSecOps, GraphQL, gRPC, JWT, OpenAPI, OWASP Top 10, Python, Python工具, REST API, SSRF, Web 安全, 上游代理, 云安全监控, 加密, 子域名突变, 安全专业人员, 安全助手, 密钥泄露, 无后门, 注入攻击, 漏洞扫描器, 请求拦截, 越权访问, 逆向工具, 零依赖, 静态分析