[Fable 5][uncertain][P3] Excel-экспортёр §13: строки отчёта, начинающиеся с '=', пишутся как живые формулы (formula/DDE-injection) #1244

Closed
opened 2026-06-13 04:58:12 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/1 верификаторов real)

⚠️ Только 1 из 1 адверсариальных верификаторов подтвердил баг как real. Заведено по решению Anton (2026-06-13) — требует дополнительной проверки перед фиксом. Severity P3 (security), confidence 0.55.

Файл

backend/app/services/exporters/excel.py:236

Evidence (цитата кода)

for data_row in rows:
        for col_idx, value in enumerate(data_row, start=1):
            cell = ws.cell(row=row, column=col_idx, value=_fmt(value))

Why bug (по версии finder'а)

_fmt возвращает строки как есть, а openpyxl (проверено на 3.1.5: data_type='f') сохраняет строку с ведущим '=' как ФОРМУЛУ. В отчёт попадают внешние данные (comm_name из скрейпинга DOM.РФ, headline/usp_text, ключи key_numbers): имя ЖК '=HYPERLINK(...)' станет активной формулой в .xlsx. Парный report_pdf.py тот же вход явно трактует как недоверенный и экранирует; здесь нейтрализации нет. P3, т.к. экспортёр пока не подключён к endpoint (#959 подключил md/json/tg/docx/pptx).

Suggested fix

В _fmt для str нейтрализовать ведущие '=', '+', '@', '\t': return "'" + value при value.startswith(('=','+','@')) — либо писать ячейку с явным data_type='s'.

Verify notes (вердикты адверсариальных верификаторов)

  • [real/P3] Эмпирически на залоченной openpyxl 3.1.5: строка с ведущим '=' через ws.cell получает data_type='f' и сохраняется живой формулой. _fmt возвращает str как есть; санитизации нет по всей цепочке (assembler передаёт analyze сырым, comm_name — из скрейпера DOM.РФ). Парный report_pdf.py тот же вход явно трактует как недоверенный (html.escape, «вход трактуем как недоверенный»). Единственная митигация — экспортёр не подключён к endpoint (#959), потому P3, не выше.

Provenance

  • Finders: services-misc
  • Confidence: 0.55
  • Verifier votes: 1 real / 0 refuted (на основании 1 попыток)
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/1 верификаторов real) ⚠️ **Только 1 из 1 адверсариальных верификаторов подтвердил баг как `real`**. Заведено по решению Anton (2026-06-13) — требует **дополнительной проверки** перед фиксом. Severity **P3** (security), confidence 0.55. ## Файл [`backend/app/services/exporters/excel.py:236`](backend/app/services/exporters/excel.py:236) ## Evidence (цитата кода) ``` for data_row in rows: for col_idx, value in enumerate(data_row, start=1): cell = ws.cell(row=row, column=col_idx, value=_fmt(value)) ``` ## Why bug (по версии finder'а) _fmt возвращает строки как есть, а openpyxl (проверено на 3.1.5: data_type='f') сохраняет строку с ведущим '=' как ФОРМУЛУ. В отчёт попадают внешние данные (comm_name из скрейпинга DOM.РФ, headline/usp_text, ключи key_numbers): имя ЖК '=HYPERLINK(...)' станет активной формулой в .xlsx. Парный report_pdf.py тот же вход явно трактует как недоверенный и экранирует; здесь нейтрализации нет. P3, т.к. экспортёр пока не подключён к endpoint (#959 подключил md/json/tg/docx/pptx). ## Suggested fix В _fmt для str нейтрализовать ведущие '=', '+', '@', '\t': return "'" + value при value.startswith(('=','+','@')) — либо писать ячейку с явным data_type='s'. ## Verify notes (вердикты адверсариальных верификаторов) - [real/P3] Эмпирически на залоченной openpyxl 3.1.5: строка с ведущим '=' через ws.cell получает data_type='f' и сохраняется живой формулой. _fmt возвращает str как есть; санитизации нет по всей цепочке (assembler передаёт analyze сырым, comm_name — из скрейпера DOM.РФ). Парный report_pdf.py тот же вход явно трактует как недоверенный (html.escape, «вход трактуем как недоверенный»). Единственная митигация — экспортёр не подключён к endpoint (#959), потому P3, не выше. ## Provenance - Finders: `services-misc` - Confidence: 0.55 - Verifier votes: 1 real / 0 refuted (на основании 1 попыток) - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:58:12 +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#1244
No description provided.