Skip to content

Conchshell 2.9.1 (macOS + Linux)

Choose a tag to compare

@github-actions github-actions released this 02 Aug 18:54

Conchshell для macOS (Apple Silicon) и Linux.
Скачивайте .dmg (macOS) либо .AppImage / .deb (Linux). Артефакты автообновления (latest.json, *.sig) приложены.


Главное: пароли больше не лежат открытым текстом

До этой версии сохранённые пароли, ключевые фразы и учётные данные прокси и jump-хостов хранились в localStorage — обычным текстом, в файле внутри каталога приложения. Их читал любой процесс от вашего имени, они уезжали в любой бэкап и находились обычным grep.

Теперь при первом запуске появляется мастер, который переносит их в зашифрованное хранилище: XChaCha20-Poly1305, ключ через Argon2id, отдельные независимые слоты ключей. Перенос идёт по схеме «записать → прочитать обратно с диска → сверить → только потом стереть открытую копию», поэтому сбой на любом шаге не может уничтожить единственный экземпляр пароля.

Команды чтения секрета не существует. Фронтенд может положить пароль в хранилище и удалить его, но получить обратно — нет. Учётные данные читает только Rust, в момент подключения. Скомпрометированное окно приложения не может выгрузить хранилище через IPC.

Мастер-пароль не нужен. Хранилище открывается ключом из keychain macOS, без запросов при запуске. Если хотите более строгий режим — «Настройки → Безопасность → Спрашивать мастер-пароль при запуске»; тогда хранилище остаётся запертым, пока вы не введёте пароль, и это защищает его и от всего, что работает на машине до первой разблокировки. Оба способа — независимые обёртки одного ключа, так что переключение туда-обратно ничего не перешифровывает и не обесценивает уже записанный пароль.

Честно о границах: ключ в обычном keychain читается любым процессом, работающим от вашего имени. То есть хранилище защищено настолько же, насколько ваша учётная запись macOS. Бэкап одного файла хранилища бесполезен — ключа в нём нет; бэкап вместе с login.keychain-db отдаёт ключ тому, у кого есть ваш пароль входа. Подробности — docs/vault-format.md, раздел 2.5.1.


Закрытые уязвимости

Три отдельных прохода аудита, каждая находка проверялась независимым агентом с задачей её опровергнуть.

Враждебный SSH-сервер мог записать файл в любое место диска. Вкладка «Files» получала листинг, разбирая вывод ls -la, и отбрасывала только строки . и ... Имя вида ../../../../.zshrc проходило и склеивалось с папкой, выбранной для загрузки, — содержимое тоже выбирал сервер. Дальше ~/.zshrc или ~/.ssh/authorized_keys и выполнение кода при следующем входе. Закрыто с трёх сторон, включая проверку в самой команде скачивания.

Терминал отвечал на запрос чтения буфера обмена. Последовательность OSC 52 ; c ; ? заставляла приложение прочитать системный буфер и отправить его обратно в stdin того же сервера. Для SSH-клиента со встроенным хранилищем это прямой способ увести пароль или ключ; ответ уходил как ввод, поэтому в raw-режиме на экране не появлялось ничего. Чтение теперь запрещено безусловно, настройки для него нет. Запись оставлена и включена по умолчанию — она нужна, например, чтобы копировать из vim через SSH.

Одно окно могло управлять сессиями другого. Аутентификация канала не мешала одному сокету писать в чужой терминал, менять его размер и получать его вывод. Теперь сообщение к живой сессии принимается только от сокета, который её создал.

Импорт known_hosts терял отзыв ключа. Строка @revoked * <ключ> — стандартный способ отозвать ключ везде — не разбиралась, и отозванный отпечаток мог попасть в доверенные, после чего соединение проходило вообще без вопросов.

Отключение соединений не работало. Двенадцать вызовов передавали аргументы в неверном регистре, команда их не находила и отклоняла — молча, потому что ошибку никто не показывал. Так не работали отключение SSH/SFTP/FTP и кнопка отмены подключения.

FTPS теперь закрепляет ключ сервера через тот же механизм, что SSH и RDP: первое подключение спрашивает доверие, изменившийся ключ — отказ. Заодно вернулась поддержка самоподписанных сертификатов, которых для FTPS большинство.


Новое

  • Выбор программы для открытия файлов. В редакторе появилось меню: открыть в системной программе по умолчанию, выбрать конкретную и запомнить её, забыть выбранную. Встроенный редактор остаётся значением по умолчанию для всего, что умеет показать.
  • Управление хранилищем в настройках — состояние, кнопка «Запереть», переключатель мастер-пароля.

Исправления

  • Мигрированное соединение нельзя было открыть из диалога: он требовал пароль в поле, которое миграция намеренно опустошила.
  • Правка пароля стирала сохранённые пароли прокси и jump-хоста.
  • Восстановление сессии стартовало при запертом хранилище, из-за чего все соединения падали при запуске.
  • Пароль прокси для RDP не доставался из хранилища.
  • Вкладка «Безопасность» состояла из трёх переключателей, не подключённых ни к чему. Опаснее прочих был «Host Key Verification»: он выглядел выключаемым, тогда как проверка ключа безусловна. Заменено на честный статус.
  • Импорт конфигурации по умолчанию заменял все соединения без предупреждения. Теперь по умолчанию объединение, а замена требует подтверждения с числом удаляемых записей.
  • Русские формы множественного числа существовали только для 1 и «многих», поэтому любое число от 2 до 20 показывалось по-английски. Добавлены недостающие формы, проверка покрытия переписана по категориям Intl.PluralRules.
  • Поправлена вёрстка в настройках: заголовок строки и надпись на кнопке использовали одну и ту же длинную строку.

Важно при обновлении

Это переходная версия смены ключа подписи обновлений. Сборки несут новый публичный ключ, но подписаны старым, потому что установленный клиент проверяет подпись тем ключом, который вкомпилирован в него самого. Обновление с 2.9.0 пройдёт штатно.

Ключ подписи в CI нельзя переключать на новый, пока эта версия не разойдётся, — иначе обновления оборвутся у всех, кто ещё на 2.9.0.


Что осталось открытым

Чтобы не создавать ложного впечатления. Команды Tauri не разграничены по правам: любое окно может вызвать любую команду по чужому идентификатору соединения, а решение о доверии к ключу сервера принимает сторона окна. Не проверялись аудитом: слой VNC, разбор протоколов SFTP/FTP и механизм самообновления целиком. Сборки под Windows не выпускаются и этот путь не проверялся.

Полный список изменений — CHANGES.md.