fix(share-ai): fail-closed workspace limiter + lower default cap (RT-6.3) #62

Closed
opened 2026-06-21 01:56:55 +03:00 by Ghost · 0 comments

Источник: red-team-аудит, RT-6.0/6.3 (docs/red-team-report.md).
Модель угроз: анонимный ассистент снаружи; per-workspace cap — главная страховка по деньгам.

Что происходит

apps/server/src/core/ai-chat/public-share-workspace-limiter.ts режет 300 запросов/час на воркспейс (SHARE_AI_WORKSPACE_MAX_PER_WINDOW, env SHARE_AI_WORKSPACE_MAX_PER_HOUR). Но при недоступности Redis лимитер fail-open (:131 return true) — то есть «Redis упал = потолок исчез, безлимит». Это единственный сценарий, где счёт уходит в бесконечность.

Фикс

Фича опциональная, недоступность безболезненна → перевести в fail-closed:

// public-share-workspace-limiter.ts — FAIL CLOSED: if Redis is down we cannot
// prove the workspace is under its cap, so DENY (controller 429s) rather than
// admit an unmetered, billable anonymous call.
} catch (err) {
  this.logger.error(`share-ai limiter Redis failure for "${key}"; failing closed`, err as Error);
  return false;
}

Заодно опустить дефолтный часовой cap под реальную нагрузку (напр. SHARE_AI_WORKSPACE_MAX_PER_HOUR=100).

Цена / приоритет

1 строка (поменять return truereturn false) + обновить комментарий, который сейчас обосновывает fail-open.

**Источник:** red-team-аудит, RT-6.0/6.3 (`docs/red-team-report.md`). **Модель угроз:** анонимный ассистент снаружи; per-workspace cap — главная страховка по деньгам. ### Что происходит `apps/server/src/core/ai-chat/public-share-workspace-limiter.ts` режет 300 запросов/час на воркспейс (`SHARE_AI_WORKSPACE_MAX_PER_WINDOW`, env `SHARE_AI_WORKSPACE_MAX_PER_HOUR`). Но при недоступности Redis лимитер **fail-open** (`:131 return true`) — то есть «Redis упал = потолок исчез, безлимит». Это единственный сценарий, где счёт уходит в бесконечность. ### Фикс Фича опциональная, недоступность безболезненна → перевести в **fail-closed**: ```ts // public-share-workspace-limiter.ts — FAIL CLOSED: if Redis is down we cannot // prove the workspace is under its cap, so DENY (controller 429s) rather than // admit an unmetered, billable anonymous call. } catch (err) { this.logger.error(`share-ai limiter Redis failure for "${key}"; failing closed`, err as Error); return false; } ``` Заодно опустить дефолтный часовой cap под реальную нагрузку (напр. `SHARE_AI_WORKSPACE_MAX_PER_HOUR=100`). ### Цена / приоритет 1 строка (поменять `return true` → `return false`) + обновить комментарий, который сейчас обосновывает fail-open.
Ghost added the bugsecurity labels 2026-06-21 02:27:19 +03:00
Ghost closed this issue 2026-06-21 14:25:22 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#62