К обсуждениям

Coder provisioner: FileSize проверяется до выделения памяти

Редакция VOne Технологии

Защитная проверка Coder provisioner upload по ghsa-f962-qm93-mj4c: применимость, обратимый fixture для границы «верхняя граница client-supplied FileSize до make byte-slice независимо от wire-size сообщения», измеримый результат и stop-rule без production-данных.

Докажите применимость к Coder provisioner upload

Начните не с severity, а с доказательства применимости. Для Coder provisioner upload и границы «верхняя граница client-supplied FileSize до make byte-slice независимо от wire-size сообщения» зафиксируйте runtime version, package source, отпечаток бинарника, активный feature/config path и роль, которая достигает функции. Reviewed Advisory фиксирует «github.com/coder/coder/v2 >= 2.34.0, < 2.34.2; first patched 2.34.2 | github.com/coder/coder/v2 >= 2.33.0, < 2.33.8; first patched 2.33.8 | github.com/coder/coder/v2 >= 2.30.0, < 2.32.7; first patched 2.32.7 | github.com/coder/coder/v2 >= 2.24.0, < 2.29.17; first patched 2.29.17», публикацию 2026-07-06 и обновление 2026-07-06, но само по себе не устанавливает наличие у вас уязвимого бинарника, реальную эксплуатацию или спрос. Такой порядок не превращает advisory в утверждение о конкретной установке. Если версия собрана из fork или vendor patch, зафиксируйте commit/patch provenance отдельно: одна строка semver не отвечает, присутствует ли исправление.

Зафиксируйте отдельный защитный контракт

Выразите проверяемый инвариант своими словами: допустимые значения следуют контракту; превышение даёт typed error, allocator-call и allocated-bytes равны нулю. Исходная пользовательская боль здесь конкретна — короткое сообщение декларирует огромный размер и вызывает unrecoverable allocation раньше загрузки содержимого. Не смешивайте её с общими страницами про обновления, XSS, SSRF или отказ в обслуживании: механизм и ожидаемый ответ должны быть самостоятельными. До опыта укажите субъект, объект, доверенную границу, разрешённый побочный эффект и сигнал нарушения. Для этого материала артефакт решения — матрица declared-size / wire-size / validation-stage / allocator-calls / allocated-bytes / result. Он не содержит токены, IP, содержимое файлов или персональные данные; достаточно классов результата, счётчиков и digest тестового состояния.

Поставьте обратимый минимальный опыт

Разверните обратимый стенд: unit fixture DataUpload с boundary-1, boundary и boundary+1; allocator заменён счётчиком, байтовый payload пуст. Следующим шагом декодировать fixtures и фиксировать validation result до обращения к allocator, не запрашивая фактический большой буфер. Используйте минимальные синтетические значения, запрет внешней сети, отдельный temp root и положительный контроль, который проходит тот же код без пограничного условия. Перед опытом зафиксируйте digest fixture, версию и timeout, после — digest состояния и cleanup result. Не переносите пример на production и не увеличивайте нагрузку ради наглядности. Когда этот узел нельзя подменить или изолировать, ограничьтесь статической проверкой patch/release и отложите runtime-подтверждение.

Сведите наблюдения в матрицу решения

Исход разбирайте по заранее заданному правилу, а не по впечатлению от лога. Защитный исход: допустимые значения следуют контракту; превышение даёт typed error, allocator-call и allocated-bytes равны нулю. Для каждого ряда в «матрица declared-size / wire-size / validation-stage / allocator-calls / allocated-bytes / result» зафиксируйте expected и observed, а также точную стадию отказа: parse, validate, authorize, allocate, open, mutate или cleanup. Ошибка до опасного действия и ошибка после него — разные результаты. Normal-control обязан доказать, что тест не сломан целиком. Повторите fixture не менее двух раз только в пределах локального бюджета: одинаковый класс исхода важнее длинного stdout.

Остановитесь при первом выходе за границу

Примените stop-rule без торга: прекратить работу, если allocator нельзя подменить, если процесс начинает резервировать память или если cap не связан с серверным контрактом. Вторичные красные флаги — изменение объекта вне temp, неожиданный сетевой вызов, рост памяти, privilege prompt, необратимая запись, расхождение digest или отсутствие положительный контроль. При каждом таком флаге завершите процесс, зафиксируйте лишь обезличенную матрицу и верните стенд к исходному состоянию. Не публикуйте payload, реальные конфиги и подробности чужой системы. Severity не разрешает расширять тест: цель — подтвердить защитный контракт с минимальным воздействием.

Передайте поддержке минимальный пакет

Для владельца компонента подготовьте короткий пакет: ghsa-f962-qm93-mj4c, Coder provisioner upload, installed/build version, upstream commit, применимый диапазон «github.com/coder/coder/v2 >= 2.34.0, < 2.34.2; first patched 2.34.2 | github.com/coder/coder/v2 >= 2.33.0, < 2.33.8; first patched 2.33.8 | github.com/coder/coder/v2 >= 2.30.0, < 2.32.7; first patched 2.32.7 | github.com/coder/coder/v2 >= 2.24.0, < 2.29.17; first patched 2.29.17», описание fixture без чувствительных значений, матрица declared-size / wire-size / validation-stage / allocator-calls / allocated-bytes / result, положительный контроль, stop-rule, cleanup proof и ссылки на advisory/upstream. В отдельном поле отметьте unknown: reachability, vendor backport, runtime configuration и наличие compensating control. Решение может быть только одним из трёх: not-applicable с доказательством, update/test по утверждённому окну или blocked до безопасного стенда. Так поддержка получает минимальные данные для воспроизведения, а публичный материал не создаёт обещания индексацию, позиции, универсальную защищённость или результат на чужой инфраструктуре.

Свяжите исправление с механизмом Coder provisioner upload

Для Coder provisioner upload свяжите исправление именно с механизмом «верхняя граница client-supplied FileSize до make byte-slice независимо от wire-size сообщения», а не только с номером релиза. В changelog или diff найдите изменение, которое делает истинным результат «допустимые значения следуют контракту; превышение даёт typed error, allocator-call и allocated-bytes равны нулю», и сопоставьте его с диапазоном «github.com/coder/coder/v2 >= 2.34.0, < 2.34.2; first patched 2.34.2 | github.com/coder/coder/v2 >= 2.33.0, < 2.33.8; first patched 2.33.8 | github.com/coder/coder/v2 >= 2.30.0, < 2.32.7; first patched 2.32.7 | github.com/coder/coder/v2 >= 2.24.0, < 2.29.17; first patched 2.29.17». Следующим шагом повторите fixture «unit fixture DataUpload с boundary-1, boundary и boundary+1; allocator заменён счётчиком, байтовый payload пуст» на текущем и кандидатном артефакте в одинаковой изоляции; сравнивайте «матрица declared-size / wire-size / validation-stage / allocator-calls / allocated-bytes / result», а не произвольные строки лога. Если vendor backport меняет номер версии, зафиксируйте commit/diff provenance и сборочный digest. План возврата должен восстанавливать предыдущий тестовый артефакт, но не возвращать production к заведомо сомнительной версии. Критерий приёмки для этой отдельной боли — допустимые значения следуют контракту; превышение даёт typed error, allocator-call и allocated-bytes равны нулю; критерий прекращения — прекратить работу, если allocator нельзя подменить, если процесс начинает резервировать память или если cap не связан с серверным контрактом. Пока оба критерия не доказаны, статус обозначьте blocked или unknown, не подменяя результат предположением.

Материал подготовлен редакцией VOne с помощью ИИ; даты, диапазоны, прямые ссылки, безопасный опыт, privacy-ограничения и отсутствие рекламных обещаний затем перепроверены по первичным источникам.

Источники и проверка

Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.

Ответы

0 опубликовано
Ответов пока нет. Вы можете начать обсуждение.

Ваш ответ

Добавьте свой опыт или уточнение по теме.

Вы публикуете как Аноним Аватар отличает разговоры, но не раскрывает личные данные.

Ответ появится сразу. Не публикуйте личные данные, ключи и приватные ссылки.