Безопасность
Что хранит CLI Google Календаря, где лежит вход и чем агент может поделиться.
Общее для всех CLI WireCat — хранилище ключей, разрешения, MCP и то, что никогда не попадает в журнал, — описано на
общей странице о безопасности. Здесь только то, что относится именно к gcal.
gcal хранит настройки в config.json, а состояние — в папках, которые показывает gcal doctor. Он обращается только
к Google и просит доступ на чтение к Календарю и к вашему адресу электронной почты. session start --grant write
добавляет события, а --grant sharing — управление тем, кто видит календарь; больше ничего.
Агент, подключённый через gcal <profile> mcp serve, может менять, кто видит ваш календарь, не спрашивая вас. После
--grant sharing он может открыть календарь любому адресу, сделать его общедоступным или убрать кого-то из доступа.
Он может вызвать и метод, который передаёт календарь другому аккаунту; этот метод работает только для администратора
Google Workspace и только если у входа есть разрешение, которое gcal не запрашивает. Через MCP некому ответить на
вопрос, поэтому ask разрешает эти действия. Агент не может заставить Google отправить письмо человеку, которому он
открыл доступ: для этого нужен sharing.notify, а он в deny. Но открыть доступ молча, с
--send-notifications false, агент всё равно может. Чтобы управление доступом оставалось за вами, выполните
gcal personal config set permissions.api.calendar.acl deny или войдите без --grant sharing. Очистка календаря
агенту никогда не предлагается.
Вход Google хранится в системном хранилище ключей под службой gcal-cli, по одной записи на профиль. В этой же записи
лежат ID и секрет вашего клиента OAuth, поэтому для обновления входа файл клиента больше не нужен. Google считает, что
секрет клиента Desktop app не конфиденциален, но gcal всё равно никогда его не выводит. Ни одна команда, ошибка,
журнал или запись запуска не показывает токен или секрет клиента; адрес страницы входа не содержит ни того, ни другого.
session end удаляет запись.
С session start --credential-storage file та же запись попадает в credentials.json в папке состояния gcal, с
правами 600: любой, кто может читать ваши файлы от вашего имени, может прочитать и вход. Используйте этот вариант,
только если хранилище ключей не работает.
gcal не принимает файл клиента OAuth, который могут читать другие пользователи компьютера. Адрес электронной почты
аккаунта сохраняется в папке состояния gcal, доступной для чтения только вам, чтобы session status мог ответить без
сети.
Запись запуска хранит командную строку в том виде, как вы её ввели, поэтому gcal runs show показывает, что было
запущено. Секрет при этом сохраняется как [redacted]: параметр с именем вроде token или password, пароль в ссылке,
длинная непрозрачная строка. Номер телефона заменяется на [redacted] внутри введённого слова, включая текст
сообщения: номер, записанный с «+» и кодом страны, или от 11 до 15 цифр подряд, так что длинный ID такой длины тоже
скрывается. Чтобы не хранить ни одного введённого слова, выполните gcal personal config set record_input false.
Секрет распознаётся и по внешнему виду — в записи запуска и в сохранённом сообщении об ошибке: токен известного
формата (GitHub, OpenAI, Slack, AWS, Stripe, npm и подобные), учётные данные Bearer, случайная на вид строка из 20 и
более символов и случайная на вид последовательность из 20 и более шестнадцатеричных символов в нижнем регистре,
например шестнадцатеричный ключ или полный хеш коммита. Значение после имени секрета тоже скрывается, будь то после
=, : или пробела: password=, API_TOKEN=, password hunter2, pin 1234. Некоторые секреты похожи на обычные
слова и остаются: значение из одних букв после имени секрета и пробела (pin this message остаётся),
шестнадцатеричный ключ в верхнем регистре, короткий хеш коммита или UUID, короткий пароль, введённый без имени
секрета перед ним, и секрет внутри ссылки или пути к файлу, если он не известного формата и не стоит после имени
секрета.
config.json сохраняется доступным для чтения только вам (0600), а его папка создаётся только для вас (0700).
Файл или папка, созданные старой версией, могут быть открыты другим пользователям компьютера: gcal doctor выводит
каждый такой путь в files.problems и печатает chmod, который это исправляет. В Windows это не проверяется. Об
уязвимости сообщайте так, как описано в SECURITY.md.