solokit 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solokit/__init__.py +10 -0
- solokit/__version__.py +3 -0
- solokit/cli.py +374 -0
- solokit/core/__init__.py +1 -0
- solokit/core/cache.py +102 -0
- solokit/core/command_runner.py +278 -0
- solokit/core/config.py +453 -0
- solokit/core/config_validator.py +204 -0
- solokit/core/constants.py +291 -0
- solokit/core/error_formatter.py +279 -0
- solokit/core/error_handlers.py +346 -0
- solokit/core/exceptions.py +1567 -0
- solokit/core/file_ops.py +309 -0
- solokit/core/logging_config.py +166 -0
- solokit/core/output.py +99 -0
- solokit/core/performance.py +57 -0
- solokit/core/protocols.py +141 -0
- solokit/core/types.py +312 -0
- solokit/deployment/__init__.py +1 -0
- solokit/deployment/executor.py +411 -0
- solokit/git/__init__.py +1 -0
- solokit/git/integration.py +619 -0
- solokit/init/__init__.py +41 -0
- solokit/init/claude_commands_installer.py +87 -0
- solokit/init/dependency_installer.py +313 -0
- solokit/init/docs_structure.py +90 -0
- solokit/init/env_generator.py +160 -0
- solokit/init/environment_validator.py +334 -0
- solokit/init/git_hooks_installer.py +71 -0
- solokit/init/git_setup.py +188 -0
- solokit/init/gitignore_updater.py +195 -0
- solokit/init/initial_commit.py +145 -0
- solokit/init/initial_scans.py +109 -0
- solokit/init/orchestrator.py +246 -0
- solokit/init/readme_generator.py +207 -0
- solokit/init/session_structure.py +239 -0
- solokit/init/template_installer.py +424 -0
- solokit/learning/__init__.py +1 -0
- solokit/learning/archiver.py +115 -0
- solokit/learning/categorizer.py +126 -0
- solokit/learning/curator.py +428 -0
- solokit/learning/extractor.py +352 -0
- solokit/learning/reporter.py +351 -0
- solokit/learning/repository.py +254 -0
- solokit/learning/similarity.py +342 -0
- solokit/learning/validator.py +144 -0
- solokit/project/__init__.py +1 -0
- solokit/project/init.py +1162 -0
- solokit/project/stack.py +436 -0
- solokit/project/sync_plugin.py +438 -0
- solokit/project/tree.py +375 -0
- solokit/quality/__init__.py +1 -0
- solokit/quality/api_validator.py +424 -0
- solokit/quality/checkers/__init__.py +25 -0
- solokit/quality/checkers/base.py +114 -0
- solokit/quality/checkers/context7.py +221 -0
- solokit/quality/checkers/custom.py +162 -0
- solokit/quality/checkers/deployment.py +323 -0
- solokit/quality/checkers/documentation.py +179 -0
- solokit/quality/checkers/formatting.py +161 -0
- solokit/quality/checkers/integration.py +394 -0
- solokit/quality/checkers/linting.py +159 -0
- solokit/quality/checkers/security.py +261 -0
- solokit/quality/checkers/spec_completeness.py +127 -0
- solokit/quality/checkers/tests.py +184 -0
- solokit/quality/env_validator.py +306 -0
- solokit/quality/gates.py +655 -0
- solokit/quality/reporters/__init__.py +10 -0
- solokit/quality/reporters/base.py +25 -0
- solokit/quality/reporters/console.py +98 -0
- solokit/quality/reporters/json_reporter.py +34 -0
- solokit/quality/results.py +98 -0
- solokit/session/__init__.py +1 -0
- solokit/session/briefing/__init__.py +245 -0
- solokit/session/briefing/documentation_loader.py +53 -0
- solokit/session/briefing/formatter.py +476 -0
- solokit/session/briefing/git_context.py +282 -0
- solokit/session/briefing/learning_loader.py +212 -0
- solokit/session/briefing/milestone_builder.py +78 -0
- solokit/session/briefing/orchestrator.py +137 -0
- solokit/session/briefing/stack_detector.py +51 -0
- solokit/session/briefing/tree_generator.py +52 -0
- solokit/session/briefing/work_item_loader.py +209 -0
- solokit/session/briefing.py +353 -0
- solokit/session/complete.py +1188 -0
- solokit/session/status.py +246 -0
- solokit/session/validate.py +452 -0
- solokit/templates/.claude/commands/end.md +109 -0
- solokit/templates/.claude/commands/init.md +159 -0
- solokit/templates/.claude/commands/learn-curate.md +88 -0
- solokit/templates/.claude/commands/learn-search.md +62 -0
- solokit/templates/.claude/commands/learn-show.md +69 -0
- solokit/templates/.claude/commands/learn.md +136 -0
- solokit/templates/.claude/commands/start.md +114 -0
- solokit/templates/.claude/commands/status.md +22 -0
- solokit/templates/.claude/commands/validate.md +27 -0
- solokit/templates/.claude/commands/work-delete.md +119 -0
- solokit/templates/.claude/commands/work-graph.md +139 -0
- solokit/templates/.claude/commands/work-list.md +26 -0
- solokit/templates/.claude/commands/work-new.md +114 -0
- solokit/templates/.claude/commands/work-next.md +25 -0
- solokit/templates/.claude/commands/work-show.md +24 -0
- solokit/templates/.claude/commands/work-update.md +141 -0
- solokit/templates/CHANGELOG.md +17 -0
- solokit/templates/WORK_ITEM_TYPES.md +141 -0
- solokit/templates/__init__.py +1 -0
- solokit/templates/bug_spec.md +217 -0
- solokit/templates/config.schema.json +150 -0
- solokit/templates/dashboard_refine/base/.gitignore +36 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/layout.tsx +22 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/page.tsx +68 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/users/page.tsx +77 -0
- solokit/templates/dashboard_refine/base/app/globals.css +60 -0
- solokit/templates/dashboard_refine/base/app/layout.tsx +23 -0
- solokit/templates/dashboard_refine/base/app/page.tsx +9 -0
- solokit/templates/dashboard_refine/base/components/client-refine-wrapper.tsx +21 -0
- solokit/templates/dashboard_refine/base/components/layout/header.tsx +44 -0
- solokit/templates/dashboard_refine/base/components/layout/sidebar.tsx +82 -0
- solokit/templates/dashboard_refine/base/components/ui/button.tsx +53 -0
- solokit/templates/dashboard_refine/base/components/ui/card.tsx +78 -0
- solokit/templates/dashboard_refine/base/components/ui/table.tsx +116 -0
- solokit/templates/dashboard_refine/base/components.json +16 -0
- solokit/templates/dashboard_refine/base/lib/refine.tsx +65 -0
- solokit/templates/dashboard_refine/base/lib/utils.ts +13 -0
- solokit/templates/dashboard_refine/base/next.config.ts +10 -0
- solokit/templates/dashboard_refine/base/package.json.template +40 -0
- solokit/templates/dashboard_refine/base/postcss.config.mjs +8 -0
- solokit/templates/dashboard_refine/base/providers/refine-provider.tsx +26 -0
- solokit/templates/dashboard_refine/base/tailwind.config.ts +57 -0
- solokit/templates/dashboard_refine/base/tsconfig.json +27 -0
- solokit/templates/dashboard_refine/docker/Dockerfile +57 -0
- solokit/templates/dashboard_refine/docker/docker-compose.prod.yml +31 -0
- solokit/templates/dashboard_refine/docker/docker-compose.yml +21 -0
- solokit/templates/dashboard_refine/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/dashboard_refine/tier-1-essential/package.json.tier1.template +57 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/setup.ts +26 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/unit/example.test.tsx +73 -0
- solokit/templates/dashboard_refine/tier-2-standard/package.json.tier2.template +62 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/eslint.config.mjs +22 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/package.json.tier3.template +79 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/stryker.conf.json +38 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/dashboard.spec.ts +88 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/user-management.spec.ts +102 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/integration/dashboard.test.tsx +90 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/type-coverage.json +16 -0
- solokit/templates/dashboard_refine/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/dashboard_refine/tier-4-production/k6/dashboard-load-test.js +70 -0
- solokit/templates/dashboard_refine/tier-4-production/next.config.ts +46 -0
- solokit/templates/dashboard_refine/tier-4-production/package.json.tier4.template +89 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/deployment_spec.md +500 -0
- solokit/templates/feature_spec.md +248 -0
- solokit/templates/fullstack_nextjs/base/.gitignore +36 -0
- solokit/templates/fullstack_nextjs/base/app/api/example/route.ts +65 -0
- solokit/templates/fullstack_nextjs/base/app/globals.css +27 -0
- solokit/templates/fullstack_nextjs/base/app/layout.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/app/page.tsx +32 -0
- solokit/templates/fullstack_nextjs/base/components/example-component.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/lib/prisma.ts +17 -0
- solokit/templates/fullstack_nextjs/base/lib/utils.ts +13 -0
- solokit/templates/fullstack_nextjs/base/lib/validations.ts +20 -0
- solokit/templates/fullstack_nextjs/base/next.config.ts +7 -0
- solokit/templates/fullstack_nextjs/base/package.json.template +32 -0
- solokit/templates/fullstack_nextjs/base/postcss.config.mjs +8 -0
- solokit/templates/fullstack_nextjs/base/prisma/schema.prisma +21 -0
- solokit/templates/fullstack_nextjs/base/tailwind.config.ts +19 -0
- solokit/templates/fullstack_nextjs/base/tsconfig.json +27 -0
- solokit/templates/fullstack_nextjs/docker/Dockerfile +60 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.prod.yml +57 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.yml +47 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/package.json.tier1.template +48 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/api/example.test.ts +88 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/unit/example.test.tsx +22 -0
- solokit/templates/fullstack_nextjs/tier-2-standard/package.json.tier2.template +52 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/package.json.tier3.template +68 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/stryker.conf.json +33 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/e2e/flow.spec.ts +59 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/integration/api.test.ts +165 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/fullstack_nextjs/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/fullstack_nextjs/tier-4-production/k6/load-test.js +45 -0
- solokit/templates/fullstack_nextjs/tier-4-production/next.config.ts +46 -0
- solokit/templates/fullstack_nextjs/tier-4-production/package.json.tier4.template +77 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/git-hooks/prepare-commit-msg +24 -0
- solokit/templates/integration_test_spec.md +363 -0
- solokit/templates/learnings.json +15 -0
- solokit/templates/ml_ai_fastapi/base/.gitignore +104 -0
- solokit/templates/ml_ai_fastapi/base/alembic/env.py +96 -0
- solokit/templates/ml_ai_fastapi/base/alembic.ini +114 -0
- solokit/templates/ml_ai_fastapi/base/pyproject.toml.template +91 -0
- solokit/templates/ml_ai_fastapi/base/requirements.txt.template +28 -0
- solokit/templates/ml_ai_fastapi/base/src/__init__.py +5 -0
- solokit/templates/ml_ai_fastapi/base/src/api/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/dependencies.py +20 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/example.py +134 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/health.py +66 -0
- solokit/templates/ml_ai_fastapi/base/src/core/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/core/config.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/core/database.py +50 -0
- solokit/templates/ml_ai_fastapi/base/src/main.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/models/__init__.py +7 -0
- solokit/templates/ml_ai_fastapi/base/src/models/example.py +61 -0
- solokit/templates/ml_ai_fastapi/base/src/services/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/services/example.py +115 -0
- solokit/templates/ml_ai_fastapi/docker/Dockerfile +59 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.prod.yml +112 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.yml +77 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyproject.toml.tier1.template +112 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyrightconfig.json +41 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pytest.ini +69 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/requirements-dev.txt +17 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/ruff.toml +81 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/conftest.py +72 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/test_main.py +49 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/test_example.py +113 -0
- solokit/templates/ml_ai_fastapi/tier-2-standard/pyproject.toml.tier2.template +130 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/locustfile.py +99 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/mutmut_config.py +53 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/pyproject.toml.tier3.template +150 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/conftest.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/test_api.py +131 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/pyproject.toml.tier4.template +162 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/requirements-prod.txt +25 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/api/routes/metrics.py +19 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/logging.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/monitoring.py +68 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/sentry.py +66 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/logging.py +79 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/tracing.py +60 -0
- solokit/templates/refactor_spec.md +287 -0
- solokit/templates/saas_t3/base/.gitignore +36 -0
- solokit/templates/saas_t3/base/app/api/trpc/[trpc]/route.ts +33 -0
- solokit/templates/saas_t3/base/app/globals.css +27 -0
- solokit/templates/saas_t3/base/app/layout.tsx +23 -0
- solokit/templates/saas_t3/base/app/page.tsx +31 -0
- solokit/templates/saas_t3/base/lib/api.tsx +77 -0
- solokit/templates/saas_t3/base/lib/utils.ts +13 -0
- solokit/templates/saas_t3/base/next.config.ts +7 -0
- solokit/templates/saas_t3/base/package.json.template +38 -0
- solokit/templates/saas_t3/base/postcss.config.mjs +8 -0
- solokit/templates/saas_t3/base/prisma/schema.prisma +20 -0
- solokit/templates/saas_t3/base/server/api/root.ts +19 -0
- solokit/templates/saas_t3/base/server/api/routers/example.ts +28 -0
- solokit/templates/saas_t3/base/server/api/trpc.ts +52 -0
- solokit/templates/saas_t3/base/server/db.ts +17 -0
- solokit/templates/saas_t3/base/tailwind.config.ts +19 -0
- solokit/templates/saas_t3/base/tsconfig.json +27 -0
- solokit/templates/saas_t3/docker/Dockerfile +60 -0
- solokit/templates/saas_t3/docker/docker-compose.prod.yml +59 -0
- solokit/templates/saas_t3/docker/docker-compose.yml +49 -0
- solokit/templates/saas_t3/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/saas_t3/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/saas_t3/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/saas_t3/tier-1-essential/package.json.tier1.template +54 -0
- solokit/templates/saas_t3/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/saas_t3/tier-1-essential/tests/unit/example.test.tsx +24 -0
- solokit/templates/saas_t3/tier-2-standard/package.json.tier2.template +58 -0
- solokit/templates/saas_t3/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/saas_t3/tier-3-comprehensive/package.json.tier3.template +74 -0
- solokit/templates/saas_t3/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/saas_t3/tier-3-comprehensive/stryker.conf.json +34 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/e2e/home.spec.ts +41 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/integration/api.test.ts +44 -0
- solokit/templates/saas_t3/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/saas_t3/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/saas_t3/tier-4-production/k6/load-test.js +51 -0
- solokit/templates/saas_t3/tier-4-production/next.config.ts +46 -0
- solokit/templates/saas_t3/tier-4-production/package.json.tier4.template +83 -0
- solokit/templates/saas_t3/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/saas_t3/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/vercel.json +37 -0
- solokit/templates/security_spec.md +287 -0
- solokit/templates/stack-versions.yaml +617 -0
- solokit/templates/status_update.json +6 -0
- solokit/templates/template-registry.json +257 -0
- solokit/templates/work_items.json +11 -0
- solokit/testing/__init__.py +1 -0
- solokit/testing/integration_runner.py +550 -0
- solokit/testing/performance.py +637 -0
- solokit/visualization/__init__.py +1 -0
- solokit/visualization/dependency_graph.py +788 -0
- solokit/work_items/__init__.py +1 -0
- solokit/work_items/creator.py +217 -0
- solokit/work_items/delete.py +264 -0
- solokit/work_items/get_dependencies.py +185 -0
- solokit/work_items/get_dependents.py +113 -0
- solokit/work_items/get_metadata.py +121 -0
- solokit/work_items/get_next_recommendations.py +133 -0
- solokit/work_items/manager.py +235 -0
- solokit/work_items/milestones.py +137 -0
- solokit/work_items/query.py +376 -0
- solokit/work_items/repository.py +267 -0
- solokit/work_items/scheduler.py +184 -0
- solokit/work_items/spec_parser.py +838 -0
- solokit/work_items/spec_validator.py +493 -0
- solokit/work_items/updater.py +157 -0
- solokit/work_items/validator.py +205 -0
- solokit-0.1.1.dist-info/METADATA +640 -0
- solokit-0.1.1.dist-info/RECORD +323 -0
- solokit-0.1.1.dist-info/WHEEL +5 -0
- solokit-0.1.1.dist-info/entry_points.txt +2 -0
- solokit-0.1.1.dist-info/licenses/LICENSE +21 -0
- solokit-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Security Task: [Name]
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
TEMPLATE INSTRUCTIONS:
|
|
5
|
+
- Replace [Name] with a concise description of the security task
|
|
6
|
+
- Be specific about the vulnerability or security improvement
|
|
7
|
+
- Include threat model and attack scenarios
|
|
8
|
+
- Document all security controls and validations
|
|
9
|
+
- Remove these instructions before finalizing the spec
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
## Security Issue
|
|
13
|
+
|
|
14
|
+
<!-- Describe the security concern, vulnerability, or improvement in detail -->
|
|
15
|
+
|
|
16
|
+
Describe the security concern, vulnerability, or improvement.
|
|
17
|
+
|
|
18
|
+
**Example:**
|
|
19
|
+
> SQL injection vulnerability in the user search endpoint (`/api/users/search`). The search query parameter is directly concatenated into the SQL query without proper sanitization or parameterization, allowing attackers to execute arbitrary SQL commands and potentially access or modify sensitive user data.
|
|
20
|
+
|
|
21
|
+
## Severity
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
Choose one severity level based on exploitability and impact:
|
|
25
|
+
- Critical: Active exploit possible, high impact (data breach, system compromise)
|
|
26
|
+
- High: Likely exploit, significant impact (privilege escalation, data exposure)
|
|
27
|
+
- Medium: Possible exploit, moderate impact (information disclosure, DoS)
|
|
28
|
+
- Low: Difficult exploit, minor impact (security hardening, best practices)
|
|
29
|
+
-->
|
|
30
|
+
|
|
31
|
+
- [x] Critical - Active exploit possible
|
|
32
|
+
- [ ] High - Significant security risk
|
|
33
|
+
- [ ] Medium - Moderate security concern
|
|
34
|
+
- [ ] Low - Minor security improvement
|
|
35
|
+
|
|
36
|
+
**Impact Assessment:**
|
|
37
|
+
- **Confidentiality:** High (full database access possible)
|
|
38
|
+
- **Integrity:** High (data modification possible)
|
|
39
|
+
- **Availability:** Medium (DoS via resource-intensive queries)
|
|
40
|
+
- **CVSS Score:** 9.1 (Critical)
|
|
41
|
+
|
|
42
|
+
## Affected Components
|
|
43
|
+
|
|
44
|
+
<!-- List all components, systems, or data affected by this security issue -->
|
|
45
|
+
|
|
46
|
+
- API Endpoint: `GET /api/users/search?q=[query]`
|
|
47
|
+
- Backend Service: `src/services/UserSearchService.ts`
|
|
48
|
+
- Database: `users` table (contains PII: names, emails, phone numbers)
|
|
49
|
+
- Affected Versions: v2.0.0 - v2.4.2
|
|
50
|
+
- First Introduced: v2.0.0 (commit abc123f)
|
|
51
|
+
|
|
52
|
+
## Threat Model
|
|
53
|
+
|
|
54
|
+
### Assets at Risk
|
|
55
|
+
- User database containing 1.2M user records
|
|
56
|
+
- Personal Identifiable Information (PII): names, emails, phone numbers, addresses
|
|
57
|
+
- Authentication credentials (hashed passwords)
|
|
58
|
+
- Session tokens
|
|
59
|
+
|
|
60
|
+
### Threat Actors
|
|
61
|
+
- **External Attackers:** Opportunistic attackers scanning for SQL injection vulnerabilities
|
|
62
|
+
- **Malicious Insiders:** Users with legitimate API access attempting privilege escalation
|
|
63
|
+
- **Automated Bots:** Scripts scanning for common vulnerabilities
|
|
64
|
+
|
|
65
|
+
### Attack Scenarios
|
|
66
|
+
|
|
67
|
+
**Scenario 1: Data Exfiltration**
|
|
68
|
+
```
|
|
69
|
+
GET /api/users/search?q=admin' UNION SELECT id,email,password FROM users--
|
|
70
|
+
```
|
|
71
|
+
Attacker retrieves entire user database including hashed passwords.
|
|
72
|
+
|
|
73
|
+
**Scenario 2: Privilege Escalation**
|
|
74
|
+
```
|
|
75
|
+
GET /api/users/search?q=test'; UPDATE users SET role='admin' WHERE id=1337;--
|
|
76
|
+
```
|
|
77
|
+
Attacker elevates their own account to admin role.
|
|
78
|
+
|
|
79
|
+
**Scenario 3: Data Destruction**
|
|
80
|
+
```
|
|
81
|
+
GET /api/users/search?q='; DROP TABLE users;--
|
|
82
|
+
```
|
|
83
|
+
Attacker destroys user data (DoS attack).
|
|
84
|
+
|
|
85
|
+
## Attack Vector
|
|
86
|
+
|
|
87
|
+
<!-- Detailed description of how the vulnerability could be exploited -->
|
|
88
|
+
|
|
89
|
+
**Example:**
|
|
90
|
+
> The vulnerability exists in the `searchUsers()` method which constructs SQL queries using string concatenation:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// VULNERABLE CODE in src/services/UserSearchService.ts:42-48
|
|
94
|
+
async searchUsers(query: string): Promise<User[]> {
|
|
95
|
+
// Direct string concatenation - UNSAFE!
|
|
96
|
+
const sql = `SELECT * FROM users WHERE name LIKE '%${query}%' OR email LIKE '%${query}%'`;
|
|
97
|
+
|
|
98
|
+
const results = await this.db.query(sql);
|
|
99
|
+
return results.rows;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Exploitation Steps:**
|
|
104
|
+
1. Attacker crafts malicious SQL payload in the `q` parameter
|
|
105
|
+
2. Backend concatenates user input directly into SQL query
|
|
106
|
+
3. Database executes the malicious SQL command
|
|
107
|
+
4. Attacker receives unauthorized data or modifies the database
|
|
108
|
+
|
|
109
|
+
**Proof of Concept:**
|
|
110
|
+
```bash
|
|
111
|
+
# List all users (bypassing pagination/filtering)
|
|
112
|
+
curl "https://api.example.com/api/users/search?q=admin' OR '1'='1"
|
|
113
|
+
|
|
114
|
+
# Extract password hashes
|
|
115
|
+
curl "https://api.example.com/api/users/search?q=x' UNION SELECT id,email,password FROM users--"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Mitigation Strategy
|
|
119
|
+
|
|
120
|
+
<!-- Detailed approach to fix or mitigate the security issue -->
|
|
121
|
+
|
|
122
|
+
**Primary Fix: Use Parameterized Queries**
|
|
123
|
+
|
|
124
|
+
Replace string concatenation with parameterized queries:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// SECURE CODE in src/services/UserSearchService.ts:42-51
|
|
128
|
+
async searchUsers(query: string): Promise<User[]> {
|
|
129
|
+
// Parameterized query - SAFE!
|
|
130
|
+
const sql = `
|
|
131
|
+
SELECT id, name, email, created_at
|
|
132
|
+
FROM users
|
|
133
|
+
WHERE name LIKE $1 OR email LIKE $2
|
|
134
|
+
LIMIT 100
|
|
135
|
+
`;
|
|
136
|
+
|
|
137
|
+
const searchPattern = `%${query}%`;
|
|
138
|
+
const results = await this.db.query(sql, [searchPattern, searchPattern]);
|
|
139
|
+
return results.rows;
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Defense in Depth Measures:**
|
|
144
|
+
|
|
145
|
+
1. **Input Validation:**
|
|
146
|
+
```typescript
|
|
147
|
+
// Add input validation
|
|
148
|
+
function validateSearchQuery(query: string): string {
|
|
149
|
+
// Max length
|
|
150
|
+
if (query.length > 100) {
|
|
151
|
+
throw new ValidationError('Search query too long');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Allowed characters only
|
|
155
|
+
if (!/^[a-zA-Z0-9\s@.-]+$/.test(query)) {
|
|
156
|
+
throw new ValidationError('Invalid characters in search query');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return query;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
2. **Database Permissions:**
|
|
164
|
+
- Create read-only database user for search queries
|
|
165
|
+
- Revoke DELETE, UPDATE, DROP permissions
|
|
166
|
+
|
|
167
|
+
3. **Rate Limiting:**
|
|
168
|
+
- Limit search requests to 10/minute per user
|
|
169
|
+
- Implement exponential backoff for repeated failures
|
|
170
|
+
|
|
171
|
+
4. **Logging & Monitoring:**
|
|
172
|
+
- Log all search queries for audit trail
|
|
173
|
+
- Alert on suspicious query patterns (UNION, --, etc.)
|
|
174
|
+
|
|
175
|
+
## Implementation Plan
|
|
176
|
+
|
|
177
|
+
1. **Immediate:** Apply hotfix to parameterize queries (2 hours)
|
|
178
|
+
2. **Short-term:** Add input validation (4 hours)
|
|
179
|
+
3. **Medium-term:** Implement rate limiting (1 session)
|
|
180
|
+
4. **Long-term:** Database permission hardening (1 session)
|
|
181
|
+
|
|
182
|
+
## Security Testing
|
|
183
|
+
|
|
184
|
+
<!-- Comprehensive security testing checklist -->
|
|
185
|
+
|
|
186
|
+
### Automated Security Testing
|
|
187
|
+
- [ ] SAST (Static Analysis): Run Semgrep/SonarQube to detect SQL injection patterns
|
|
188
|
+
- [ ] DAST (Dynamic Analysis): Run OWASP ZAP against search endpoint
|
|
189
|
+
- [ ] Dependency scan: Check for vulnerable database driver versions
|
|
190
|
+
- [ ] Regression test: Verify fix prevents all known attack vectors
|
|
191
|
+
|
|
192
|
+
### Manual Security Testing
|
|
193
|
+
- [ ] Penetration test: Attempt SQL injection with various payloads
|
|
194
|
+
- [ ] Authentication bypass test: Verify no privilege escalation possible
|
|
195
|
+
- [ ] Data exfiltration test: Confirm only authorized data accessible
|
|
196
|
+
- [ ] DoS test: Verify rate limiting prevents resource exhaustion
|
|
197
|
+
|
|
198
|
+
### Test Cases
|
|
199
|
+
```typescript
|
|
200
|
+
describe('User Search Security', () => {
|
|
201
|
+
it('prevents SQL injection via UNION', async () => {
|
|
202
|
+
const maliciousQuery = "admin' UNION SELECT password FROM users--";
|
|
203
|
+
const results = await searchUsers(maliciousQuery);
|
|
204
|
+
// Should return no results or safe results, not passwords
|
|
205
|
+
expect(results.every(r => !r.password)).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('prevents SQL injection via comment', async () => {
|
|
209
|
+
const maliciousQuery = "admin'--";
|
|
210
|
+
await expect(searchUsers(maliciousQuery)).not.toThrow();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('rejects queries with excessive length', async () => {
|
|
214
|
+
const longQuery = 'a'.repeat(1000);
|
|
215
|
+
await expect(searchUsers(longQuery)).rejects.toThrow(ValidationError);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Compliance
|
|
221
|
+
|
|
222
|
+
<!-- Regulatory and standards compliance -->
|
|
223
|
+
|
|
224
|
+
- [ ] **OWASP Top 10:** Addresses A03:2021 - Injection
|
|
225
|
+
- [ ] **CWE-89:** SQL Injection prevention implemented
|
|
226
|
+
- [ ] **PCI DSS 6.5.1:** Input validation for SQL injection
|
|
227
|
+
- [ ] **GDPR Article 32:** Appropriate security measures for personal data
|
|
228
|
+
- [ ] **SOC 2:** Security controls documented and tested
|
|
229
|
+
- [ ] **Security best practices:** Parameterized queries, principle of least privilege
|
|
230
|
+
|
|
231
|
+
## Pre-Deployment Requirements
|
|
232
|
+
|
|
233
|
+
<!-- Gates that must pass before deploying the fix -->
|
|
234
|
+
|
|
235
|
+
- [ ] Security scan passes with 0 critical/high vulnerabilities
|
|
236
|
+
- [ ] All security tests pass (automated + manual)
|
|
237
|
+
- [ ] Code review by security team completed and approved
|
|
238
|
+
- [ ] Penetration test confirms vulnerability is fixed
|
|
239
|
+
- [ ] No new vulnerabilities introduced by the fix
|
|
240
|
+
- [ ] Documentation updated with security notes
|
|
241
|
+
- [ ] Incident response runbook updated
|
|
242
|
+
|
|
243
|
+
## Acceptance Criteria
|
|
244
|
+
|
|
245
|
+
<!-- Specific criteria that must be met -->
|
|
246
|
+
|
|
247
|
+
- [ ] SQL injection vulnerability is completely fixed
|
|
248
|
+
- [ ] All attack scenarios from threat model are mitigated
|
|
249
|
+
- [ ] Security tests pass (100% of test cases)
|
|
250
|
+
- [ ] No regression in functionality (search still works)
|
|
251
|
+
- [ ] No regression in security posture (no new vulnerabilities)
|
|
252
|
+
- [ ] Security review approved by security team
|
|
253
|
+
- [ ] Performance impact < 10ms (parameterized queries are fast)
|
|
254
|
+
- [ ] Logging/monitoring captures suspicious activity
|
|
255
|
+
- [ ] Incident response plan updated (if critical)
|
|
256
|
+
|
|
257
|
+
## Post-Deployment
|
|
258
|
+
|
|
259
|
+
<!-- Actions to take after deploying the fix -->
|
|
260
|
+
|
|
261
|
+
- [ ] Monitor logs for attack attempts
|
|
262
|
+
- [ ] Review security alerts for 7 days post-deployment
|
|
263
|
+
- [ ] Conduct follow-up penetration test after 30 days
|
|
264
|
+
- [ ] Update security training materials with lessons learned
|
|
265
|
+
- [ ] Share findings with development team (blameless postmortem)
|
|
266
|
+
|
|
267
|
+
## Dependencies
|
|
268
|
+
|
|
269
|
+
<!-- Any dependencies on other security work or tools -->
|
|
270
|
+
|
|
271
|
+
- Security scanning tools: Semgrep, OWASP ZAP
|
|
272
|
+
- Database with parameterized query support (PostgreSQL 12+)
|
|
273
|
+
- Rate limiting infrastructure (Redis)
|
|
274
|
+
- Logging/monitoring system (Datadog/Splunk)
|
|
275
|
+
|
|
276
|
+
## Estimated Effort
|
|
277
|
+
|
|
278
|
+
2 sessions
|
|
279
|
+
|
|
280
|
+
<!--
|
|
281
|
+
Breakdown:
|
|
282
|
+
- Immediate hotfix: 0.25 sessions
|
|
283
|
+
- Input validation: 0.5 sessions
|
|
284
|
+
- Rate limiting: 0.5 sessions
|
|
285
|
+
- Security testing: 0.5 sessions
|
|
286
|
+
- Database hardening: 0.25 sessions
|
|
287
|
+
-->
|