Мега-баг Vote up/down исправлен спустя год!

Главные вкладки

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 26 марта 2009 в 8:41

В память топика "в связи со случившимся на хабре..." набравшего 134 плюса в карму и послужившего поводом для искоренения пузомерки на друпл.ру
[Security-news] SA-CONTRIB-2009-017 - Vote Up/Down - Cross-site request forgery

Ура, товарищи! Мы снова можем использовать его в своих проектах и не бояться накруток!

Версии модуля до 5.x-1.1 и 6.x-1.0-beta4 позволяют злоумышленнику легко подтасовать голосование за любой материал так, как писал NeoChief.

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

На моей памяти это самое долгое успешное устранение дыры в безопасности.

Комментарии

Аватар пользователя sadmin sadmin 26 марта 2009 в 13:32

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

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 26 марта 2009 в 15:47

Исправили один баг, породили другой, поменьше.
Все данные сохраняются и на странице node/%/vote видны правильно, но в points (результаты) выводится последний голос, или сумма последних голосов если они за одну ноду.
UPD. отписался в issues. Ждем реакции.

Аватар пользователя Dan Dan 10 ноября 2015 в 11:46

не используйте версию 6.x-1.0-beta4 если включено голосование для анонимов - позволяет многократно голосовать им.
или накладывайте патч, которого нет Smile см. здесь: It casts multiple votes - same IP | latest version - I voted 20 times! Smile Smile

патч сделал и приложил.

Аватар пользователя Ainur Ainur 31 марта 2009 в 1:53

Для 5-ой все равно не работает, ибо тот кто портинг делал из 6-ой версии, оставил синтаксис url в 5-ой из 6-ой в theme_vote_up_down_widget() и theme_vote_up_down_widget_alt()
тут есть патч...

Аватар пользователя batbug batbug 31 марта 2009 в 7:50

У меня стоит вообще 6.х-бета1, так как бета2 была забагованная страшно. Вчера попробовать поставить последний дев-релиз, в котором как раз пофиксена ошибка Cross-site request forgery, описанная в начале. Поставил, смотрю, вообще не отображает виджета для голосования. Крутил туда-сюда, плюнул, вернул бету1, посмотрел как автор исправил CSRF, да и дописал тоже самое для себя.
Так и живем.

Аватар пользователя batbug batbug 31 марта 2009 в 17:50

"<a href="mailto:fasdalf@fasdalf.ru">fasdalf@fasdalf.ru</a>" wrote:
Не сохранился у меня. Мне бы хотелось, раз уж работает.

Ок, объясню что и как т.к. у меня слишком много хаков для личных нужд в этом модуле.

1. Берем бету2 - http://drupal.org/node/359908
2. Правим vote_up_down.module:
стираем 519 строку
$vote['uid'] = $uid;
Это правит баг, когда люди голосуют бесконечно.

дальше ищем функцию vote_up_down_link($type, $node = NULL, $teaser = FALSE)

в районе 264 строки:

- 'query' => drupal_get_destination()
+ $token = drupal_get_token("vote_up_down/$type/$node->nid/0");
+ 'query' => drupal_get_destination() .'&token='. $token

дальше снова правим функцию vote_up_down_vote()
в районе 482 строки:

- if (is_numeric($cid) && is_numeric($value)) {
+ if (is_numeric($cid) && is_numeric($value) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], "vote_up_down/$type/$cid/$value")) {

дальше правим нужный нам виджет для голосования:

я правил theme_vote_up_down_widget_alt($cid, $type)
в районе 631 строки:

  if (user_access('view up/down votes')) {
+ $token = drupal_get_token("vote_up_down/$type/$cid/1");

и чуть ниже

- 'query' => drupal_get_destination(),
+ 'query' => drupal_get_destination() .'&token='. $token,

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