Перейти к содержимому

Безопасность

casty не проходил аудит. Эта страница перечисляет, что он хранит и что может каждая часть.

Секрет Где он Что он может Как отозвать
Seed-фраза В памяти, пока работает casty init или casty key revoke; никогда не записывается на диск и никуда не отправляется. С casty init --fid и ключом, добавленным со страницы кошельком, casty вообще её не видит Всё: она держит custody вашего fid casty не может. Храните её офлайн
Ключ приложения (Ed25519) ~/.config/casty/keys.enc.json, зашифрован scrypt и XChaCha20-Poly1305, режим 0600 Подписывать касты, реакции и подписки для вашего fid, пока не истечёт без использования (по умолчанию 30 дней, не больше 90) casty key revoke <key> с seed-фразой или --self самим ключом
Подписанный KEY_ADD, ещё не подтверждённый В том же зашифрованном хранилище, пока casty init не увидит ключ в списке или нода не отвергнет сообщение Добавить этот один ключ, один раз casty key revoke, если он когда-нибудь сольётся
Пароль хранилища ключей Вводится в скрытом поле Расшифровать ключи приложений на этой машине Отозвать ключи, удалить keys.enc.json, запустить casty init
Токен casty web ~/.config/casty/web-token, режим 0600; в хранилище связанного браузера Пока работает casty web: читать ленту и писать вашим ключом приложения, откуда бы ни была доступна страница Остановить casty web, затем запустить его с --new-token
То же самое на хосте ноды (1-node.sh serve) ~/snapchain/casty/config/keys.enc.json (0600), пароль в ~/snapchain/casty/passphrase (0600, Docker-секрет), токен в ~/snapchain/casty/config/web-token; ключ расшифрован в памяти сервиса, пока он работает Читать и писать от вашего имени из любой сети, пока работает сервис; root на хосте получает ключ casty key revoke <key> с seed-фразой; docker compose stop casty на хосте; --read-only оставляет ключ дома
Пара ключей для push и подписки (casty serve) ~/snapchain/casty/config/vapid.json (0600) и cache/push.json на хосте Отправлять push, «new mention from @name», подписанным браузерам; push-сервис видит только шифротекст Удалить оба файла и перезапустить casty; выключить уведомления в браузере
Облачный токен (HCLOUD_TOKEN, учётные данные AWS) Ваше окружение; скрипты никогда его не записывают Создавать и удалять серверы в этом аккаунте Отозвать его в консоли провайдера
SSH-ключ Ваш; загружается только публичная половина Входить на хост ноды с правами root Удалить его с хоста и у провайдера

Seed-фраза управляет всем аккаунтом. Для этого руководства используйте тестовый аккаунт, вставляйте seed-фразу только в программы разработчиков, которым доверяете, и предпочитайте ключ, одобренный вашим кошельком: casty init --fid <fid>, затем casty web и в разделе о вас «add a key with your wallet».

Запрос seed-фразы читает из терминала с выключенным эхо. С --mnemonic-stdin фраза вместо этого приходит из канала, а запрос пароля по-прежнему читает терминал. casty обнуляет байты фразы после использования; строку, переданную библиотеке вывода ключей, и ключ, который она выводит, в JavaScript нельзя стереть из памяти.

CASTY_PASSPHRASE заменяет запрос пароля. Он существует для тестов и pnpm demo; не используйте его для хранилища ключей, в котором лежит настоящий ключ.

  • На арендованном хосте файрвол открывает SSH (22), HTTP API (3381) и gRPC (3383) только для --allow-ip, по умолчанию для вашего собственного адреса. Gossip (3382) открыт для всех, чтобы другие ноды могли подключаться. Хост, который у вас уже есть, не получает файрвола от casty.
  • statsd (8125/udp, 8126/tcp) и Grafana (3000) публикуются только на loopback хоста, statsd через собственные переменные compose-файла STATSD_PUBLISH в .env, Grafana через override-файл. Пароль admin для Grafana — случайный, записанный в .env; для просмотра вход не нужен, как задано в grafana.ini от Snapchain.
  • casty общается с вашей нодой через SSH-туннель на 127.0.0.1:3381. Он не вызывает хостинговый API Farcaster. Публичный реестр fname на fnames.farcaster.xyz спрашивается только об имени, которого нода не знает: @name, на которое вы подписываетесь или которое упоминаете в касте (--no-allow-fname-server выключает это), читаете через feed --fids или ищете в casty web, и об авторе каста, который вы указываете ссылкой на farcaster.xyz. RPC OP Mainnet спрашивается, только когда вы передаёте --op-rpc.
  • casty web слушает на 127.0.0.1, если --listen не называет другой адрес, и каждому запросу к API нужен его токен. В браузере и на телефоне перечисляет, как защищена страница и что меняется, когда телефон обращается к ней по локальной сети.
  • 1-node.sh serve --domain открывает страницу в интернет по HTTPS (80 и 443, открытые через 0-provision.sh --https); --tailscale — только в ваш tailnet. Тогда странице нужен её токен, она отправляет HSTS и отвечает одному адресу не больше чем на 120 запросов к API в минуту. Из любой сети перечисляет, что хранится на хосте.
  • Касты других людей могут содержать управляющие последовательности терминала. casty удаляет управляющие символы и переопределения направления текста, прежде чем их печатать, а веб-страница вставляет текст каста как текст.
  • Ключ приложения: casty key list показывает, что зарегистрировано на ваш fid. Отзовите ключ через casty key revoke <key> --self с машины, на которой он ещё есть, или seed-фразой откуда угодно.
  • Seed-фраза: перенесите fid на новый custody-адрес кошельком, которому доверяете, затем отзовите каждый ключ приложения.
  • Облачный токен: отзовите его, затем поищите в аккаунте серверы, которые вы не создавали.
  • Токен casty web: остановите casty web и запустите его снова с --new-token. Каждая ссылка, напечатанная раньше, перестаёт работать. На хосте ноды: удалите ~/snapchain/casty/config/web-token и выполните docker compose restart casty.
  • Хост ноды: отзовите ключ приложения seed-фразой, удалите ~/snapchain/casty и считайте хост скомпрометированным и для ноды тоже.

Сообщайте об уязвимостях приватно через security advisories репозитория, а не в публичном issue. В SECURITY.md репозитория та же таблица.