Эксплуатировать нельзя сообщать или трудности перевода

в 15:22, , рубрики: markdown, xss, информационная безопасность, сказка

Screw you guys, I'm going home!
— Eric Theodore Cartman

Не с этого я хотел начинать, да и ни с таким количеством букв, но… Расскажу небольшую рождественскую сказку или историю, а может, даже, и правду.

На католическое рождество одному шалопаю Санта подарил уязвимость на крупном языковом ресурсе, из разряда: знаем, что надо, но по какой то причине заб(ы|и)ли, наподобие открытого svn, только XSS в markdown.

Прежде чем продолжить, сделаю не большое отступление по поводу структуры статьи. Я разделил на три части: практическая, опрос и философская, а для более удобочитаемости и загадочности еще и ввел переменные:

X — языковой сервис
H — главный на X
d ∈ D — команда разработчиков X или просто D
S — Санта клаус, который просто засыпал подарками северокорейских хакеров в прошедшем году
Z — уязвимость aka подарок aka рождественское чудо
Y — пользователь которому S преподнес Z

Часть первая практическая

Автору не известно по какой причине и по каким соображениям D решила использовать на форуме X markdown, приэтом польностью доверевшись пользователям, может конечно это основная часть экосистемы, может желание угодить пользователям или может банальная лень. Здесь возможны только догадки, а ответ думаю мы от них так и не узнаем.

Наступило католическое рождество и будучи хорошим мальчиком в прошедшем году Y нашел под елкой Z от S, «Что за …»,- воскликнул Y, но как и любой ребенок он решил не заморачиваться по поводу своего восклицания, а сразу поиграться с Z на X и каково было его удивления когда банальная ссылка [test](javascript:alert(‘xss’)) вывела ему «XSS». «Чудо?! Подарок!», — скажите Вы, да это можно называть по разному и раздолбайством то же, но придерживавшийся этического хакинга Y все таки решил поделиться со своим подарком c D и предупредить остальных пользователей X о таком чуде, которое могло привести к чудесам более серьезного масштаба вплоть до кражи их данных, спама или превращения их вычеслительного устройства в один из узлов очередного ботнета или в тыкву. Но из-за того что D, по не известной нам причине спрятала волшебную кнопку «support», для прямого обращения к ним, от русскоязычного сообщества, Y решил поздравить их на форуме в разделе поддержки для англоговорящих пользователей, оставив им привет ввиде простого alert и с просьбой закрыть данную проблему.

Прошли сутки, Новый Год уже стоял на пороге, но D так и не откликнулись по поводу Z, а за это время парень из Киева, используя Z, доработал функционал X, который убрали D, но еще востребованный пользователями, а другой пользователь из Германии, решил проверить возможность: не видимой для пользователей эксплуатации Z, используя onmouseover и onload на изображение. «Хм»,- сказал Y, увидев что его сообщение так и не было прочитано D. «Может не туда написал», — подумал он и оставил еще одно не большое сообщение, но в русскоязычной части X о найденом подарке, на которое откликнулась девушка O, понимая какого масштаба могуть быть чудеса используя Z, она подсказала другой путь к D, через прямые сообщения на странице их профайла, развернув полностью подарок Z, кроме привета Y еще повесил на onmousever не большое поздравление в ввиде alert, но только с «Happy New Year», все таки Новый год, дух рождества, и только затем написал H об Z, и о чудо D откликнулись, удалив все сообщения Y на англоязычной части форума, при этом не тронув русскоязычную ее часть и оставив Y банальное; Thanks c обещаением We'll fix this soon. Но Y было этого не достаточно и тогда он решил спросить H: «А какого D по удаляли все мои предупреждения", на что H мудро заметил:«Because your post causes the browser to crash. Please stop writing these posts until we fix the problem». «А как же дух Рождества, как обычный alert может привести к самоубийству браузера»,- спросите Вы, да конечно не приятно получить alert, но ведь Happy New Year да и всегда ведь можно закрыть страницу, но оставим это на совести H. Так решил поступить и Y, и с чувством выполненного долга он лег спать с надеждой, что завтра на X прекратятся чудеса.

На календаре уже было 31 декабря, падал прошлогодний снег, запах мандарин и звуки начинавшегося безумия на кухне разбудило Y, его еще не остывшие вычислительное устройство было готово к новым подаркам, но Y все таки решил проверить Z и как же он был расстроен, когда узнал, что чудеса продолжаются, но так как прошло всего 8 часов и наверное D работают над проблемой, Y оставил еще одно поздравление с наступающим новым годом, только в русскоязычной части, чтобы не смущать D, в виде смайлика, при нажатии на которого создавался бы object с ссылкой на клип группы ABBA «Happy New Year». Вот что у него получилось в итоге:

{@id=abba}
This is *red{@style=color:red;}.*
[some text{@id=test}](javascript:%76%61%72%20%61%20%3D%20%64%6F%63%75%6D%65%6E%74%2E%63%72%65%61%74%65%45%6C%65%6D%65%6E%74%28%27%6F%62%6A%65%63%74%27%29%3B%61%2E%77%69%64%74%68%20%3D%20%34%32%30%3B%61%2E%68%65%69%67%68%74%20%3D%20%33%31%35%3B%61%2E%64%61%74%61%20%3D%20%22%2F%2F%77%77%77%2E%79%6F%75%74%75%62%65%2E%63%6F%6D%2F%65%6D%62%65%64%2F%33%55%6F%30%4A%41%55%57%69%6A%4D%22%3B%64%6F%63%75%6D%65%6E%74%2E%67%65%74%45%6C%65%6D%65%6E%74%42%79%49%64%28%22%61%62%62%61%22%29%2E%61%70%70%65%6E%64%43%68%69%6C%64%28%61%29%3B%61%6C%65%72%74%28%22%54%68%69%73%20%69%73%20%41%42%42%41%21%22%29%3B)
![test {@onclick=document.getElementById('test').click() }](http://icons.iconarchive.com/icons/rokey/popo-emotions/128/big-smile-icon.png)

Не много отдохнем от рождественского повествования и разберем данное сообщение, первым делом нужен был контейнер куды бы добавлялся тег object с ссылкой на клип, для этого основному контейнеру топика присвиваем идентификатор {id=abba}, не привычно для атрибутов на markdown подумаете Вы, но классический вариант не работал {: #abba}, затем надо было куда то спрятать код, но перед этим его пришлось закодировать как ссылку, так как парсер обрабатывал кавычки, и знаки больше и меньше, после чего было выбрано изображение со смайликом и на событие onclick был повешен вызов document.getElementById('test').click(), по причине того что парсер обрабатывал и пробелы.

Прошло 12 часов, но ничего не происходило, Z так и не был закрыт, поэтому возмущенный Y решил оставить еще один привет в виде простого текста с предупреждением, чтобы пользователи меньше работали на форуме и спросил у H когда же D решат проблему, но в ответ его топик был снова удален, а заштатный модератор попросил, чтобы Y не писал о проблеме и не предупреждал пользователей, так как этим он ничего не добьется, опечаленный Y начал самовыпиливаться с X, но скоро получил сообщение от неравнодушного пользователя из США, который был от части согласен c Y и наконец то объяснил что же значит все таки «soon», автор приведет полный текст сообщений от неравнодушного пользователя, чтобы ничего не выдернуть из контекста.

M: That’s fascinating, I had no idea that was possible, but it definitely worked. I removed my reply because I don't want to encourage others to try it, but you're right about it being quite serious. You should report the issue to Support (with the white button on the side of the screen) and move that thread to the Troubleshooting forum so it's more likely to be seen by an admin. I'll report the issue as well.

M: I’m not part of the team, but I imagine that they don't want the vulnerability discussed because it might lead to more people trying to abuse it. For a vulnerability like this one, there's no way for users to protect themselves except to stop using the site or turn off javascript in their browsers. Neither of those are particularly «good» solutions, so in their eyes, it might be better to keep the exploit «low key» until they have a fix ready. I don't necessarily agree with that reasoning, but that's what they've apparently decided.

M: Soon" doesn't necessarily mean «instantly». It's a small team though, they've only got a handful of developers and have other things to take care of too. I wrote about how serious it was in my support ticket, so hopefully that encourages them to prioritize it. It doesn't appear that the exploit is very common, since it's been around for a long time and there hasn't been any attacks yet. Hopefully nothing will pop up until they can get the fix done.

Прочитав ободряющие сообщения, Y удалил все свои топики, подарил свои тугрики заработанные во время прохождения курса евангелисту X за его русский язык (слог), отключил аккаунт и присоединился к праздничному столу…

Ну и в конце данной истории автор бы хотел процитировать Александра Сергеевича Пушкина, но не много изменив его нетленные строки: «Сказка — ! ложь, да в ней намек — добрым молодцам урок...»

Часть вторая опрос

  • Как бы вы поздравили пользователей с наступающим Новым Годом, используя данную уязвимость XSS на форуме?
  • Как бы вы поступили на месте разработчиков крупного ресурса узнав о такой проблеме перед Новым Годом, при этом надо учесть, что форум так же доступен и для анонимных пользователей в режиме readonly?
  • И последний вопрос, где бы вы поставили запятую и поставили бы ли в данном предложении: «эксплуатировать нельзя сообщать».
Часть третья философская

О разработчиках

Автор не стал писать о том, что про них сказал Y, иначе бы сочли как жалобу, но из всего сказанного он бы выделил следующую логическую цепочку: если данную проблему не могут закрыть в течение недели, ставят ей не высокий приоритет, о чем тогда еще молчат разработчики, какие чудеса могут ждать пользователей их сервиса!? И еще автор бы хотел добавить по этому поводу: «Shit Happens».

О пользователях

Что больше опечалило Y из всей этой истории так это безграмотность пользователей, особенно в русскоговорящий части форума, в отличие от англоговорящий части, где пользователи поднимали топик вверх, чтобы разработчики заметили, русскоговорящие наоборот при желании минусовали и все твердили: «как зачем, да и кому надо», да кто-то скажет XSS это не серьезно, но автор бы сравнил ее с поцелуем после которого все только начинается, если конечно не получаешь пощечину или удар под дых.

О языковых курсах

Здесь точно не будет жалоб и ничего такого, просто автор приведет цитату Y и несколько пожеланий, какими бы хотелось видеть курсы, может это уже кем-то сделано:

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

  • Замечательно было бы например читаешь Дракулу Брэма Стокера, в оригинале, и сразу же идет разбор конструкций, ссылки на правила и словарь, а после бы прочтения очередной главы давали бы тест на те или иные правила изучаемого языка, тогда бы предложения как на X не выглядели бы так дико и выдернутыми из контекста.
  • курсы должны подстраиваться, но не упрощать задачу, а выявлять лучший способ подачи информации для обучаемогу, люди разные; кому то проще через текст, кому то проще через речь, а кому то через изображения и так далее.
  • Мы думаем на русском, так зачем нас заставляют все время переводить с английского на русский, может сначала было бы лучше набить руку в обратном переводе с русского на английский, а уже для пополнения словарного запаса с английского, да конечно есть одно но переводы с русского на английский не стоили бы и цента.
  • Y согласен с Петровым что надо сперва выделить особенности, конструкции языка, а потом только приступать к изучению, это как с программированием два курса нас таскают за волосы высшей математикой, теорией компиляторов, операционных систем, алгоритмами и шаблонами проектирования, а потом только переходим к высокоуровневым языкам.
Заключение от автора: не доверяйте пользователям, иначе они не будут доверять вам.

Автор: PaulWeb

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js