«ВКонтакте» рассказала о причинах и последствиях сбоя с демонстрацией администраторских инструментов пользователям

Команда «ВКонтакте» объяснила причины сбоя, в результате которого пользователи получили доступ к панели администраторских функций, а также рассказала о последствиях случившегося. Объяснение опубликовано в блоге компании на «Хабрахабре». 

В закладки

Сбой в работе «ВКонтакте» произошёл в ночь на 21 марта. Причиной стал «фатально невнимательный merge (слив — прим.ред.) ветки», в которой переделывали один из внутренних интерфейсов, объяснили в соцсети. 

«В результате любой пользователь стал считаться сотрудником. В некоторых случаях — сотрудником со всеми существующими правами», — говорится в блоге «ВКонтакте». По собственным данным компании, ежемесячная аудитория соцсети превышает 95 млн пользователей. 

В компании подчеркнули, что полного набора прав администратора никто из пользователей не получил, поскольку ни для одного из сотрудников соцсети такого комплекта не предусмотрено. 

​Мы разделяем уровни ответственности да и работать с таким интерфейсом было бы неудобно. Есть люди, которые проверяют заявки на добавление вузов, есть переводчики, есть агенты поддержки и модераторы жалоб — у каждого отдела свой набор полномочий. Доступ к правам любого уровня сотрудник получает после подписания NDA. Все без исключения действия логируются. За применение магии вне Хогвартса предусмотрен огромный штраф (и перспектива судебного разбирательства). 

— команда «ВКонтакте»

По словам представителей «ВКонтакте», у пользователей был доступ к инструментам администраторов «всего четыре минуты», после чего сайт вышел из строя из-за «такого количества новых сотрудников». 

За это время пользователи, по словам представителей соцсети, успели следующее: 

  • удалить с десяток сообществ и записей, один профиль, несколько фотографий и видеозаписей; ​
  • заблокировать одно приложение;
  • пополнить рекламный бюджет четырёх кабинетов;
  • загрузить картинку с кроликами в FAQ службы поддержки;
  • почитать мануал спам-аналитиков, после чего компания получила несколько просьб рассмотреть кандидатуру на эту должность;
  • заложить несколько новых городов в географической базе;
  • создать кучу заявок в публичном баг-трекере и проставить им статусы.

Публичный доступ к баг-трекеру по-прежнему закрыт «для наведения порядка». «Ему досталось больше остальных», — отметили во «ВКонтакте». 

В соцсети утверждают, что пользователям не удалось изучить персональные данные других людей. «Дополнительные проверки доступа к sensitive data работали, и посмотреть чужой IP-адрес или номер телефона никто не смог», — утверждают в компании.

Представители «ВКонтакте» подчеркнули, что ни у кого из администраторов соцсети нет прав, которые бы позволили в личных целях посмотреть приватную фотографию или прочитать сообщение пользователя. 

Мы предпочитаем не проверять своих сотрудников на прочность, поэтому такой возможности нет даже в теории. Кроме того, действия с правами видны всем коллегам — забанить тайком соседа-скандалиста тоже не выйдет. ​

Есть автоматика для удаления разного рода спама из любых разделов сайта, включая рассылки в личных сообщениях. Это сложная система, которую в режиме 24/7 корректируют наши аналитики. Она напоминает фильтр нецензурных выражений, который есть на любом приличном форуме, только всё гораздо мощнее и в реалтайме адаптируется под тренды спамеров.

Ещё есть отдельные жалобы самих пользователей на любой доступный им контент. Если Вы прислали другу фишинговую ссылку, а друг на неё пожаловался, модератор увидит сообщение с этой ссылкой в жалобе. И только его. Более того, невозможно предугадать, к кому из модераторов оно попадёт: жалобы распределяются рандомно среди десятка сотрудников на смене.

Примерно так же дело обстоит с приватными фотографиями — кнопка со страшным названием «Открыть приватные фото» работает только с точной ссылкой, которую предоставляет сам владелец фотографии — например, для восстановления доступа к аккаунту, на котором нет публичных снимков с его хозяином, или автор жалобы на пресловутое детское порно. Сотрудник не может открыть таким способом произвольный снимок с хоть какой-нибудь приватностью.

— команда «ВКонтакте»

После устранения ошибки сотрудники «ВКонтакте» отменили совершённые пользователями от имени администраторов действия и начали изучать логи, чтобы выяснить, была ли утечка персональных данных. 

«Мы не могли проверить это мгновенно, поэтому запустили уничтожение автоматикой всех подряд скриншотов интерфейса, чтобы сдержать возможный слив sensitive data. Как только стало достоверно известно, что утечки нет, выпиливание скриншотов остановили», — объяснили в соцсети. 

В компании добавили, что также разработали меры защиты от таких ситуаций в будущем, но их детали не раскрыли.

#новость #ВКонтакте #баг #сбой

Статьи по теме
Пользователи «ВКонтакте» на полчаса получили доступ к инструментам администрации соцсети после сбоя
{ "author_name": "Albert Khabibrakhimov", "author_type": "editor", "tags": ["\u0441\u0431\u043e\u0439","\u043d\u043e\u0432\u043e\u0441\u0442\u044c","\u043d\u043e\u0432\u043e\u0441\u0442\u0438","\u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435","\u0431\u0430\u0433"], "comments": 16, "likes": 20, "favorites": 1, "is_advertisement": false, "subsite_label": "social", "id": 22750, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15395' + '50799') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 22750, "author_id": 53259, "diff_limit": 1000, "urls": {"diff":"\/comments\/22750\/get","add":"\/comments\/22750\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/22750"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199129 }

16 комментариев 16 комм.

Популярные

По порядку

Написать комментарий...
5

"кнопка со страшным названием «Открыть приватные фото» работает только с точной ссылкой, которую предоставляет сам владелец фотографии. Сотрудник не может открыть таким способом произвольный снимок с хоть какой-нибудь приватностью."

Ответить
4

"В компании добавили, что также разработали меры защиты от таких ситуаций в будущем, но их детали не раскрыли."
У нас есть ТАКИЕ приборы! Но мы вам о них не расскажем.
Аквалангисты - это не игра!

Ответить
3

Мы белые пушистые, ну ну.

Ответить
3

что-то долго они там соображали, как же SMM и все такое?

Ответить
0

Криворуких разработчиков за такое точно увольнять нужно, тестирование нормальные программисты ведут на демо версии.
Надеюсь руководство поменяют полностью после такого.

Ответить
1

Все у них норм с тестовой версией, писали же, что был случайный мердж с публичной. Не буду говорить про криворуких сотрудников (хотя убыток вроде никакой, потому что - будет урок на аккуратность), но вот при чем тут руководители я вообще не понял

Ответить
4

Не знаю что и где писали конкретно по этой проблеме, но однажды слушал подкасты про разработку и там выступал сотрудник ВК. Он прямым текстом говорил, что все сразу льется в продакшн и особого ревью или юнит тестов нет.

Ответить
2

В booking.com делают так же. И ничего, живут, растут. И никак это не портит их репутацию.

Это вообще распространённая схема. Когда счет комиттов в сутки идёт на сотни, тестировать каждый заколебешься. Делаются самые простые юнит тесты и в прод.

На продакшене часто вылезают баги, которые проявляются в редких случаях, которые сложно отловить при тестах. Главное - вываливать частями - сначала на небольшой процент, потом больше и т.д. Если все плохо, то делается откат

Ответить
1

Все же про букинг интересно и деплой на продакшн, но есть в практике, а особенно в ролевой распределительной системы тестирование критически важного фукционала.

Ну есть такое на проектах - это когда простой автотест проверяет что юзеру X Не доступна в интерфейсе (и в http попытках) та или иная фича.

Такой тест пишется один раз после создания такой фичи. CI перед раскаткай по нему особенно громко кричит если там не так.

Что там было никто конечно не скажет, но это не фича а баг.

Ответить
–1

Обидно, что корпорации не учат основам своих специалистов, хотя это их грабли и удачи им в их профессиональном росте.

Ответить
–2

Т.е. репутация по вашему не страдает из-за багов, утечек данных и прочего :)))

Ответить
7

ты гд еи кем работаешь? эксперт по кадровым перестановкам и репутационным рискам

Ответить
0

Мне вот тоже интересно. Умник какой-то. По его словам так их чуть ли не расстрелять надо. Сам то нибусь и не представляет что такое разработка подобных проектов.
С его комента ниже вообще ору.

Ответить
2

Ху як ху як и на продакшен.

Ответить
1

Зарплату выплатили всем новым сотрудникам?

Ответить

Комментарий удален

0

Те, кто не понимает слова merge, не поймут и "слив"

Почему бы не написать "объединение"?

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Голосовой помощник выкупил
компанию-создателя
Подписаться на push-уведомления