Отказ в обслуживании и потенциальное выполнение произвольного кода в большинстве версиях Ruby

    Приветствую уважаемое Ruby сообщество.

    Странно, что этой новости еще нет на Хабре, но вчера рано утром разработчики Ruby сообщили о найденном переполнении кучи при парсинге значений с плавающей точкой. Данной уязвимости был присвоен код CVE-2013-4164. Также ребята предупреждают что эта ошибка может вызвать как минимум отказ в обслуживании, но с определенной долей вероятности в Ruby приложения можно внедрить произвольный код.

    Список уязвимых версий:
    • Все версии ruby 1.8
    • Все версии ruby 1.9 вплоть до 1.9.3 patchlevel 484
    • Все версии ruby 2.0 вплоть до 2.0.0 patchlevel 353
    • Все версии ruby 2.1 вплоть до 2.1.0 preview2
    • Все версии в trunk до ревизии 43780


    Детали уязвимости


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

    Уязвимый код может выглядеть следующим образом:
    untrusted_data.to_f
    


    Однако, уязвим любой код, который создает значения с плавающей точкой из внешних источников, например:
    JSON.parse untrusted_data
    


    Решение


    Разработчики рекомендуют обновление до ruby 1.9.3 patchlevel 484, ruby 2.0.0 patchlevel 353 либо ruby 2.1.0 preview2. Версия 1.8 является устаревшей и исправление уязвимости не планируется. Пользователям ruby 1.8 рекомендуется обновиться на более свежие версии.

    UPD: Уязвимости подвержен только Ruby MRI. Rubinius и JRuby она не затрагивает.
    • +13
    • 5,7k
    • 7
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 7
    • –1
      Эх, рубинус. из-за твоего 1.8.7 мне придется с тобой расстаться.
      • 0
        Он уже примерно месяц держит 2.0 и 2.1
        • 0
          Не торопитесь, как заявляют разработчики Heroku — Rubinius и JRuby уязвимости не подвержены.
        • +4
          • +2
            Забавно, как разные языки программирования наступают на одни и те же грабли. Году в 2011 была шумиха из-за такой же проблемы в JVM. Шуму было действительно много: мало того, что новость несколько дней висела в топе ХаккерНьюс, так про нее написали всякие издания вроде ZDNet, The Register, InfoWorld и т.п. И если б я был одним из коммитеров Ruby, Python или другого языка программирования, я бы проверил, а не подвержен ли мой рантайм этой проблеме.

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

            В любом случае, обновиться надо.
            • 0
              > подобрать правильный эксплойт, чтобы получить от дыры какой-то толк, довольно сложно.

              Иногда достаточно просто уронить, особенно если это какой-нибудь популярный сервис который всем нужен.
            • +2
              POC:
              ("1."+"1"*3000000).to_f
              

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