Форматированный 10-значный мобильный без кода страны (922 123 45 67 / 922-123-45-67) проходит redaction нетронутым #1641

Closed
opened 2026-06-16 18:46:28 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: security/data-residency · Файл: backend/app/services/llm/redaction.py:73-79, 103-112

redaction.py:74 — _PHONE_RE требует префикс +7/8 и хотя бы один разделитель; redaction.py:79 — _PHONE_BARE_RE требует ровно 11 слитных цифр, начинающихся с 7/8. Локальный мобильный, записанный как 10 значащих цифр без кода страны И с разделителями ('922 123 45 67' или '922-123-45-67'), не матчит ни phone (нет префикса), ни phone_bare (есть разделители + только 10 цифр), ни inn (разделители рвут слитность), ни snils, ни passport. Проверено standalone-прогоном: строка возвращается без изменений. Импакт: телефон уходит во внешний OpenAI нередактированным — остаточная дыра §19-residency того же класса, что закрытый #1207, но иного паттерна (#1207 закрыл голую 11-значную форму 7XXXXXXXXXX/8XXXXXXXXXX, а этот формат — local-10 с разделителями — не покрыт). Смягчающий фактор: это вторичная belt-and-suspenders защита; первичная гарантия — allowlist (safe_payload.py: консьюмер не должен класть сырой телефон в SafePayload). Фикс: добавить паттерн на 10-значный local-формат с разделителями (например (?<!\d)9\d{2}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}(?!\d)) с осторожностью к false-positive по другим 10-значным группам.

Почему баг: Это вторичная (belt-and-suspenders) защита §19, а внешний провайдер OpenAI выгружает данные за пределы РФ. Закрытый #1207 закрыл голую 11-значную форму (7XXXXXXXXXX/8XXXXXXXXXX), но не покрыл распространённый local-формат без кода страны с разделителями — телефон уходит в OpenAI нередактированным. Severity low: первичная защита — allowlist (консьюмер не должен класть сырой телефон в SafePayload), и это не основная гарантия; но это реальная остаточная дыра того же класса, что #1207, иной паттерн.

Как чинить: Добавить паттерн для 10-значного локального мобильного (первая цифра 9) с опц. разделителями: например (?<!\d)9\d{2}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}(?!\d), поставив ПОСЛЕ inn/snils, чтобы не конфликтовать; либо явно зафиксировать в docstring, что 10-значные локальные номера не покрываются вторичным scrub.


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.8 · unit B29

**Severity:** low · **Категория:** security/data-residency · **Файл:** `backend/app/services/llm/redaction.py:73-79, 103-112` redaction.py:74 — _PHONE_RE требует префикс +7/8 и хотя бы один разделитель; redaction.py:79 — _PHONE_BARE_RE требует ровно 11 слитных цифр, начинающихся с 7/8. Локальный мобильный, записанный как 10 значащих цифр без кода страны И с разделителями ('922 123 45 67' или '922-123-45-67'), не матчит ни phone (нет префикса), ни phone_bare (есть разделители + только 10 цифр), ни inn (разделители рвут слитность), ни snils, ни passport. Проверено standalone-прогоном: строка возвращается без изменений. Импакт: телефон уходит во внешний OpenAI нередактированным — остаточная дыра §19-residency того же класса, что закрытый #1207, но иного паттерна (#1207 закрыл голую 11-значную форму 7XXXXXXXXXX/8XXXXXXXXXX, а этот формат — local-10 с разделителями — не покрыт). Смягчающий фактор: это вторичная belt-and-suspenders защита; первичная гарантия — allowlist (safe_payload.py: консьюмер не должен класть сырой телефон в SafePayload). Фикс: добавить паттерн на 10-значный local-формат с разделителями (например (?<!\d)9\d{2}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}(?!\d)) с осторожностью к false-positive по другим 10-значным группам. **Почему баг:** Это вторичная (belt-and-suspenders) защита §19, а внешний провайдер OpenAI выгружает данные за пределы РФ. Закрытый #1207 закрыл голую 11-значную форму (7XXXXXXXXXX/8XXXXXXXXXX), но не покрыл распространённый local-формат без кода страны с разделителями — телефон уходит в OpenAI нередактированным. Severity low: первичная защита — allowlist (консьюмер не должен класть сырой телефон в SafePayload), и это не основная гарантия; но это реальная остаточная дыра того же класса, что #1207, иной паттерн. **Как чинить:** Добавить паттерн для 10-значного локального мобильного (первая цифра 9) с опц. разделителями: например (?<!\d)9\d{2}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}(?!\d), поставив ПОСЛЕ inn/snils, чтобы не конфликтовать; либо явно зафиксировать в docstring, что 10-значные локальные номера не покрываются вторичным scrub. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.8 · unit B29</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:46:28 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1641
No description provided.