В web-фреймворке Ruby on Rails (http://rubyonrails.org/) выявлена уязвимость (https://groups.google.com/group/rubyonrails-security/browse_...), позволяющая удалённому злоумышленнику организовать подстановку SQL-кода. Проблема вызвана отсутствием должной проверки вложенных параметров запроса в коде Active Record. В частности, конструкция "Post.where(:id => params[:id]).all" в коде Active Record напрямую передает внешние параметры в блок WHERE SQL-запроса, что позволяет атакующему передать запрос, в результате которого params[:id] вернёт специально изменённых хэш с содержимым дополнительных условий для блока WHERE. В результате, атакующий может получить доступ на чтение к содержимому таблиц в текущей БД, например, содержащих параметры аутентификации или конфиденциальные данные.Уязвимость появляется только в Ruby on Rails 3.x, при использовании в приложениях Active Record для доступа к БД и вложенных параметров. Проблема устранена в корректирующих обновлениях Ruby on Rails 3.0.13 (http://weblog.rubyonrails.org/2012/5/31/ann-rails-3-0-13-has.../), 3.1.5 (http://weblog.rubyonrails.org/2012/5/31/ann-rails-3-1-5-has-.../) и 3.2.5 (http://weblog.rubyonrails.org/2012/5/31/ann-rails-3-2-5-has-.../) (выпуск 3.2.4 отменён из-за регрессивных изменений). Похожая проблема зафиксирована в коде разбора параметров в Rack при использовании ActionPack, но она позволяет лишь вставить в SQL-запрос условие "IS NULL".
URL: http://secunia.com/advisories/49297
Новость: http://www.opennet.me/opennews/art.shtml?num=33992
Гитхаб уже взломали?
Спроси у Хомячкова.
> Гитхаб уже взломали?Опять для того чтобы фикс вкоммитить? :)
Простите, почему ещё три года назад в документации гооврилось что так параметры не нужно передавать именно из-за вероятности подобных инъекций? Косяк в новости.
> Простите, почему ещё три года назад в документации гооврилось что так параметры
> не нужно передавать именно из-за вероятности подобных инъекций? Косяк в новости.А как их тогда передавать?
Как строку, Post.where(:id => params[:id].to_s).allЯ предлагаю открыть месяц недоуюзвимостей Rails, понятно, что поссонам влом читать доки к фреймворку, так что плавно берем курс на модернизацию фреймворка для «самых маленьких хомяковых».
> понятно, что поссонам влом читать доки к фреймворкуК сожалению, поэтому и ответственность за дефолты такая большая.
Это не рекомендуемый способ делать запросы такого вида, смотрите коммент ниже.
что-то не нашёл сейчас в мануале никаких предупреждений на этот счёт.
Если оно там действительно есть, то это же ещё хуже чем просто баг - это любовно разложенные грабли, за которые надо отрывать руки
Это просто глупый пример. Post.where(:id => params[:id]).all вполне легальная конструкция, только вот в Rails толку от нее 0, потому как эквивалентна Post.find(params[:id]). Предположим, что там не id, а dummy_user, тогда рекомендуемая нотация ActiveRecord будет такой: Post.where([ "dummy_user = ?", params[:user] ]).all.Post.where(:id => params[:id].to_s).all — конечно же костыль, только вот и нотация эта не рекомендована разработчиками, так что если лезешь не туда, не жалуйся если что-то пропустил. И да, я только за то, чтоб за такое рвали руки.
Я вот недавно портировал один проект с Rails на Node, просто не могу передать отвращения от того, как в Ноде все нестандартизировано, малого того, что сам язык невероятно многословен по сравнению с Ruby (это при том, что писал я на Coffeescript'е), так и еще шаг вправо-влево — выстрел в ногу.
>Ноде все нестандартизировано?
>невероятно многословен по сравнению с Ruby?
>это при том, что писал я на Coffeescript'е???
Да это, батенька, не в лыжах дело.
Ничего не понял. Здесь не о лыжах тема, вы ошиблись, наверное.
Пословицы и поговорки еще не проходили?
«Какой вопрос, такой и ответ». Вот эту я точно знаю.
Ruby - очень компактный язык, на меньшем количестве строк кода можно написать большее.CoffeeScript - прослойка, транслируемая в JavaScript, представляющая Ruby-подобный синтаксис. Но даже так код не выходит компактным.
Ну о стандартизации не в курсе...
JavaScript, зараза, быстрый. Им все занимаются. А Ruby такой классный! А признания мало... Денег, как следствие, и оптимизированности... Жаль. Ruby - мое все, вот уже два года... Хотя пока большие проекты не делал, и его скорость меня устраивает.
О времена, о нравы...
На кой тебе тормоза, которые тормознее даже жабаскрипта?Покури Perl. Там тебе и психоделики Moose и скорость XS.
Я вот недавно переписал голый Perl сначала на голый C - ускорился в 5 раз. Потом ввод-вывод вернул в Perl - отжал ещё 20%. Разбираться, почему while(<>){} на 20% быстрее кода на C (тупо дёргать буфера по 4М, потом через strchr наковыривать строчки), не стал - всё равно вязать через XS.
> На кой тебе тормоза, которые тормознее даже жабаскрипта?
> Покури Perl.Взаимоисключающие параграфы: js (v8, который юзается в node.js) намного быстрее перла. И модули на Си++ там подключать тоже очень просто
>> На кой тебе тормоза, которые тормознее даже жабаскрипта?
>> Покури Perl.
> Взаимоисключающие параграфы: js (v8, который юзается в node.js) намного быстрее перла.Специально бросил всё, стал проверять на своих задачах. Не быстрее, хотя и не медленнее.
Базара нет, штука быстрая и софта на github настрогали не меньше, чем на CPAN. В следующем проекте нужно посмотреть на неё повнимательнее. При этом асинхронное программирование требует какой-то другой травы.
> О времена, о нравы...
> На кой тебе тормоза, которые тормознее даже жабаскрипта?
> Покури Perl. Там тебе и психоделики Moose и скорость XS.А мне не надо быстрый. Мне надо - либо C/C++, классика; либо логичный и красивый, и, если ООП, то тотально-ООП, интерпретатор. И это - Ruby. Просто мне жаль, что в него не вкладывают так, как в JavaScript.