Обход авторизации SAML

    image

     
    Обнаружена критичная уязвимость в SAML (Security Assertion Markup Language), с помощью которой
    можно осуществить обход авторизации. Уязвимости подвержены решения различных SSO-провайдеров и несколько библиотек, использующих SAML SSO (Single Sign-On).


    Язык разметки SAML (Security Assertion Markup Language) представляет собой открытый стандарт на основе XML, который предназначен для обмена данными аутентификации и авторизации между сторонами процесса. С помощью протокола SAML пользователи могут получать доступ ко множеству своих облачных приложений, указывая всего один логин и пароль. Single Sign-On (SSO) — распространенная технология, позволяющая авторизоваться в web-приложении через "третью сторону" в виде стороннего веб-приложения.


    Именно в этой реализации кроется ошибка, позволяющая злоумышленнику разместить комментарий внутри поля имени пользователя, единственным условием является наличие валидного имени пользователя.


    Проблема кроется в методе обработки комментариев в разметке XML-кода. При размещении кода комментария в поле имени пользователя происходит "разрыв" строки. При обработке пользовательского имени препроцессор "обрубает" значение после поля комментария и не учитывает его при проверке:


    import xml.etree.ElementTree as et
    doc = "<NameID>test<!-- comment -->user</NameID>"
    data = et.fromstring(payload)
    return data.text # returns 'testuser'

    Ожидаемое значние — "testuser", но после "обрыва" вернется только значение "test".


    Пример реализации данной атаки пользователем с доступом к учетной записи user@user.com.evil.com может изменить SAML для подмены NameID на user@user.com при обработке SP:


    <SAMLResponse>
        <Issuer>https://idp.com/</Issuer>
        <Assertion ID="_id1234">
            <Subject>
                <NameID>user@user.com<!---->.evil.com</NameID>
            </Subject>
        </Assertion>
        <Signature>
            <SignedInfo>
                <CanonicalizationMethod Algorithm="xml-c14n11"/>
                <Reference URI="#_id1234"/>
            </SignedInfo>
            <SignatureValue>
                some base64 data that represents the signature of the assertion
            </SignatureValue>
        </Signature>
    </SAMLResponse>

    Данной атаке подвержены следующие решения:


    • OneLogin — python-saml — CVE-2017-11427
    • OneLogin — ruby-saml — CVE-2017-11428
    • Clever — saml2-js — CVE-2017-11429
    • OmniAuth-SAML — CVE-2017-11430
    • Shibboleth — CVE-2018-0489
    • Duo Network Gateway — CVE-2018-7340

    Стоит отметить, что атака не работает против учетных записей, защищенных с помощью двухфакторной аутентификации (которая включена у ~10% пользователей согласно статистике Google).


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

    • +32
    • 5,9k
    • 3
    Pentestit 58,13
    Информационная безопасность
    Поделиться публикацией
    Комментарии 3
    • 0
      Проверил на всякий случай SSO на основе обычного XmlDocument (.NET).
      Ложная тревога.
      • +1
        simpleSamlPhp подвержен?

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое