Поиск:

Ответ в темуСоздание новой темы Создание опроса
> критическая уязвимость-фича в RoR, проверь свои сайты! 
:(
    Опции темы
skyboy
  Дата 5.3.2012, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



да, баян. да, узнал на хабре.
сорс: https://github.com/rails/rails/issues/5228
коротко: RoR имеет проблемы, схожие с PHPшным register_globals
длиннее: по умолчанию атрибуты моделей могут загружать свои значения из переданных пользователем данных(POST). что потенциально является не просто дырой - прям-таки порталом.
резюме: я - паникер, а, если ты - RoR разработчик, почитай подробности и проверь свои сайты

Добавлено @ 02:22
и да, это не уязвимость.
но, черт возьми, почему в РНР соответствующую опция надо включать(читай: подвешивать над головой меч) вручную и самостоятельно ажно с 4.2.0? а в RoR только сейчас зашевелились? где же "возьмем лучшее"?

Цитата(php.net/ChangeLog-4.php#4.2.0)

Version 4.2.0
22-Apr-2002 
ATTENTION!! register_globals defaults to 'off' now !!!

подумаешь, 10 лет.
PM MAIL   Вверх
solenko
Дата 5.3.2012, 16:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 1
Всего: 67



Цитата(skyboy @  5.3.2012,  01:18 Найти цитируемый пост)
но, черт возьми, почему в РНР соответствующую опция надо включать(читай: подвешивать над головой меч) вручную и самостоятельно ажно с 4.2.0? а в RoR только сейчас зашевелились? где же "возьмем лучшее"?

Ну во-первых не стоит путать  своство языка и свойстви фреймверка. Кроме того, php импортировал это в переменные в global scope. А для эксплуатации этой "уязвимости" программист сам должен прописать update_attributes(params[...]). В PHP все так-же никто не запрещает писать 
Код

$post = new Post();
$post->author = $current_user->id;
$post.update($_POST['post']);

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




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 7.3.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(solenko @  5.3.2012,  15:07 Найти цитируемый пост)
Ну во-первых не стоит путать  своство языка и свойстви фреймверка

то есть, пофиг, наступаем на те же грабли?
Цитата(solenko @  5.3.2012,  15:07 Найти цитируемый пост)
А для эксплуатации этой "уязвимости" программист сам должен прописать update_attributes(params[...]).

я с RoR и с Ruby не знаком. Вообще.
Потому скажи мне, пожалуйста, что значит:
Цитата(https://github.com/rails/rails/issues/5228)

if code is scaffolded than likely we got Pursue.find(params[:id]).update_attributes(params[:pursue]) in the controller. And that is what I worry about.

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

$post.update($_POST); // мы ж про mass assignment, верно?
 
поправь меня, если я ошибаюсь в выводах.
и да, я ничего не сказал о программистах. 
а всего лишь перепостил уведомление "никто не застрахован! проверь глаза на наличие бревна!"  smile 
PM MAIL   Вверх
source777
Дата 9.3.2012, 12:07 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(skyboy @  7.3.2012,  23:58 Найти цитируемый пост)
то есть, пофиг, наступаем на те же грабли?

Жёлтая пресса не обошла стороной и IT. Ошибки в коде Github не имеют ничего общего с register_globals.
Вся эта шумиха поднята вокруг реализации паттерна Active Record, которая позволяет создавать и обновлять записи в БД на основе хэша, который чаще всего приходит от пользователя, заполнившего некую форму. При этом есть возможность указывать белый или чёрный список атрибутов модели, которые можно(attr_accessible) или нельзя(attr_protected) обновлять таким образом.
Ну или более подробно в Guides: http://guides.rubyonrails.org/security.html#countermeasures

Цитата(skyboy @  7.3.2012,  23:58 Найти цитируемый пост)
потому что мне показалось, что речь про дефолтный механизм, генерящий код. не зависящий от желания сделать

В цитате идёт речь лишь о том, что один из генераторов кода (scaffold), который используются исключительно для скринкастов, не генерируют attr_accessible или attr_protected, и как следствие появляется некоторое подмножество программистов, которые про них и не слышали.. Во всей этой истории удивляет лишь то, что программисты Github Inc. допустили так много ошибок подобного рода.

Цитата(skyboy @  7.3.2012,  23:58 Найти цитируемый пост)
и да, я ничего не сказал о программистах. 

Как раз зря. Потому что Rails тут винить совершенно не в чем. Данная особенность есть в большинстве современных веб-фреймворков.. Взять к примеру документацию Yii:
Цитата

// assume $_POST['Post'] is an array of column values indexed by column names
$post->attributes=$_POST['Post'];
$post->save();

и рядышком невзрачная ссылка, по которой написано:
Цитата

After a model instance is created, we often need to populate its attributes with the data submitted by end-users. 
...
The last statement is called massive assignment which assigns every entry in $_POST['LoginForm'] to the corresponding model attribute.
...
It is crucial to determine which attributes are safe. For example, if we expose the primary key of a table to be safe, then an attacker could get a chance to modify the primary key of the given record and thus tamper the data he is not authorized to.
...
Sometimes, we want to declare an attribute to be safe, even though we do not really have any specific rule for it. An example is an article's content attribute which can take any user input. We can use the special safe rule to achieve this goal:

array('content', 'safe')
For completeness, there is also an unsafe rule which is used to explicitly declare an attribute to be unsafe:

array('permission', 'unsafe')

Те же яйца только в профиль, причём даже primary key из коробки не защищен, в Rails хоть id нельзя так присвоить.
Так что про какие 10 лет речь? Документацию Yii наверно не 10 лет назад в последний раз обновляли? 

А дальше уже философский вопрос.. должен ли фреймворк "из коробки" защищать программиста от всех возможных ошибок? И если да, то реализуем ли такой фреймворк хотя бы теоретически?

Это сообщение отредактировал(а) source777 - 9.3.2012, 12:12


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
skyboy
Дата 9.3.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



признаю, был не прав smile
Цитата(source777 @  9.3.2012,  11:07 Найти цитируемый пост)
 должен ли фреймворк "из коробки" защищать программиста от всех возможных ошибок?

от всех - нет.
смотри, в том же PHP, если не играться с error_reporting, то получишь предупреждение и про использование переменных без присвоенных значений - чем не "защита программиста от ошибки"?
почему не поставить "по умолчанию все аттрибуты не сеттятся", но с возможностью поставить даже "обновляй все поля", но явно?
мне это правда не понятно.
и нет, в своем коде я assert не вставляю в начале каждого блока. но базовые проверки делаю.
PM MAIL   Вверх
source777
Дата 9.3.2012, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(skyboy @  9.3.2012,  12:18 Найти цитируемый пост)
почему не поставить "по умолчанию все аттрибуты не сеттятся", но с возможностью поставить даже "обновляй все поля", но явно?

По ссылке выше есть про опцию config.active_record.whitelist_attributes, если её установить в true, то всё так и будет. Почему она по умолчанию выставлена в false трудно сказать. 
Хотя вероятная причина состоит в том, что далеко не для всех моделей эти списки разрешённых атрибутов необходимы, т.к. в типичном веб-приложении обычному зарегистрированному юзеру доступно на создание/редактирование 2-5 моделей, а за сценой есть ещё несколько десятков моделей, доступ к которым есть только из админки.

Цитата(skyboy @  9.3.2012,  12:18 Найти цитируемый пост)
смотри, в том же PHP, если не играться с error_reporting, то получишь предупреждение и про использование переменных без присвоенных значений - чем не "защита программиста от ошибки"?

Ну в Ruby ты не просто предупреждение, а runtime ошибку "NameError: undefined local variable or method" получишь в данном случае, только какая связь.. 
Тут просто палка о двух концах... С одной стороны можно запретить чистый SQL вызывать, дабы программист не смог SQL-Injection допустить, а с другой - от этого возникнет куча проблем, когда запрос на SQL написать в сто раз проще, чем мучать ORM, а такие случаи неизбежно бывают в нетривиальных приложениях. И над поиском разумного компромисса между защищенностью и гибкостью библиотек по факту бьётся весь IT-мир не первый десяток лет. 

Цитата(skyboy @  9.3.2012,  12:18 Найти цитируемый пост)
и нет, в своем коде я assert не вставляю в начале каждого блока.

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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby on Rails"
source777
  • С чего начать? начинаем
  • Документацию смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby On Rails | Следующая тема »


 




[ Время генерации скрипта: 0.3414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.