mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 01:14:58 +03:00
🔒 fix(security): границы, которые обходились через соседний эндпоинт
Разбор аудита, блоки B, C и D. Каждая правка — с тестом. Критичное: - 2FA снималась без пароля: POST /auth/profile/totp/start/ выключал уже включённую 2FA, минуя и текущий пароль, и требование организации, которые спрашивает соседний /disable/. Теперь 409, если 2FA включена. - Сброс пароля по письму оставлял чужие сессии живыми — то есть не помогал ровно в том случае, ради которого пароль и сбрасывают. Сессии завершаются, как при смене пароля из профиля. - HTTPS на домене установки не выпускался никогда: ask-эндпоинт шлюза знал только домены порталов. Теперь он признаёт и адрес самой установки. - WebSocket молча не работал на любой установке с TLS: браузер держит __Host-cookie, а Channels ищет сессию по обычному имени, и HTTP-middleware на хендшейк не выполняется. Добавлен chatballs.http.ws_middleware. Существенное: - Повтор входящего сообщения ронял весь цикл поллинга: IntegrityError ловился без точки сохранения внутри чужой транзакции. - Смена адреса в «Настройках» выбрасывала того, кто её делает. Прежний адрес остаётся принятым (identity.0033). - Редирект уводил скачивание во внутреннюю сеть: политика исходящих проверяла только исходный адрес. Проверка висит на каждом Location. - Портал помощи можно было повесить на адрес установки и подменить сотрудникам приложение своим Help Center. - Пароль прокси уходил в ответ API целиком; теперь маскируется, а маска при сохранении возвращает сохранённый пароль. - /api/v1/health/ready/ закрыт на публичной границе. Мелочи: адрес для A-записи портала считается от адреса установки, а не от 127.0.0.1; колонка EncryptedCharField вмещает шифротекст, а не открытое значение; WS-маршруты проверяют Origin; мёртвый require_organization_scope убран. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8fe66385d6
commit
cc03c5fa3d
40 files changed
+1383
-74
No files matched your search
@@ -23,6 +23,14 @@ server {
|
||||
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
||||
}
|
||||
|
||||
# Готовность стека — внутренний сигнал: её спрашивают healthcheck'и и
|
||||
# smoke изнутри сети. Снаружи она сообщала бы состояние базы и Redis
|
||||
# любому желающему. Liveness (/health/live/) остаётся открытым: по нему
|
||||
# балансировщик отличает живой контейнер от мёртвого.
|
||||
location = /api/v1/health/ready/ {
|
||||
return 404;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://backend-app:8000/api/;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
Reference in new issue
Block a user