Пользователь
0,1
рейтинг
29 июля 2013 в 18:52

Разработка → Struts2 is under attack или CVE-2013-2115

Хочу написать небольшой пост для тех, кто владеет Struts2 проектами. Ребята, если вы не читаете рассылку CERT и мой Твиттер (ладно, это я могу простить...), и не обращаете внимание на рассылку от Struts2 об апдейтах — то одумайтесь, эта история для Вас.




Начало.



Эта история началась 16-го Июля. Я мирно ехал в метро и читал Айзека Азимова, как говорится, ничего не предвещало беды. Межу делом я решил проверить корпоративную почту, и обнаружил письмо от наших ребят из китайского офиса. Ребята говорили, что сегодня вышло сообщение об уязвимости в Struts2, уязвимость позволяла любому желающему получить полный удаленный контроль над сервером (выполнение произвольного кода) с правами веб-сервиса. Палехче ребята… день тока начался. Ладно, но кроме того, наши ребята узнали об этом с хакерского китайского форума, где другие веселые ребята выложили полноценный эксплойт, типа «нажал кнопку и хакнул Интернет», что означает, что сейчас, все эти веселые ребята начнут ломать этот самый несчастный Интернет. Это особо не приятно, когда понимаешь, что у нас имеется несколько сервисов, которые базируются на данном фреймоврке. Нервно дергая ногой я мысленно ускорял движение состава. И вот я уже вбегаю в офис, включаю ноутбук. Да действительно — адвайзори от вендора — http://struts.apache.org/release/2.3.x/docs/s2-016.html. Да, ребята даже слегка обрезанный пример эксплойта в свое сообщение добавил. И… это опять OGNL… у Struts2 вечные проблемы с OGNL:

http://blog.o0o.nu/2010/07/cve-2010-1870-struts2xwork-remote.html (2010)
http://blog.o0o.nu/2012/01/cve-2011-3923-yet-another-struts2.html (2011)
https://communities.coverity.com/blogs/security/2013/05/29/struts2-remote-code-execution-via-ognl-injection (2013, Май)

И вот опять… Ладно. Но в этот раз дело ограничено временем — на Китайском форуме, в паблике доступен — «Эксплойт для всех» — http://kuxoo.com/archives/260/.

Пример сплойта, что бы линк с иероглифами не открывать — ищите в Ваших логах:

localhost/Struts2/test.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'netstat'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}

Что это означает? А то что время пошло на секунды. При этом, я надеюсь, вы понимаете, что нельзя просто так взять и поставить апдейт от Struts2 на продакшн сервисы, без тестирования и прочих процедур, к тому же в разных регионах разные часовые пояса. Все это обычные рабочие моменты, так или иначе там, где можно было — фиксы были накатаны, в других местах IPS/WAF поднастроены, в третьих фильтры сервиса — вообщем решений, как предотвратить угрозу — масса, все было сделано так, что бы защититься от возможных атак.

17-го же числа на наших границах был обнаружен противник. В основном китайские IP адреса. Безуспешно сканировали именно на эту уязвимость. Получается, что момент реакции для предотвращения вторжения с момента выхода патча составлял 1 день и являлся решающим. Китайцы все как один использовали один и тот же эксплойт, что можно определить по переменной matt. Хотя вариантов того, как исполнить код через OGNL выражений масса — почти вся мощь Java в руках нападающего.

Реакция Интернета



В это время в Интернете — в блогосфере, в новостях, и даже в твиттере было тихо. Это не очень похоже на ИБ сообщество — слишком тихо, учитывая популярность Struts2, это странно. Я отписался в твитторе на эту тему, но было тихо, лишь несколько коллег сказали что вовсю отбиваются от атак.
Чуть позже (в 21-го или 22-го ) прогремела новость о взломе developer.apple.com. Я не обратил внимание, лишь потом я вдруг осознал, что developer портал был на Struts2. Судя по всему до них добрались именно так… Конечно была новость о том, что некий исследователь сообщил об уязвимости, но я не верю. Скорее всего данный парень просто повторил китайский паблик-сплойт, и сообщил о баге, но ДО него уже сервер был взломан. Иначе бы его не отключили на столь длительное время. И потом этот парень просто решил провернуть ПР акцию в честь себя любимого, мол он взломал Apple. В районе 24-25 числа, мне стало интересно, ВООБЩЕ хоть кто-нибудь почесался и зафиксился.
Например один крупный белорусский банк зафиксился только 25-го числа. Про QIWI можно почитать тут — http://habrahabr.ru/company/qiwi/blog/187724/#comment_6524512. В остальном в России тишь да гладь. Найденная система гос-заказов — уязвима. Один важный сервис министерства РФ, с кучей персональных и более интересных данных — уязвим. О какой кибер-войне может идти речь-то, Лукацкий в блоге про это не писал — и фиг с ним, а то что китайские товарищи во всю льют бекдоры — who cares, это ж не ПДн в бложике обсуждать. Печально, что Страна не готова ни то что к 0day, но к известным 1day атакам в самый острый её временной период, даже более чем через неделю после выхода патча! Банки СНГ и то порасторопнее оказались. НО если вы думаете, что только в России всегда все плохо — вы ошибаетесь. Я не поленился и посканил наиболее интересные ресурсы — правительственные ресурсы других стран уязвимы до сих пор. Причем атака на некоторые из них будет иметь достаточно интересные последствия в физическом мире.

Не всяк workaround хорош



Второе наблюдение — это те, кто знал об атаках и баге, и замутил хот-фикс. Я нашел два сервиса от крупных мировых вендоров. Оба сервера имели хотфикс, которые не позволял атаке пройти. Но оба вендора сделали одну и ту же ошибку. В адвайзори и в паблик эксплойте был только один вектор атаки — GET запрос. Но стоит проверять и POST. Этого ребята не предусмотрели в горячке боя, в итоге я получил шеллы на обоих серверах о чем незамедлительно сообщил в обе компании. Фиксы вышли через несколько часов. Скриншоты c доказательством доступа в следующем выпуске журнала ][

Вместо заключения



Выводы о том что и почему, и как с этим жить и бороться я также оставил для журнала, хотя это и так очевидно. Но я решил написать в хабр, что бы банально предупредить — я не могу писать каждому вендору лично, тем более правительственным структурам и банкам — это ваша работа не моя, реагировать на ваши инциденты должны ВЫ, например так как это сделали QIWI, им не понадобилось ждать недели (мой им респект). Остальные — просто знайте, и примите меры, потому что враг не ждет одного месяца с момента выхода патча, как написано в бумажном стандарте, которому вы гордо соответствуете… он начал атаку через один день после выхода фикса от вендора.
Alexey Sintsov @d00kie
карма
180,5
рейтинг 0,1
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (13)

  • +7
    у Struts2 вечные проблемы с OGNL

    Struts 2 — это и есть вечные проблемы. Написал достаточно приложений на нём, чтобы больше никогда не использовать. А уязвимость к слову на всех из них работает…
    • 0
      Я использовал Struts 2 для нескольких своих проектов и на работе и в принципе фреймворк оставил «довольно» теплые чувства. Есть альтернатива конечно в виде Spring MVC — но на мой взгляд более «толстая». Есть Play — но к нему у многих отношение весьма скептические к нему. Да и я почему-то к нему тоже несколько скептически настроен и не писал на нем ни одного проекта серьезнее hello world(возможно потому, что он отличается от Энтерпрайз фреймворков в моем понимании).

      Какие еще альтернативы можете порекомендовать?
      • +1
        Часто используют JAX-RS или что-то подобное в сочетании со статическим фронтендом. При этом фронтенд часто пишут на JS (или компилируемых в него языках) и оформляют в виде отдельного проекта, в которм ни строчки кода на Java. Результатом сборки является набор статических файлов, которые заливают на CDN. Общение между фронендом и бекендом либо через ajax, либо по вебсоккетам. UI в привычном понимании в Java-проекте отсутствует: сервер просто предоставляет API.
        • 0
          В случае с Rest сервисом (по крайней мере для меня) — я довольно быстро клепаю бэкенд, но потом на фронтенд работу уходит довольно много времени, если делать ее самостоятельно(по крайней мере для меня). Суммарно больше, чем если лепить на Struts2/Srping MVC + JSP.
  • 0
    Есть информация, с какой версии оно появилось? Есть ли смысл срочно обновляться с 2.1.x или 2.2.x?
    • +1
      Да. Уязвима вся вторая ветка: Affected Software Struts 2.0.0 — Struts 2.3.15
  • 0
    Судя по китайскому источнику, там и 2.3.15 уязвима. Эта же 2.3.15 висит и для скачки как «Best available».
    Ошибся веткой. Комментарий предназначался уважаемому eyeless_watcher.
    • 0
      Я понимаю, что уязвима свежая ветка. Вопрос состоит в том, успели ли в той версии ognl, которая идет в комплекте с версиями нескольких лет давности добавить те возможности, которые вылились в эту уязвимость.
      • 0
        первый стратс не подвержен этой уязвимости, только 2 ветка
        • 0
          2.1 и 2.2 — всё-таки не первый стратс, хоть и родом из тех времен :)
    • +1
      Протестировал локально — действительно, в 2.3.15 — еще дыра есть. В 2.3.15.1 — уже исправлено.
  • 0
    Уязвима ли первая ветка struts 1.x?
    Я из приведенных выше ссылок этого не понял.

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