Неудобные вопросы о Cotton.
Не надо верить на слово. Здесь спорим о том, где Cotton сильнее, где он вообще не нужен и что в нём пока не идеально.
- Q 01
Если коротко: за что вообще выбирать Cotton?
За редкую вещь: безопасность, скорость и удобство без ритуальной жертвы одного ради другого. Cotton собран на современном индустриальном стеке, но не требует индустриального терпения. Домохозяйка должна скинуть фотографии без инструкции. Задрот — развернуть всё у себя, залезть под капот и не упереться в игрушечный потолок. Обоим интерфейс должен казаться телепатией: очевидное делается сразу, а не ищется по меню. И файлы не сваливаются в одну безликую кучу: фотографии, видео, документы, архивы и рабочие данные загружаются, открываются, показываются и расшариваются так, как естественно именно для их формата. Без костылей, охоты за плагинами и компромиссов по умолчанию.
- Q 02
/admin/security только опрашивает сам Cotton и рисует балл. Разве это не такая же самопроверка, как у Nextcloud?
В Nextcloud я буквально меняю одну строку в Checker.php, который лежит на том же диске: заставляю isCodeCheckEnforced() вернуть false — и проверка целостности отключает сама себя (пруф). Не обхожу защиту и не подделываю отчёт: сама проверка решает, что проверять больше не нужно. Проверяющий и проверяемые PHP-файлы подчиняются одному и тому же доступу. /admin/security в Cotton вообще не является защитой. Это табло над проходной. Даже если его не открыть, официальный образ всё равно запускает процесс не от root, отключает диагностику .NET и запрещает дампы, а поддельная строка БД без правильной MAC-подписи будет отвергнута в момент использования. В Nextcloud взломщику достаточно одной строки в исходнике самой проверки. В Cotton ему нужно пройти границы контейнера и процесса, стать самим запущенным сервером и завладеть ключом. Это не две версии одной проверки. Это пломба на двери и система пропусков на каждом рубеже.
- Q 03
При RCE атакующий всё равно прочитает мастер-ключ. Тогда какой смысл во всей этой защите?
RCE буквально означает, что атакующий уже стал процессом Cotton и видит его память. На этом уровне проиграют Nextcloud, Seafile и любой другой сервер: сервер не может спрятать секрет от самого себя. Вопрос не в том, существует ли финальный уровень компрометации. Вопрос в том, сколько границ нужно пройти до него и что можно подделать, не имея ключа. Защита нужна не после того, как сервер уже стал атакующим, а чтобы одного доступа к диску или базе для этого не хватило. И есть режим, который переживает даже RCE на сервере: E2E-папки. Их ключи остаются на клиентах, поэтому взломанный сервер получит только шифротекст. Для обычных папок Cotton сокращает поверхность атаки. Для E2E-папок — вообще исключает сервер из доверия.
- Q 04
Cotton использует самописную криптографию без внешнего аудита. Вы серьёзно?
Попросите толкового выпускника факультета кибербезопасности реализовать потоковое шифрование файлов на стандартном стеке .NET — он нарисует ту же схему. Не потому, что Cotton примитивен, а потому, что хорошая криптография не оставляет места авторскому почерку. Формат может быть своим. Криптография — нет. Корневой секрет разводится на независимые ключи через HKDF-SHA256; для каждого файла криптографический генератор создаёт отдельный 256-битный ключ; данные шифруются AES-256-GCM с 96-битным nonce и 128-битным тегом; метаданные аутентифицируются как AAD; ключ файла отдельно защищается мастер-ключом. Nonce внутри файла не повторяются: случайный префикс объединяется с 64-битным счётчиком чанков. Ключевой материал после работы затирается. Никакой авторской магии — textbook envelope encryption на стандартных примитивах платформы. Внешнего аудита пока нет, и это честный минус. Но отсутствие аудита не превращает стандартную схему в самописный шифр.
- Q 05
Проект молодой, звёзд мало. Разве это не значит, что ему нельзя доверять?
Нет. Молодость означает, что у проекта ещё нет длинной истории. Она не означает, что проект автоматически ненадёжен. Если молодому проекту нельзя довериться по определению, зрелых проектов больше никогда не появится: без первых пользователей не будет ни эксплуатации, ни проверок, ни той самой зрелости. Требовать её заранее — всё равно что требовать готовую картину до первого мазка. Если бы вы выбрали Seafile, вы бы в первый вечер перенесли туда единственную копию всех данных и удалили старую? Конечно нет. Параллельный запуск, проверка восстановления и постепенная миграция — не особая скидка молодому Cotton, а нормальный переход на любое хранилище. Совет «не делайте его единственной копией в первый день» ничего не говорит о Cotton. Он говорит лишь о том, что мигрировать без бэкапа в любой системе — глупо. Звёзды GitHub тоже не приговор. Это не реестр установок и не аудит — просто число владельцев аккаунта, которые нажали кнопку. У многих селфхостеров аккаунта там вообще нет. Смотрите не на дату рождения, а на то, что уже можно проверить: архитектуру, изменения, восстановление данных и открытый код. Зрелость иногда означает опыт. Иногда — стек, который все боятся тронуть. Perl зрелый. PHP зрелый. Fortran ещё зрелее. А перфокарты — вообще заебись. Возраст — биография, а не сертификат качества. Каждый зрелый проект когда-то начинался с нуля. Cotton зарабатывает зрелость так же: релиз за релизом, пользователь за пользователем.
- Q 06
Шифрованные чанки, база, мастер-ключ. Значит данные — заложники Cotton?
Нет. Заложник — это данные без проверенного восстановления. Обычные файлы на диске не воскрешают умерший диск, не отменяют удаление и не побеждают вымогателя. Мастер-ключ в зашифрованной системе — не компромат, а смысл шифрования. Бэкап без ключа — не бэкап. Проверяйте весь контур: данные, базу, ключ и реальное восстановление. И Cotton не ждёт, пока битый файл найдёт пользователь: в фоне он случайно выбирает чанки и повторно проверяет их целостность, чтобы тихо умирающий диск проявился раньше. Это скучнее, чем надеяться на знакомые имена файлов. Зато это честно.
- Q 07
Можно ли достать файлы без работающего Cotton?
Старый Cotton умер? Передайте чистому Cotton хранилище и мастер-ключ — базу он восстановит из собственного бэкапа. Не хотите запускать Cotton вообще? Формат и код чтения открыты: собрать чанки обратно — небольшой конвертер, а не археология закрытого формата. Между вами и вашими данными нет ни лицензии, ни облака, ни автора.
- Q 08
Дедупликация — это же атака Proof of Ownership?
Только если сервер подтверждает совпадение до загрузки. Поэтому первый вопрос мастера Cotton — «Для семьи» или «С незнакомцами?». Выбираете «С незнакомцами» — Cotton принимает файл целиком и дедуплицирует уже на сервере: оракла нет, экономия места остаётся. Выбираете «Для семьи» — совпадение находится до загрузки, поэтому экономится ещё и трафик. Та же дедупликация. Разная модель доверия. Не дыра, а настройка человеческим языком.
- Q 09
Cotton делает один человек. А если он ошибётся или просто исчезнет?
Свои ошибки я ищу сам: регулярно атакую собственный сервер и ловлю уязвимости до того, как они становятся issue на GitHub. У меня есть доступ к специализированным ИИ-моделям для кибербезопасности: с ними я проверяю больше сценариев атак и ищу то, что мог пропустить один. Безопасность для меня — не галочка в списке уязвимостей: я сам пользуюсь Cotton каждый день и доверяю ему свои данные. А если я исчезну, open source не материализует команду мейнтейнеров — и никто этого не обещает. Он даёт право продолжить: код, сборка, формат и документация остаются открытыми; Cotton можно форкнуть, исправить или передать любому разработчику без моего разрешения. Bus factor влияет на будущую разработку, но не отнимает у вас продукт и право распоряжаться им. В закрытом проекте исчезновение владельца оставляет только то, что он разрешил оставить. Open source — не пророчество о том, кто продолжит. Это право продолжить без разрешения.
- Q 10
Почему у Cotton нет магазина с сотней плагинов и приложений?
Потому что Cotton — файловое облако, а не комбайн с магазином заплаток. Всё, что действительно нужно для работы с файлами, уже реализовано, в работе или в планах. Для остального специализированные сервисы просто сильнее: таблицы — Grist, 2FA — 2FAuth, пароли — Vaultwarden, заметки и wiki — Outline, почта — Bulwark поверх Stalwart. Сами подумайте, кто решит задачу лучше: плагин внутри комбайна, который один универсальный разработчик тянет между десятками других, или отдельное приложение, заточенное именно под неё. Cotton не пытается засунуть весь интернет в один контейнер. Он делает файловое облако.
- Q 11
Почему не выбрать одну из зрелых альтернатив?
Потому что каждая закрывает только часть задачи. У Seafile отличный движок хранения и синхронизации. Git тоже имеет объекты, коммиты, деревья и снимки. От этого Git не становится удобным домашним облаком. У Seafile сильная синхронизация, а браузер, превью, работа с форматами и бесплатная функциональность остаются бедными. ownCloud Infinite Scale современный внутри, но для одного владельца это бедноватое файловое приложение в тяжёлом enterprise-каркасе. OpenCloud делает ставку на Spaces, федерацию и Office, что неудобно для домашнего использования. Pydio Cells — платформа для корпоративной коллаборации, где SSO и MFA начинаются в платных редакциях от 50 пользователей. SFTPGo — транспорт, Filebrowser — окно в папку. У Cotton нет монополии на серьёзный движок хранения. Его отличие в том, что поверх движка уже построен цельный современный продукт: превью и нативная работа с форматами, дедупликация между пользователями, а не только внутри библиотеки, шифрование, E2E, WebDAV, клиенты и автоматическое восстановление. Не движок вместо продукта и не продукт поверх папки — оба слоя сразу.
- Q 12
В README сказано: CTN1 нужно конвертировать версией 0.4.35 перед обновлением до 0.5. Формат уже сломали?
Нет. Это называется миграция, а не поломка. CTN1 появился до обязательного аутентифицированного терминатора; CTN2 добавил его, чтобы обрезанный файл нельзя было принять за целый. Версия 0.4.35 заранее получила одноразовый фоновый переход: она переписывает старые контейнеры и готовит инстанс к 0.5. Строка в README и проверка CTN1 временные — после окна обновления их удалят. Для беты можно было сказать: «начните заново». Вместо этого Cotton получил полноценный безопасный мост между форматами. Для беты это уже оверкилл. Cotton сделал и это.
Ваш вопрос: