2.9 KiB
2.9 KiB
Аудит Sonnet — результаты
Ключевые цифры
- 48 проблем найдено
- 14 CRITICAL, 15 HIGH, 19 MEDIUM
- 17 файлов проанализировано
ТОП-5 срочных
- upload.py:28 — Path Traversal:
filenameбезos.path.basename()→../../etc/passwd - app.js:79,495-520,497,703,708 — XSS × 5 мест:
innerHTMLбезescHtml()на данных от LLM - grouping.py:76 —
supplements_list.remove(s)в итерации → пропуск элементов - spec_events.py:15 —
MAX(seq)+1без блокировки → race condition на seq - prompts.py:40,73,86 — 3 race conditions: seed/save/activate без транзакций
Что я понял
Мои косяки (надо чинить)
-
XSS в 5 местах —
escHtmlне везде.counterparty,own_number,filename,contract_number— всё от LLM, всё в innerHTML без экранирования. Тупо пропустил. -
supplements_list.remove(s)в цикле — реальный баг в grouping.py:76. При удалении элемента из списка во время итерации for пропускаются элементы. Может ломать группировку. -
syncDB()без await — fire-and-forget. Если сервер не ответил — не узнаем. БД рассинхронится с таблицей. -
delete_by_documentудаляет spec_current для ВСЕГО контракта — если у контракта 3 supplements, удаление одного затирает spec_current для двух других. Серьёзный баг в supplements.py. -
verify=Falseв httpx — отключена проверка SSL. MITM-уязвимость в classify.py и llm_prompt.py.
Что НЕ надо чинить (не критично)
- Dead code (дубликат
_handle_cleanup) — не влияет на работу. _serializeмутирует словарь — косметика.v1.0.175хардкод — пока сойдёт..docбез fallback — формат редкость.errors="ignore"в парсинге — мелочь.
Что Sonnet нашёл сверх моего анализа
MAX(seq)+1race condition — я не подумал про параллельные запросы к spec_events.apply_groups()без транзакций — я не проверил атомарность._safe_json_parse()возвращает None для"null"— edge case который я упустил.- DoS через
keep_idsбез лимита — не подумал про O(N²). get()возвращает base64 original_bytes (133MB) — утечка памяти.