Хочу написать небольшой пост для тех, кто владеет Struts2 проектами. Ребята, если вы не читаете рассылку CERT и мой Твиттер (ладно, это я могу простить...), и не обращаете внимание на рассылку от Struts2 об апдейтах — то одумайтесь, эта история для Вас.
Начало.
Эта история началась 16-го Июля. Я мирно ехал в метро и читал Айзека Азимова, как говорится, ничего не предвещало беды. Межу делом я решил проверить корпоративную почту, и обнаружил письмо от наших ребят из китайского офиса. Ребята говорили, что сегодня вышла сообщение об уязвимости в Struts2, уязвимость позволяла любому желающему получить полный удаленный контроль над сервером (выполнение произвольного кода) с правами веб-сервиса. Палехче ребята… день тока начался. Ладно, но кроме того, наши ребята узнали об этом с хакерского китайского форума, где другие веселые ребята выложили полноценный эксплойт, типа «нажал кнопку и хакнул Интернет», что означает, что сейчас, все эти веселые ребята начнут ломать этот самый несчастный Интернет. Это особо не приятно, когда понимаешь, что у нас имеется несколько сервисов, которые базируются на данном фреймоврке. Нервно дергая ногой я мысленно ускорял движение состава. И вот я уже вбегаю в офис, включаю ноутбук. Да действительно — адвайзори от вендора — http://struts.apache.org/release/2.3.x/docs/s2-016.html. Да, ребята даже слегка обрезанный пример эксплойта в свое сообщение добавил. И… это опять ONGL… у Struts2 вечные проблемы с ONGL...:
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/.
Пример сплойта, что бы линк с иероглифами не открывать — ищите в Ваших логах:
http://localhost/Struts2/test.action?redirect:${%23w%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),%23w.println('[/ok]'),%23w.flush(),%23w.close()}
Что это означает? А то что время пошло на секунды. При этом, я надеюсь вы понимаете, что нельзя просто так взять и поставить апдейт от Struts2 на продакшн сервисы, без тестирования и прочих процедур, к тому же в разных регионах разные часовые пояса. Все это обычные рабочие моменты, так или иначе там, где можно было — фиксы были накатаны, в других местах IPS/WAF поднастроены, в третьих фильтры сервиса — вообщем решений, как предотвратить угрозу — масса, все было сделано так, что бы защититься от возможных атак.
17-го же числа на наших границах был обнаружен противник. В основном китайские IP адреса. Безуспешно сканировали именно на эту уязвимость. Получается, что момент реакции для предотвращения вторжения с момента выхода патча составлял 1 день и являлся решающим. Китайцы все как один использовали один и тот же эксплойт, что можно определить по переменной matt. Хотя вариантов того, как исполнить код через ONGL выражений масса — почти вся мощь 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, им не понадобилось ждать недели (мой им респект). Остальные — просто знайте, и примите меры, потому что враг не ждет одного месяца с момента выхода патча, как написано в бумажном стандарте, которому вы гордо соответствуете… он начал атаку через один день после выхода фикса от вендора.
Автор: d00kie