LINUX.ORG.RU

Обнаружена критическая уязвимость в Ruby on Rails

 , ,


0

2

В популярном фреймворке для создания веб-приложений Ruby on Rails обнаружена критическая уязвимость. Проблема выявлена в коде, обрабатывающем параметры HTTP-запроса. Из-за непродуманного автоматического приведения типов в обработчике формата XML у злоумышленника есть возможность обойти систему авторизации, выполнить внедрение SQL-кода, выполнить произвольный код и совершить DoS-атаку приложения.

Уязвимость устранена в следующих версиях: 3.2.11, 3.1.10, 3.0.19, 2.3.15. Во всех остальных версиях уязвимость присутствует, и всем пользователям рекомендовано обновиться. Также в сообщении об уязвимости указано несколько способов отключить проблемный обработчик.

Напоминаем, что совсем недавно (3-го января) в RoR была обнаружена другая критическая уязвимость, позволяющая выполнить внедрение SQL-кода.

Подробный анализ уязвимости

>>> Сообщение об обнаружении уязвимости (CVE-2013-0156)

★★★★★

Проверено: maxcom ()
Последнее исправление: tazhate (всего исправлений: 5)

неделя обнаружения багов. Праздники закончились...

rha
()
Ответ на: комментарий от Binary
from othermodule import SomeMixin

class MyClass(SomeMixin):
   def my_method(self):
       pass

Вот товарищ написал, который как раз сруливает с питона)

На руби это, кстати, выглядит нормально

require 'some_mixin'

class MyClass
  include SomeMixin
end

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от Binary
from othermodule import SomeMixin

class MyClass(SomeMixin):
  pass

Типа так можно сделать. ок-ок, перечислять не обязательно.

special-k ★★★
()
Ответ на: комментарий от Binary

Но учитывая, что на руби я могу легко сделать целый механизм расширения класса (что, как раз, используется в таких красивых проектах как DataMapper, ActiveRecord и мн.др.), который работает так, как мне нужно, это ваше множественное наследование такая ерунда.

Не надо мне это впаривать. Это хуже.

И сидеть с видом, что где-то в доке, прописаны все тайны вселенной, а я до них, видишь ли, не добрался.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от special-k

Но учитывая, что на руби я могу легко сделать целый механизм расширения класса (что, как раз, используется в таких красивых проектах как DataMapper, ActiveRecord и мн.др.), который работает так, как мне нужно, это ваше множественное наследование такая ерунда.

Я вообще понятия не имею, как там в руби, я его не знаю. Но я и не пытаюсь объяснить, что он чем-то хуже, я всего лишь указываю на откровенный бред относительно пайтона, ни больше, ни меньше. Поэтому потрудись объяснить подробнее, что за «целый механизм», пожалуйста. :)

Не надо мне это впаривать. Это хуже.

А нас рать. Повторюсь, я понятия не имею, что там в руби.

И сидеть с видом, что где-то в доке, прописаны все тайны вселенной, а я до них, видишь ли, не добрался.

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

Binary ★★★★★
()
Ответ на: комментарий от Binary

на откровенный бред относительно пайтона, ни больше, ни меньше

Нет-нет, я всего лишь сделал (немного) неправильный вывод на основе сообщения (примера) другого участника топика, а ты, в своем снобизме отправляешь меня читать не что-то конкретное, а что-то там вообще. Вместо того чтобы поправить (привести 3 строчки кода (неужели ты считаешь это каким-то тайным, доступным не всем знанием, вопрос: ты препод?) ).

Поэтому потрудись объяснить подробнее

Интересно.. ты что-то не трудишься ничего объяснять. Но это скорее всего из-за того что боишься облажаться, потому что не имеешь четкого представления о том как использовать свой питон, не знаешь сильных сторон, не можешь вызвать wow-эффект. Слабак одним словом.

Так что ладно, смотри

В active_record http://guides.rubyonrails.org/association_basics.html делается подгрузка всего функционала сразу через наследование базового класса, а в дальнейшем проводится тюнинг класса при помощи специальных методов таких как has_many, belongs_to, validates и др.

В DataMapper http://datamapper.org/getting-started.html вместо наследования используется инклуд модуля

include DataMapper::Resource
DataMapper имеет более модульую структуру чем ActiveRecord, при этом подключая дополнительный модуль способ расширения исходного класса не меняется, все тот же инклуд. https://github.com/datamapper/dm-serializer

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

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 4)
Ответ на: комментарий от special-k

Нет-нет, я всего лишь сделал (немного) неправильный вывод на основе сообщения (примера) другого участника топика, а ты, в своем снобизме отправляешь меня читать не что-то конкретное, а что-то там вообще. Вместо того чтобы поправить (привести 3 строчки кода).

Вообще-то, я отправлял читать конкретно описание модели данных :)

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

А что мне объяснять то? Ты уже который раз делаешь ложные утверждения, моё дело только и сказать, что они ложные, я считаю. Если же ты хочешь узнать, можно ли в питоне так же, я должен знать, как именно. При этом учить руби мне как-то смысла нет.

В active_record делается подгрузка всего функционала сразу через наследование базового класса, а в дальнейшем проводится тюнинг класса при помощи специальных методов таких как has_many, belongs_to, validates и др.

Судя по доке, это обычные ForeignKey'сы между моделями, что без проблем описывается схожим образом, что в django, что в sqlalchemy. Если я что-то не так понял, поправь, но только я вообще не понял, причём тут модель данных самого ЯП.

Binary ★★★★★
()
Ответ на: Учите матчасть! от Bioreactor

Уверен что даже с учётом того что потеряет Bohem GC прожорливейшая Java машина засрёт память быстрее. Я понятия не имею куда она девает память но это какая то прорва бездонная.

tyler19
()
Ответ на: комментарий от Binary

Вообще-то, я отправлял читать конкретно описание модели данных :)

Где там объяснено, в чем смысл

class MyClass(SomeMixin):
   def my_method(self): #вот этих вот
       pass             #строк

описывается схожим образом

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

-_- ну кого вы обманываете..

class Categorization
  include DataMapper::Resource

  property :id,         Serial
  property :created_at, DateTime

  belongs_to :category
  belongs_to :post
end
>>> from sqlalchemy import ForeignKey
>>> from sqlalchemy.orm import relationship, backref

>>> class Address(Base):
...     __tablename__ = 'addresses'
...     id = Column(Integer, primary_key=True)
...     email_address = Column(String, nullable=False)
...     user_id = Column(Integer, ForeignKey('users.id'))
...
...     user = relationship("User", backref=backref('addresses', order_by=id))
...
...     def __init__(self, email_address):
...         self.email_address = email_address
...
...     def __repr__(self):
...         return "<Address('%s')>" % self.email_address
как этим вообще можно пользоваться.. думаете, что в аду зачтется?)

это обычные ForeignKey'сы

Я ценю твою наблюдательность, но речь совсем не об этом.

special-k ★★★
()
Ответ на: комментарий от Bioreactor

Джава жива ещё? А я то думал этот мостр уже сдох. Ну и 65 конечно мало для джава-кодера - ему ведь надо покупать терабайты памяти что бы не замечать убогость своего любимого монстра.

tyler19
()
Ответ на: комментарий от special-k

Если ты выкинешь из головы свои тупые предрассудки по поводу возможности определения класса в любом месте, и начнешь нормально им пользоваться, то очень быстро поймешь, что руби лучше. Никто не размазывает код как попало. Все стараются сделать код как можно лучше читаемым.

Подтверждаю! Даже когда только познакомился с руби зная только основы заглядывал в стандартные библиотеки. Код был понятен почти на 100%. Руби самый легко читаемый язык который я знаю. Можно его обвинять в каких угодно грехах но вот это его неоспоримое достоинство. Хотя Python'исты и кричат на каждом углу что их язык легко читаемый им очень далеко до руби в этом плане. Код на Python выглядит убого по сравнению с руби.

tyler19
()
Ответ на: комментарий от special-k

Где там объяснено, в чем смысл

В документации прекрасно объяснено, что этот метод переопределится, а все остальные наследуются от SomeMixin, я тебя уверяю. Т.е. здесь есть метод конкретно этого класса, а все остальные придут из миксина, что тут может быть не понятного?

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

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

Ты передёргиваешь. Я не знаю, но я посмотрел твои ссылки.

class Categorization
  include DataMapper::Resource

  property :id,         Serial
  property :created_at, DateTime

  belongs_to :category
  belongs_to :post
end

Вот аналог на django:

class Categorization(models.Model):
  created_at = models.DateTimeField()
  category = models.OneToOneField(Category)
  post = models.OneToOneField(Post)

Ну и в чём принципиальная разница? По поводу алхимии, суть та же, весь вопрос в привычке, я вот тоже больше привык к джанго орм, но понимаю, что алхимия может делать и больше, и эффективнее, и если будет надо, без проблем буду использовать, это вот как раз и есть синдром утёнка.

Я ценю твою наблюдательность, но речь совсем не об этом.

Я ценю твою язвительность, но она тут не поможет, так что можешь объяснить, о чём же речь.

Binary ★★★★★
()

Господа. Есть redmine машина на базе bitnami со следующими параметрами.

Environment:
  Redmine version                          2.0.3.stable
  Ruby version                             1.8.7 (x86_64-linux)
  Rails version                            3.2.6
  Environment                              production
  Database adapter                         MySQL
Redmine plugins:
  no plugin installed

Не подскажите как корректно обновить рельсы ?

anonymous
()
Ответ на: комментарий от Binary

что тут может быть не понятного?

Теперь я понял, pass - это ничего, заглушка.

Вот аналог на django:

Ахах, а это?)

class Essay < ActiveRecord::Base
  validates :content, :length => {
    minimum:   300,
    maximum:   400,
    tokenizer: ->srt{ str.scan(/\w+/) },
    too_short: "must have at least %{count} words",
    too_long:  "must have at most %{count} words"
  }
end
или это..
class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end
 
class GoodnessValidator < ActiveModel::Validator
  def validate(record)
    if record.first_name == "Evil"
      record.errors[:base] << "This person is evil"
    end
  end
end
А такое можно посмотреть?)
User.column_names #[id, name ...]
И надо отметить, что active_record сам определяет структуру таблицы, как такое сделать в питоне?

Неужели не видно, что парадигма питона уже трещит по швам, лишь напоминая аналоги из руби.

о чём же речь

о способах создания программного интерфейса конечно же.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от special-k

Неужели не видно, что парадигма питона уже трещит по швам, лишь напоминая аналоги из руби

Вообще не видно, ты сравниваешь вообще одни и те же подходы, только по-разному реализованные и думаешь, что кто-то будет от них писать кипятком? Увы.

Да, всё это можно сделать в django сходным способом. Но ты ведь продолжишь показывать своё незнание, да?

Binary ★★★★★
()
Ответ на: комментарий от Binary

Да, всё это можно сделать в django сходным способом.

Был бы благодарен, если бы вы привели аналоги. Действительно интересно взглянуть.

Anatolik ★★
()
Ответ на: комментарий от special-k

По сути что-то будет или так и будешь идти за мамой-уткой?

Binary ★★★★★
()
Ответ на: комментарий от Anatolik

Был бы благодарен, если бы вы привели аналоги. Действительно интересно взглянуть.

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

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

Binary ★★★★★
()
Ответ на: комментарий от Binary

По сути что-то будет

Ага.. что-то будет, и кто-то даже скажет, что оно не так уж плохо)

Чем больше я ковыряю питон, тем больше вижу его именно синтаксическую беспомощность. Ну покажи «фичи», посмотрим, раз уж назвался.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

Какая, блин, беспомощность? Ты про язык вообще ничего не знаешь и сказать не можешь, аналитик.

Binary ★★★★★
()
Ответ на: комментарий от special-k

Это кстати частое мнение рубистов, особенно сваливших с питона. Недавний анон, который утверждает, что использует и питон и руби на самом деле не до конца принимает парадигму руби.

special-k ★★★
()
Ответ на: комментарий от special-k

И где «фичи языка»?

Вот именно, где они? Ты всё говоришь, питон плохой, но при этом не привёл ничего, где он реально хуже.

Binary ★★★★★
()
Ответ на: комментарий от Binary

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

Честно говоря, времени на чтение джанго-тьюториала нет. Понимаю, что ровно так же у вас может не быть времени на то, чтобы набросать аналоги. Это вполне нормально.

Но если причина заключается именно в том, что вы боитесь не учесть какие-нибудь рельсовые нюансы, то не стоит. Потому что я сперва постараюсь выяснить, что делает ваш код, а потом, если он в полной мере не соответствует примерам special-k, укажу на это и разъясню, в чем отличие.

Вообще, я ожидал сравнение фич языка...

Мне тоже интересна эта тема. Но я знаком с Python'ом также глубоко как вы, по вашим словам, знакомы с Ruby. Поэтому сравнение у нас может пойти туговато.

Например, вот здесь tailgunner пытался разъяснить мне некоторые вещи, но я таки мало что понял.

Что мне интересно до сих пор — где в Python находятся глобальные функции? Часто ли вы их используете? Не помешало бы несколько примеров их уместного использования из какого-нибудь проекта с открытыми исходниками.

Anatolik ★★
()
Ответ на: комментарий от special-k

Какая, блин, беспомощность

ну.. как бы, класс в руби знает, что он класс

class A
  p self #A
end
а объект знает, что он объект (безо всяких параметров)
class A
  def a
    p self
  end
end
A.new.a #<A:0x0000000108b2f8>
и не все что я напишу в классе лезет наружу
class A
  @a = 1
  def self.get_a
    @a
  end
end
A.a #NoMethodError: undefined method `a' for A:Class
A.get_a #1

методы объекта могут менять состояние объекта, а методы класса могут менять состояния класса, потому тюнинг класса выглядит так симпатично в руби и так уродливо в питоне (жалкая имитация (именно имитация), тупо присваивание значений свойствам класса, т.к. больше ничего сделать нельзя, даже в js ситуация гораздо лучше).

Вот тебе для начала слабачок (очень элементарные вещи).

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от Binary

ужас ужас

положите на место яваскрипт и не трогайте его, пока не прочитаете вот это - http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#prototype...

потом плавно двигайтесь в сторону http://eloquentjavascript.net/contents.html

а потом по порядку все вот это - https://developer.mozilla.org/en-US/learn/javascript

В яваскрипт много дефектов от дизайна, но прототип к ним не относится.

Hate
()
Ответ на: ужас ужас от Hate

но прототип к ним не относится.

Да, и поэтому каждый фреймворк тянет свою собственную реализацию классов поверх прототипов. Проходили уже.

Binary ★★★★★
()
Ответ на: комментарий от Binary

слушайте, вы ко мне пришли со своим питоном, а не я к вам с руби. Что вы так нервничаете все.. Я и обижать-то никого не хотел..

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

Афигенный ты рельсовик...

bundle update rails
не нужно удалять Gemfile.lock...

anonymous
()
Ответ на: комментарий от Anatolik

Но если причина заключается именно в том, что вы боитесь не учесть какие-нибудь рельсовые нюансы, то не стоит. Потому что я сперва постараюсь выяснить, что делает ваш код, а потом, если он в полной мере не соответствует примерам special-k, укажу на это и разъясню, в чем отличие.

Может быть как-нибудь в течение недели, сейчас нет времени. Но подход хороший.

Мне тоже интересна эта тема. Но я знаком с Python'ом также глубоко как вы, по вашим словам, знакомы с Ruby. Поэтому сравнение у нас может пойти туговато.

Ну тут всё просто: говорите, чего вам сильно нравится в руби, я привожу ближайший аналог на python. special-k было начал попытаться, но его стиль беседы меня достал, потому он пошёл в игнор.

Что мне интересно до сих пор — где в Python находятся глобальные функции? Часто ли вы их используете? Не помешало бы несколько примеров их уместного использования из какого-нибудь проекта с открытыми исходниками.

Что мы называем глобальными? На уровне модуля могут быть глобальные переменные, но их почти не используют.

Binary ★★★★★
()
Ответ на: комментарий от special-k

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

Binary ★★★★★
()
Ответ на: комментарий от special-k

ага, вот классный аналог валидации

Это не валидация, а параметры столбца в БД. Валидация - здесь

Но ты все равно скажешь что-то типа «это дерьмо, потому что в руби и рейлсе иначе». Этот аргумент ничем не перебить.

provaton ★★★★★
() автор топика
Ответ на: комментарий от Anatolik

у вас может не быть времени на то, чтобы набросать аналоги.

Время можно найти всегда, просто ответы рубистов в стиле «все, что сделано не так как в руби - это полное дерьмо» отбивают любую охоту с ними общаться.

provaton ★★★★★
() автор топика
Ответ на: комментарий от provaton

Это не валидация, а параметры столбца в БД

Ну как бы по этим параметрам может происходить и валидация, так что верны оба утверждения.

Binary ★★★★★
()
Ответ на: комментарий от special-k

Что показательно, ты не ответил ни на один из конкретных вопросов про руби, который тебе здесь задали. Ни Binary, который спрашивал тебя про редмайн, ни я с вопросом о поиске кода метода (аноним ответил здесь), ответа не получили. Видать, ты осилил пока только несколько адвокатских статеек, и лезешь теперь всем проповедовать :) В общем, присоединяюсь к этому оратору.

provaton ★★★★★
() автор топика
Последнее исправление: provaton (всего исправлений: 1)
Ответ на: комментарий от special-k

только я все подкрепляю доводами

Ага, не имея ни элеметарных понятий о синтаксисе питона, ни представления о возможностях его библиотек. Они не идеальны, но чтоб их уметь критиковать, надо хотя бы их понимать. Ты же не понимаешь даже самого элементарного, в том числе и про руби, кстати. Адьйос.

provaton ★★★★★
() автор топика
Ответ на: комментарий от Binary

Что мы называем глобальными? На уровне модуля могут быть глобальные переменные, но их почти не используют.

Видимо, это функции, которые определены вне классов или модулей. Встречал как-то упоминание, что глобальные функции в Python подобны методам верхнего уровня в Ruby. Однако сейчас погуглил и обнаружил, что на самом деле такое словосочетание в Python использовать не принято.

Anatolik ★★
()
Ответ на: комментарий от provaton

Время можно найти всегда, просто ответы рубистов в стиле «все, что сделано не так как в руби - это полное дерьмо» отбивают любую охоту с ними общаться.

Подобный неадекват приходится часто видеть и от питонистов(причем, в тредах о Ruby). Это отнюдь не повод делать индуктивное умозаключение. Особенно при наличии частных случаев с другим поведением.

Anatolik ★★
()
Ответ на: комментарий от Anatolik

Видимо, это функции, которые определены вне классов или модулей

Ну они в питоне называются просто «функции». Функции, определенные внутри классов, соответственно - методы.

provaton ★★★★★
() автор топика
Ответ на: комментарий от provaton

Как определить функцию вне модуля? Внутри другой функции, разве что, но она уж точно не глобальна :)

Binary ★★★★★
()
Ответ на: комментарий от Binary

Я не заметил «вне модулей», ты прав.

provaton ★★★★★
() автор топика
Ответ на: комментарий от tyler19

а для руби/рельс надо покупать кластеры, чтобы обеспечить хоть какую-то производительность

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.