The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

В Bugzilla устранена опасная уязвимость, открывшая новый вид атак на web-приложения

07.10.2014 13:25

В выпусках 4.0.14, 4.2.10, 4.4.5 и 4.5.5 системы для ведения базы данных ошибок, контроля за их исправлением и общего координирования процесса разработки Bugzilla устранена опасная уязвимость (CVE-2014-1572), позволяющая поднять свои привилегии и получить доступ к закрытым группам. Теоретически аналогичные ошибки могут присутствовать и в других проектах на языке Perl, использующих модуль CGI.pm и заполняющих хэши неэкранированными значениями функции param.

Проблема вызвана непониманием особенности разбора повторяющихся параметров в URL - в случае передачи скрипту нескольких параметров с одинаковым именем, функция param модуля CGI.pm возвращает не скалярную переменную, а массив, в котором перечислены все значения подобных параметров. При заполнении хэша открытым списком по сути производится перечисление пар ключ/значение (символ "=>" в присвоении вполне может быть заменён на запятую), поэтому если вместо одного из аргументов передан массив и этот аргумент не экранирован, то можно перечислить в данном массиве имена ключей и их значение, и данные ключи будут определены в хэше.

Например, в случае запроса "index.cgi?realname=JRandomUser&realname=login_name&realname=admin@mozilla.com", переменная realname передаётся три раза, что приведёт к выдаче функцией param массива ("JRandomUser", "login_name", "[email protected]"). Если в коде присутствует присвоение "realname => $cgi->param('realname')", то по сути этот блок можно отождествить с конструкцией ("realname", "JRandomUser", "login_name", "[email protected]"), что аналогично представлению (realname => "JRandomUser", login_name => "[email protected]"), т.е. осуществлено определение нового ключа "login_name". Простейшим способом устранения проблемы является явное определение скалярного типа переменной, т.е. указание "realname => scalar $cgi->param('realname')".

Используя данный метод выявившие уязвимость исследователи безопасности смогли завести аккаунты с доступом к закрытым областям Bugzilla проекта Mozilla, обойдя стадию верификации почтового адреса. Уязвимость использовалась для передачи фиктивного email в момент определения группы пользователя - bugzilla автоматически назначает новых пользователей в группы, на основании проверки email (например, можно вместо реального адреса, заполнить поле значением в поддомене @mozilla.com, при том, что изначально для верификации использовался совершенно другой адрес).

Вектором атаки может быть получение доступа к записям, в которых отвечающие за безопасность команды разработчиков могут обсуждать ещё не исправленные уязвимости, до их придания огласке. Bugzilla достаточно широко используется для координации внесения исправлений в открытых проектах, например, применяется сообществами Apache, LibreOffice, Mozilla, ядра Linux, OpenSSH, Eclipse, KDE, GNOME. Проблеме подвержены все установки Bugzilla начиная с версии 2.23.3, выпущенной в 2006 году.

Выявившие уязвимость исследователи указывают на то, что проблема не ограничивается Bugzilla и возможно присутствует в некоторых других web-проектах. Сама уязвимость рассматривается как новый класс атак на неаккуратно написанные web-приложения, сопоставимый по степени опасности с внедрением SQL-кода. При этом проблема не ограничивается Perl и может проявляться и в других языках с динамической типизацией.

  1. Главная ссылка к новости (http://krebsonsecurity.com/201...)
  2. OpenNews: Проект Mozilla объявил о возможной утечке 97 тысяч аккаунтов тестового сервера Bugzilla
  3. OpenNews: Релиз свободной системы отслеживания ошибок Bugzilla 4.0
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/40766-bugzilla
Ключевые слова: bugzilla
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (22) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Гость (??), 13:50, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    :-D красиво!
     
  • 1.2, онаним (?), 14:25, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    fail. Удивительно, как можно делать столь сильные предположения о типе переменной в динамическом яп, особенно таком как перловка.
     
     
  • 2.17, bOOster (?), 15:34, 11/10/2014 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Как можно вообще использовать в web языки с динамической типизацией?!? (что есть уже потенциальная проблема)
     
     
  • 3.19, vitalif (ok), 20:12, 13/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    > Как можно вообще использовать в web языки с динамической типизацией?!? (что есть
    > уже потенциальная проблема)

    А ты чо, часто на сях сайтики пишешь? :D

     
     
  • 4.20, Аноним (-), 11:49, 14/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Так теперь основной объем дыр - в вебне и прочей скриптятине...
     

  • 1.3, Аноним (-), 15:13, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    http://bloodhound.apache.org/

     
     
  • 2.12, vitalif (ok), 18:57, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    > http://bloodhound.apache.org/

    https://bh-demo2.apache.org/

    Proxy Error

    The proxy server received an invalid response from an upstream server.
    The proxy server could not handle the request GET /.

    Reason: Error reading from remote server

    Apache/2.2.22 (Ubuntu) Server at bh-demo2.apache.org Port 443

     
     
  • 3.21, Аноним (-), 11:50, 14/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    > Apache/2.2.22 (Ubuntu) Server at bh-demo2.apache.org Port 443

    Единственное чего полезного отсюда можно узнать - что про забивон апачистов на бзды не врут. Опач под убунтой, однако :).

     

  • 1.4, Аноним (-), 16:23, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    >CGI.pm
    >2014
     
     
  • 2.14, анонимес (?), 19:52, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +1 +/
    знакомые буквы увидел?
     

  • 1.5, vitalif (ok), 16:24, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я всегда охреневал от людей, которые вообще CGI.pm используют. Его достаточно один раз открыть, чтобы понять, что его писал героиновый наркоман. Эталонный кусок перл-говнокода.

    И Bugzilla сама тоже хороша, я её форк пилю уже лет 5, планомерно говнокод (и CGI.pm тоже, ага) оттуда выкашивая. Хочу допилить и потом опубликовать где-нибудь с намёком на то, что "эй смотрите мазильщики, я тут ваш говнокод немного в чувство привёл"...

     
     
  • 2.15, Тупой молодец (ok), 09:25, 09/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    а им патчи отослать, не?
     
     
  • 3.18, vitalif (ok), 20:10, 13/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Бессмысленно, там столько переделано, что живого места нет. Даже если умудриться это как-то разбить на патчи (что просто АБСОЛЮТНО НЕРЕАЛЬНО), авторы изменения всё равно не примут.

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

    Даже смержить с 4.4 почти нереально (моя форкнута от 3.6). Хотя и невелика беда, там всё равно никаких масштабных фич не появилось.

    Я раньше ещё стеснялся и как-то ограничивал себя, чтобы совсем ВСЁ не перехреначивать - думал мержить же потом... а сейчас надоело и я просто переделываю ВСЁ, что мне отсвечивает.

    Хочу уже доделать и как форк зарелизить.

     
  • 2.22, Аноним (-), 11:51, 14/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    > Я всегда охреневал от людей, которые вообще CGI.pm используют.

    Да весь CGI - протокол для тех кто хочет по мелочи сэкономить сначала и много и героически долбаться потом.

     

  • 1.6, PavelR (??), 16:49, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я правильно понял, что надо написать примерно так:

    %hash = (key=>$cgi->param('key'));

    ??

     
     
  • 2.7, vitalif (ok), 16:59, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Так НЕ надо писать... Надо писать %hash = (key => scalar $cgi->param('key'));

    Иначе если передать несколько значений key, то у тебя весь хеш "поедет" - контекст списочный, cgi->param вернёт список всех значений, и часть из них станет ключами, т.к. "=>" - синоним запятой.

    А ещё лучше ВООБЩЕ НЕ ЮЗАТЬ $cgi->param - даже если используется CGI.pm, то просто стырить себе куда-нибудь все параметры в виде хеша и хавать их оттуда. Причём $cgi->Vars возвращает криво tie'енный хеш, так что нужно просто в цикле вытаскивать все параметры.

    Ну или вообще юзать какой-нибудь PCGI.pm.

     
     
  • 3.8, PavelR (??), 17:03, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Эмм, я как раз и имел ввиду, что так писать не надо, и если так написать - то именно так и схватишь уязвимость. 0)

    В чем кривизна $cgi->Vars(), если это можно в двух словах описать?

     
     
  • 4.9, vitalif (ok), 17:09, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Если у какого-то ключа несколько значений, то в $cgi->Vars значением этого ключа будут просто сконкатенированные все эти значения. Т.е. из строчки &a=1&a=1 получится { a => '11' }.
     
     
  • 5.10, PavelR (??), 17:44, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/

    ух-ты, прикольно. Спасибо за разъяснение.)
     
  • 3.13, vitalif (ok), 19:50, 07/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    А, кстати нет, с PCGI та же хрень - он вообще не умеет хеш значений вернуть...
     

  • 1.11, Аноним (-), 18:20, 07/10/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    сам повысил свои привилегии, потом сам же и пофиксил с новыми привилегиями :)
     
     
  • 2.16, Аноним. (?), 19:22, 10/10/2014 [^] [^^] [^^^] [ответить]  
  • +/
    Зря смеетесь. На практике был случай убираения проблемного демео скрипта bash как cgi через уязвимость shellshock
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру