Всем привет!

Google Таблицы сегодня — один из самых популярных инструментов для совместной работы и хранения данных. Думаю, большинство из нас хотя бы раз пользовались этой удобной и на первый взгляд простой платформой.

Однажды, работая с очередной таблицей, я заметил, что в документе есть скрытые листы. Если вы когда-нибудь сталкивались с таким, то наверняка понимали моё любопытство: а что же там спрятано? Именно это наблюдение плавно переросло в небольшое исследование, которое неожиданно выявило уязвимость в Google Таблицах.

В этой статье расскажу о вполне настоящей, на мой взгляд, уязвимости в Google Sheets и о моём неудачном опыте попытки отдать её на рассмотрение в Google Bug Bounty.


Введение

При работе с таблицами часто возникает вопрос: а действительно ли все данные, содержащиеся в документе, должны быть доступны каждому пользователю? Например, на одном листе могут находиться бухгалтерские вычисления с секретной информацией для компании, а на другом — небольшой отчёт или красивая диаграмма, которую вы хотите показать обществу.

Для решения этой задачи существует функция «Скрыть лист» — она позволяет скрыть лист, чтобы не удалять данные и не делиться ими со всеми подряд.

При скрытии листа Google Таблицы показывают уведомление, что управлять скрытым листом могут все редакторы таблицы.

Уведомление о скрытии листа
Уведомление о скрытии листа

Если же открыть таблицу с учётной записью, имеющей только права на чтение, мы не увидим содержимого скрытого листа — увидим лишь его название в списке листов:

Вид скрытого листа среди других
Вид скрытого листа среди других

Начало расследования

Итак, представим ситуацию: нам дан доступ к Google Таблице с несколькими листами (например, «Биография» и «Мой пароль»). Лист «Мой пароль» скрыт, но мы видим его название, а значит — подозреваем, что там спрятана важная информация.

Обнаружение скрытого листа
Обнаружение скрытого листа

Для наглядности, будучи редактором, я открыл скрытую таблицу и увидел данные:

Информация в скрытой таблице
Информация в скрытой таблице

Отлично! Теперь создадим ссылку для доступа только для чтения и попробуем открыть документ с другим аккаунтом.

При открытии под такой учётной записью скрытый лист виден, но содержимое открыть нельзя:

Скрытый лист с правами только на чтение
Скрытый лист с правами только на чтение

Уязвимость через функцию IMPORTRANGE

Знакомьтесь с функцией Google Sheets — IMPORTRANGE, которая позволяет импортировать данные из другой таблицы.

Пример формулы:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/<document-id>", "My password!A1:Z10")

Аргументы:

  • Ссылка на документ

  • Имя листа с указанием диапазона ячеек, которые нужно импортировать

Что же, давайте попробуем импортировать скрытый лист...

И о чудо! Данные удалось получить:

Получили данные скрытого листа
Получили данные скрытого листа

Влияние уязвимости

Эта уязвимость позволяет несанкционированно раскрывать данные, содержащиеся в скрытых листах. Любой пользователь с правом «Только просмотр» к документу может извлечь полное содержимое скрытых вкладок, указав их в своей новой таблице через IMPORTRANGE.


Сценарий атаки

  • Злоумышленник получает доступ «Только просмотр» к общему Google Sheets файлу.

  • Он видит названия скрытых листов, так как они отображаются в интерфейсе.

  • В своей таблице создаёт формулу IMPORTRANGE, подставляя адрес документа и название скрытого листа.

  • Получает доступ ко всем данным скрытой таблицы — без необходимости редактирования или комментирования.

Это значит, что любой, кто получил доступ к документу, может прочитать скрытые данные, несмотря на намерение владельца сохранить их конфиденциальность.


Google Bug Bounty

Пишем отчёт

Я написал подробный отчёт и получил ответ:

Status: Won't Fix (Infeasible)
Hi!
Hidden cells and protected cells in Google Sheets are not a security feature. Rather, they are meant to explicitly indicate to users that the cells should not be edited / accessed (meaning that if someone manages to do so, it's difficult for them to claim they didn't intend to bypass the setting). This is documented here.

В документации же говорится:

Hiding a sheet is not the same as protecting a sheet. All spreadsheet editors can unhide and view these sheets. Spreadsheet viewers can’t see hidden sheets.

Я попытался ещё раз указать, что без прав на редактирование скрытые листы всё равно могут просматриваться:

The documentation states: "Hiding a sheet is not the same as protecting a sheet. All spreadsheet editors can unhide and view these sheets. Spreadsheet viewers can’t see hidden sheets." However, in practice, users without editing rights are still able to view the contents of hidden sheets.

Но получил тот же самый ответ:

Hello,
Thanks for following up. Just to reiterate: hidden cells in Google Sheets are not a security feature.

Да, это разочаровывает — у Google такая позиция, что для крупной компании проблема слишком «незначительная».


P.S.

Спустя два дня, изучив ссылку на документацию заново, заметил появление новой строки:

Spreadsheet viewers can’t see hidden sheets. If someone makes a copy of the spreadsheet, the sheets will stay hidden, but they’ll be able to unhide the sheets.


Итоги

  • Надежда получить крутой баг в портфолио и вознаграждение провалилась.

  • Google проблему не исправляет, а лишь добавило пару строк в справочный центр.

  • Главная проблема здесь — многие пользователи воспринимают скрытие листов как полноценную защиту данных, чего на самом деле нет.