fix(platform): close remaining audit findings from security review
Harden preview/deploy flows, OTP generation, zip extraction, and multi-replica billing races; document full remediation status in AUDIT-STATUS.fa.md. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
# وضعیت رفع یافتههای گزارش ممیزی CloudHost
|
||||
|
||||
> مرجع: `AUDIT-REPORT.fa.pdf` / `scripts/audit-report.fa.html`
|
||||
> آخرین بهروزرسانی: ۳ تیر ۱۴۰۴ (3 Jul 2026)
|
||||
|
||||
| نماد | معنی |
|
||||
|------|------|
|
||||
| ✅ | رفع شده |
|
||||
| ⚠️ | جزئی / نیاز به پیکربندی محیط |
|
||||
| 🔜 | عمداً به تعویق افتاده (اسکوپ بزرگ یا trade-off) |
|
||||
|
||||
---
|
||||
|
||||
## خلاصه
|
||||
|
||||
| دسته | تعداد | ✅ | ⚠️ | 🔜 |
|
||||
|------|-------|----|----|-----|
|
||||
| بلاکرهای پروداکشن | 8 | 8 | 0 | 0 |
|
||||
| بیلد و Kaniko | 10 | 8 | 1 | 1 |
|
||||
| دیپلوی و پیشنمایش | 6 | 6 | 0 | 0 |
|
||||
| دیتابیس / سرویس اختیاری | 9 | 8 | 0 | 1 |
|
||||
| Migration / اسکیما | 4 | 4 | 0 | 0 |
|
||||
| بیلینگ و امنیت مالی | 5 | 5 | 0 | 0 |
|
||||
| GitOps / CI-CD | 4 | 4 | 0 | 0 |
|
||||
| امنیت اپ / auth | 6 | 3 | 0 | 3 |
|
||||
| بهبود / زیرساخت | 5 | 2 | 1 | 2 |
|
||||
|
||||
**نتیجه:** همه بلاکرهای پروداکشن و تقریباً همه باگهای قطعی رفع شدهاند. موارد باقیمانده عمدتاً پیکربندی آینه رجیستری، JWT در localStorage، و پاکسازی PVC یتیم هستند.
|
||||
|
||||
---
|
||||
|
||||
## ۱. بلاکرهای پروداکشن (اولویت ۱–۸)
|
||||
|
||||
| # | یافته | وضعیت | اقدام |
|
||||
|---|--------|--------|-------|
|
||||
| 1 | شارژ رایگان کیف پول (`POST /billing/wallet/charge`) | ✅ | HMAC + گارد production در `billing-wallet.controller.ts` |
|
||||
| 2 | دیپلوی بدون پرداخت | ✅ | گارد بیلینگ در `triggerDeployment`, `startDeployment`, `PATCH resources` |
|
||||
| 3 | namespace از ۸ کاراکتر UUID | ✅ | `userIdSlug` / `userNamespace` با UUID کامل |
|
||||
| 4 | migration بدون ردیابی نسخه | ✅ | `schema_migrations` + `000_base_schema.sql` + pre-upgrade hook |
|
||||
| 5 | `015` ستون `user_id` / `001` بدون گارد TYPE | ✅ | اصلاح نام ستون + `IF NOT EXISTS` |
|
||||
| 6 | workflow Gitea بدون تست | ✅ | job تست + rebase در `.gitea/workflows/build-deploy.yaml` |
|
||||
| 7 | رمز هاردکد Elasticsearch | ✅ | حذف از git + SealedSecret |
|
||||
| 8 | COPY گو / `\|\| echo` Node | ✅ | اصلاح در `build.service.ts` |
|
||||
|
||||
---
|
||||
|
||||
## ۲. بیلد (Kaniko + Dockerfile)
|
||||
|
||||
| یافته | وضعیت | یادداشت |
|
||||
|--------|--------|---------|
|
||||
| Go COPY نامعتبر | ✅ | |
|
||||
| Node build failure نادیده | ✅ | `npm ci` + fail-on-build |
|
||||
| Laravel extensions | ✅ | mbstring, xml, bcmath, zip, fileinfo, tokenizer |
|
||||
| Python pyproject.toml | ✅ | تشخیص + نصب poetry/pdm |
|
||||
| Kaniko 4Gi / PVC بدون SC | ✅ | limits قابل تنظیم + `BUILD_PVC_STORAGE_CLASS` |
|
||||
| Git token در spec / branch injection / SSRF | ✅ | GIT_ASKPASS + Secret + validation |
|
||||
| Zip slip در unzip | ✅ | اعتبارسنجی مسیر قبل و بعد از extract |
|
||||
| state بیلد در حافظه | ✅ | Redis session + startup recovery |
|
||||
| دیپلوی همزمان بدون قفل | ✅ | in-flight guard در `triggerDeployment` |
|
||||
| Base image بدون آینه | ⚠️ | `BASE_IMAGE_REGISTRY` اضافه شده؛ باید در env پروداکشن ست شود |
|
||||
| zip bomb (۱۰GiB) | 🔜 | سقف آپلود موجود؛ محدودیت تعداد entry در archive پیشنهاد میشود |
|
||||
|
||||
---
|
||||
|
||||
## ۳. دیپلوی و پیشنمایش
|
||||
|
||||
| یافته | وضعیت | یادداشت |
|
||||
|--------|--------|---------|
|
||||
| حذف preview با custom domain pending | ✅ | `hasVerifiedCustomDomain()` در k8s + deployments |
|
||||
| getPreviewInfo پچ NodePort | ✅ | فقط خواندن؛ ingressUrl اولویت دارد |
|
||||
| fallback بینکلاستری → ImagePullBackOff | ✅ | `CLUSTER_DEPLOY_FALLBACK_ENABLED=true` برای fallback |
|
||||
| NodePort host از API server | ⚠️ | `getClusterHostIp` همچنان fallback؛ ingressUrl مسیر اصلی |
|
||||
| suspend NodePort revoke | ✅ | `deleteTemporaryAccessServicesForApp` در suspend |
|
||||
|
||||
---
|
||||
|
||||
## ۴. دیتابیس و سرویسهای اختیاری
|
||||
|
||||
| یافته | وضعیت | یادداشت |
|
||||
|--------|--------|---------|
|
||||
| Redis/RabbitMQ randAlphaNum | ✅ | الگوی `lookup` در helm templates |
|
||||
| probe بدون auth | ✅ | redis-cli `-a` / mongo با credential |
|
||||
| RWO بدون Recreate | ✅ | `strategy: Recreate` |
|
||||
| dbPassword fallback هر deploy | ✅ | generate + persist در DB |
|
||||
| Mongo snapshot/restore | ✅ | |
|
||||
| WordPress MySQL اجباری | ✅ | |
|
||||
| wp-content restore از PVC | ✅ | |
|
||||
| PVC یتیم بعد از suspend/delete | 🔜 | نیاز به job پاکسازی دورهای |
|
||||
| ایمیج DB از Docker Hub | ⚠️ | آینه در `values.yaml`؛ پیکربندی per-cluster |
|
||||
|
||||
---
|
||||
|
||||
## ۵. Migration / اسکیما
|
||||
|
||||
| یافته | وضعیت |
|
||||
|--------|--------|
|
||||
| Job دوباره همه SQL | ✅ |
|
||||
| post-upgrade → pre-upgrade | ✅ |
|
||||
| نبود base schema | ✅ |
|
||||
| 015 user_id | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## ۶. بیلینگ
|
||||
|
||||
| یافته | وضعیت |
|
||||
|--------|--------|
|
||||
| wallet charge بدون درگاه | ✅ |
|
||||
| proration اشتباه | ✅ |
|
||||
| race در wallet | ✅ | pessimistic lock |
|
||||
| auto-renew دو بار بین replicas | ✅ | lock روی Application در transaction |
|
||||
| دیپلوی بدون پرداخت | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## ۷. GitOps / CI-CD
|
||||
|
||||
| یافته | وضعیت |
|
||||
|--------|--------|
|
||||
| workflow بدون تست | ✅ |
|
||||
| elastic password در git | ✅ |
|
||||
| platform Redis requirepass | ✅ |
|
||||
| backend RollingUpdate + limits + postgres backup | ✅ |
|
||||
| Swagger در production | ✅ |
|
||||
| RUNBOOK-DEPLOY portable | ✅ | commit `6d9cd89` |
|
||||
|
||||
---
|
||||
|
||||
## ۸. امنیت اپلیکیشن
|
||||
|
||||
| یافته | وضعیت | یادداشت |
|
||||
|--------|--------|---------|
|
||||
| gitToken / dbPassword در API | ✅ | `@Exclude` + `hasDbPassword` / `hasGitToken` |
|
||||
| Elasticsearch log isolation | ✅ | namespace کامل |
|
||||
| OTP Math.random | ✅ | `crypto.randomInt` |
|
||||
| OTP consume race | ✅ | pessimistic lock در transaction |
|
||||
| JWT در localStorage | 🔜 | نیاز به httpOnly cookie + CSRF — اسکوپ frontend بزرگ |
|
||||
| refresh token rotation | 🔜 | |
|
||||
| secret پیشفرض dev | ⚠️ | `validate-production-config` در production fail میکند |
|
||||
| docker compose NODE_ENV=production | ✅ | `NODE_ENV: development` برای dev محلی |
|
||||
|
||||
---
|
||||
|
||||
## ۹. بهبود / زیرساخت
|
||||
|
||||
| یافته | وضعیت |
|
||||
|--------|--------|
|
||||
| Backend Dockerfile helm/kubectl از اینترنت | 🔜 | mirror یا COPY از stage |
|
||||
| orphan PVC cleanup | 🔜 |
|
||||
| zip bomb hard limit | 🔜 |
|
||||
|
||||
---
|
||||
|
||||
## متغیرهای محیطی جدید (مرجع deploy)
|
||||
|
||||
| متغیر | پیشفرض | توضیح |
|
||||
|--------|---------|-------|
|
||||
| `CLUSTER_DEPLOY_FALLBACK_ENABLED` | `false` | fallback بین کلاستر |
|
||||
| `CLUSTER_DEPLOY_FALLBACK_ATTEMPTS` | `3` | فقط وقتی fallback فعال |
|
||||
| `BASE_IMAGE_REGISTRY` | — | آینه base imageهای بیلد |
|
||||
| `BUILD_PVC_STORAGE_CLASS` | — | StorageClass برای PVC بیلد |
|
||||
| `BILLING_WALLET_HMAC_SECRET` | — | اجباری در production |
|
||||
| `PAYMENT_GATEWAY_*` | — | اجباری برای charge واقعی |
|
||||
|
||||
---
|
||||
|
||||
## commitهای مرتبط
|
||||
|
||||
- `22359be` — fix(platform): apply production hardening from audit plan
|
||||
- `6d9cd89` — docs: add portable from-zero deploy runbook and GitOps templates
|
||||
- *(uncommitted)* — رفع موارد باقیمانده این سند (preview، OTP، zip slip، auto-renew lock، docker-compose)
|
||||
Reference in New Issue
Block a user