LINUX.ORG.RU

В коде xz версий 5.6.0 и 5.6.1 обнаружен бэкдор

 ,


4

9

Разработчик Debian и исследователь в сфере информационной безопасности Andres Freund сообщает об обнаружении вероятного бэкдора в исходном коде xz версий 5.6.0 и 5.6.1.

Бэкдор представляет собой строчку в одном из m4-скриптов, которая дописывает обфусцированный код в конец скрипта configure. Этот код затем модифицирует один из сгенерированных Makefile проекта, что в конечном итоге приводит к попаданию вредоносной нагрузки (замаскированной под тестовый архив bad-3-corrupt_lzma2.xz) непосредственно в исполняемый файл библиотеки liblzma.

Особенность инцидента состоит в том, что вредоносные скрипты сборки, служащие «триггером» для бэкдора, содержатся только в распространяемых tar-архивах с исходным кодом и не присутствуют в git-репозитории проекта.

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

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

Рекомендации по безопасности были выпущены проектами Arch Linux, Debian, Red Hat и openSUSE.

Разработчики Arch Linux отдельно отмечают, что хотя заражённые версии xz и попали в репозитории дистрибутива, дистрибутив остаётся в относительной «безопасности», т. к. sshd в Arch не линкуется с liblzma.


Проект openSUSE отмечает, что ввиду запутанности кода бэкдора и предполагаемого механизма его эксплуатации сложно установить «сработал» ли он хотя бы раз на данной машине, и рекомендует полную переустановку ОС с ротацией всех релевантных ключей на всех машинах, на которых хотя бы раз оказывались заражённые версии xz.

>>> Подробности

★★★★★

Проверено: maxcom ()
Последнее исправление: ilinsky (всего исправлений: 2)

Ответ на: комментарий от AS

Если не пихать в cmake лапшу всякую, то ничего не ломается

cvs-255 ★★★★★
()
Ответ на: комментарий от hateyoufeel

Скрипты для autoconf пишутся на наркоманском макроязыке m4, который настолько чудовищен

Да так-то не более чудовищен, чем остальные.

В подавляющем большинстве проектов эти скрипты пишутся тупо копипастой

Нынешним программистам бы вообще натягать окошек мышкой в каком-нибудь Visual C/Delphi, и всё.

AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от Shadow

Я знал, что autotools редкая шиза

К сожалению нет. Многие зеачимые проекты такие как GCC и Wine всё ещё их используют.

X512 ★★★★★
()
Ответ на: комментарий от AS

постоянно ломающийся с обновлением cmake

На сегодня в Gentoo поддерживают 4 слота для autotools, плюс пятый для сборки из git. То есть 5 несовместимых версий. Для cmake версий тоже 5, но слот один. Все старые несовместимые версии считают уже неактуальными.

По мере того, как старые авторы стареют и уходят на покой, совместимость ломают всё меньше и меньше :)

question4 ★★★★★
()

Основная проблема(техническая) заключается в текстовой скриптоте. Автотулзы, цмаке, пистон - неважно что именно там. Да, «статические» языки(раст) и языки с «развитым метапрограммированием»(лисп) проблеме также подвержены. Как и препроцессор в сишке. Хоть шеллы и самый яркий пример подобного, но присутствует эта проблема в любых макросах.

Текст никак не структурирован, и в общем случае не запустив портянку на исполнение нельзя сказать что там в этом тексте лежит. Как определить, что делает такой код(не запуская его): cat $(sha256sum /x/y/z)? Никак - там и cat, и sha могут являться чем угодно. И это всего простенький пример. Как-то проверить подобный код не представляется возможным, даже IDE никакой(хотя бы минимальной) поддержки не даёт(а если даёт, то появляются: 1 - адские лаги, 2 - исполнение любого кода уже в IDE). Сильнейшая зависимость от окружения в довесок.

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

jsforever
()
Ответ на: комментарий от question4

По мере того, как старые авторы стареют и уходят на покой, совместимость ломают всё меньше и меньше :)

старые уходят - приходят молодые (недоросли) и ломают все чаще и круче! :о)

sunjob ★★★★
()
Ответ на: комментарий от liksys

я не понимаю почему вы обсуждаете эту саму-по-себе интересную тему в треде про xz, но раз уж вы всё равно обсуждаете…

а планов по AV1 нету? аппаратная поддержка как энкода, так и декода становится +- попсовой в железе, поэтому было бы клёво её иметь.

ещё вопрос в воздух: как у RFB с инпутом вне клавомыши (гейм контроллеры, джостики, вот это вот всё)

Stil ★★★★★
()
Ответ на: комментарий от Stil

AV1 в железе есть только у относительно новых устройств, в отличие от h264, поддержка которого в железе появилась лет 15 назад.

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

einhander ★★★★★
()
Последнее исправление: einhander (всего исправлений: 1)
Ответ на: комментарий от einhander

AV1 в железе есть только у относительно новых устройств

Я бы сказал не относительно новых, а очень новых.

Werenter ★★★
()
Ответ на: комментарий от Werenter

Я бы сказал не относительно новых, а очень новых.

«очень новые» это релиз 3 года назад (rdna2, series30, xe), если что. и я бы не ожидал, что вся бюрократия и реализация займут меньше ещё пары лет.

Stil ★★★★★
()
Ответ на: комментарий от Stil

а планов по AV1 нету? аппаратная поддержка как энкода, так и декода становится +- попсовой в железе, поэтому было бы клёво её иметь.

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

как у RFB с инпутом вне клавомыши (гейм контроллеры, джостики, вот это вот всё)

Вот тут есть какое-то расширение, но не факт, что найдутся клиенты, которые это поддерживают.

На самом деле, RFB это натуральный мезозойский ужоснах и набор костылей, стоящих друг на друге. Это я заявляю, как человек, написавший с нуля свой собственный RFB-сервер :D Базовая работа с инпутами устроена очень примитивно - в виде X11-сканкеев, что исключает возможность работы с клавиатурой напрямую, для этого есть QEMU-расширения для передачи физических кнопок. Чтобы качественно поддерживать именно геймпады со всеми их фичами, нужно по-хорошему делать специальное расширение для них. Я бы сделал что-нибудь типа generic usb hid messages, чтобы прокидывать все хиды в общим виде.

liksys ★★★★
()
Ответ на: комментарий от hateyoufeel

Окей, замени Windows 95 на Motif/Athena. Они рисовали на CPU 100% и при этом были быстрее чем GTK4.

Нет, конечно.

Простое перетаскивание окна тогда делалось через рамку превью, и только когда пользователь отпускал кнопку окно перерисовывалось в новом месте.

khrundel ★★★★
()
Ответ на: комментарий от jsforever

Это заявление так же верно, как и бесполезно. Потому что единственная альтернатива скриптам — бинарный блоб. Давайте везде накидаем бинарных блобов и там уже всё равно будет, что куда там подставляется, потому что всё равно никто ничего не проверит.

Vudod ★★★★★
()
Ответ на: комментарий от Vudod

Нет, никаких «бинарных блобов» не существует. Да и вся работа у тебя в системе выполняется теми самыми «бинарными блобами». Поэтому к чему эти пассажи про «Давайте везде накидаем бинарных блобов»? Из них уже и так всё состоит.

Альтернатива скриптам - статический язык. Точнее это не альтернатива, а основа и где-то сбоку как клей выполняющий ~0% полезной работы существуют ещё и скрипты. «альтернатива скриптам» - это перл 80 lvl.

jsforever
()
Ответ на: комментарий от sunjob
 По мере того, как старые авторы стареют и уходят на покой, совместимость ломают всё меньше и меньше :)

старые уходят - приходят молодые (недоросли) и ломают все чаще и круче! :о)

А молодые предпочитают написать своё с нуля :)

question4 ★★★★★
()
Ответ на: комментарий от khrundel

Простое перетаскивание окна тогда делалось через рамку превью, и только когда пользователь отпускал кнопку окно перерисовывалось в новом месте.

В смысле? Делался скриншот окна и его таскали по экрану? Или рисовало пустую рамку и пользователь таскал её? Последнее — для Windows 95 неверно.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)

А в чем бекдор? Я подозреваю, что он позволяет под рутом авторизоваться по ssh. Кто-то на хетцнере кучу серваков похекал

rtxtxtrx
()
Ответ на: комментарий от liksys

Turbovnc видел на видео, сам не пробовал, и kasm пробовал сам. Вибрацию не помню, не проверял. Для игорь я переключился на sunshine, там и звук и вибрация присутствует, нет только мультипользователя, по сути аналог rustdesk.

einhander ★★★★★
()
Ответ на: комментарий от question4

В смысле? Делался скриншот окна и его таскали по экрану? Или рисовало пустую рамку и пользователь таскал её? Последнее — для Windows 95 неверно.

В смысле таскалась рамка. Просто границы прямоугольника. Таскать изображение, хотя бы даже скриншот - это было слишком дорого.

khrundel ★★★★
()
Ответ на: комментарий от question4

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

Reset ★★★★★
()
Ответ на: комментарий от Reset

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

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

question4 ★★★★★
()
Ответ на: комментарий от splinter

Версия проверочного скрипта на Python'е:

#!/usr/bin/python3
import os
import re
import sys

def check_lzma_lib_signature(filename):
    with open(filename, 'rb') as f:
        data = f.read()

    signature = re.findall('(?<=f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410)(.)*', data.hex())

    if signature and len(signature[0]) > 0:
        return True
    else:
        return False

# Set the path for the LZMA library files
lib_paths = ['/lib/', '/lib64/']

# Check the signature for all LZMA library files
for path in lib_paths:
    lzma_lib_file = os.path.join(path, 'liblzma.so.5')
    if os.path.exists(lzma_lib_file):
        if check_lzma_lib_signature(lzma_lib_file):
            print("Probably vulnerable")
            sys.exit(0)

# If none of the files are vulnerable, print accordingly
print("Probably not vulnerable")

saahriktu ★★★★★
()
Ответ на: комментарий от question4

написать своё с нуля :)

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

п.с. «писать с нуля» - это как раз единственно нормальный путь, иначе как еще «учиться»?! другое дело, что «одно - другому» не мешает :о)

sunjob ★★★★
()

Было бы неплохо к подобным новостям прилагать краткое описание назначения обсуждаемого софта в целом

nikitalol
()
Ответ на: комментарий от sunjob

старые уходят - приходят молодые (недоросли) и ломают все чаще и круче! :о)

Во-во. :-)

AS ★★★★★
()
Ответ на: комментарий от jsforever

Текст никак не структурирован, и в общем случае не запустив портянку на исполнение нельзя сказать что там в этом тексте лежит.

В cmake структурирован, в meson тоже.

cumvillain
()
Ответ на: комментарий от sunjob

написать своё с нуля :)

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

За редкими исключениями, переписывание с нуля приносит только опыт. Все продолжают плеваться, но пользуются кривым, но полнофункциональным старьём.

question4 ★★★★★
()

На Оупеннете несколько новостей в продолжение:

https://www.opennet.ru/opennews/art.shtml?num=60888 — блокировка защиты Landlock лишней точкой.

https://www.opennet.ru/opennews/art.shtml?num=60885 — бэкдор оказался опаснее, можно вызвать system(), не оставив следа в логах.

https://www.opennet.ru/opennews/art.shtml?num=60873 — хронология.

question4 ★★★★★
()
Ответ на: комментарий от question4

За редкими исключениями ... приносит только опыт

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

sunjob ★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от cumvillain

Нет, не достаточно. То, что в cmake нет eval - следствие его малых возможностей. Это не делает текст применимым. Ситуация та же, что и с cpp - пока оно мало что может, явных проблем вроде не возникает. Только вот что делать, когда понадобятся большие возможности? Вариантов два: добавить макросню, или выкинуть текст.

И да, разницы между кодом и не кодом нет. Чтобы код появился, его нужно написать/сгенерировать. Тот же cmake делает что - генерирует код. Поэтому разница между есть eval/нет есть только в простых случаях.

jsforever
()
Ответ на: комментарий от jsforever

Нет, не достаточно. То, что в cmake нет eval - следствие его малых возможностей. Это не делает текст применимым. Ситуация та же, что и с cpp - пока оно мало что может, явных проблем вроде не возникает. Только вот что делать, когда понадобятся большие возможности? Вариантов два: добавить макросню, или выкинуть текст.

И да, разницы между кодом и не кодом нет. Чтобы код появился, его нужно написать/сгенерировать. Тот же cmake делает что - генерирует код. Поэтому разница между есть eval/нет есть только в простых случаях.

Хоспади… cmake и meson можно прочитать глазами. Если там будет подозрительная срань – её будет сразу видно, потому что обычный meson это список object file’ов и циклы. m4 глазами прочитать нельзя, там ад и червие.

Вот собственно и все, поэтому автолулзы с точки зрения аудирования – сосут.

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от cumvillain

cmake и meson можно прочитать глазами
cmake

get_filename_component(COMPILER_BASENAME "${CMAKE_CXX_COMPILER}" NAME)
    if (COMPILER_BASENAME MATCHES "^(.+-)?(clang\\+\\+|[gc]\\+\\+|clang-cl)(-?[0-9]+(\\.[0-9]+)*)?(-[^.]+)?(\\.exe)?$")
      set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
      set(_CMAKE_TOOLCHAIN_SUFFIX ${CMAKE_MATCH_3})
      set(_CMAKE_COMPILER_SUFFIX ${CMAKE_MATCH_5})
    elseif(CMAKE_CXX_COMPILER_ID MATCHES "TIClang")
       if (COMPILER_BASENAME MATCHES "^(.+)?clang(\\.exe)?$")
         set(_CMAKE_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}")
         set(_CMAKE_TOOLCHAIN_SUFFIX "${CMAKE_MATCH_2}")
       endif()
    endif ()
 file(READ "${INPUT}" _tmp)
  foreach(_tmp_regex "%{([^%}]+)}" "%([^%]+)%")
    string(REGEX MATCHALL "${_tmp_regex}" _tmp_vars "${_tmp}")
    while(_tmp_vars)
      foreach(_tmp_var ${_tmp_vars})
        string(REGEX REPLACE "${_tmp_regex}" "\\1"
          _tmp_var_name "${_tmp_var}")
        if(DEFINED ${_tmp_var_name})
          set(_tmp_var_value "${${_tmp_var_name}}")
        elseif(NOT "$ENV{${_tmp_var_name}}" STREQUAL "")
          set(_tmp_var_value "$ENV{${_tmp_var_name}}")
        else()
          set(_tmp_var_value "")
        endif()
        string(REPLACE "${_tmp_var}" "${_tmp_var_value}" _tmp "${_tmp}")
      endforeach()
      string(REGEX MATCHALL "${_tmp_regex}" _tmp_vars "${_tmp}")
    endwhile()
  endforeach()
MOPKOBKA ★★★★
()
Ответ на: комментарий от khrundel

Простое перетаскивание окна тогда делалось через рамку превью, и только когда пользователь отпускал кнопку окно перерисовывалось в новом месте.

При этом даже простых карт с поддержкой 2D-ускорения (не 3D!) хватало уже, чтобы с нормальной скоростью перетаскивать окно целиком без превью. А таких карт в 1995-м году уже полно было, наверное, любая PCI-карта уже была с 2D ускорением.

Сейчас блин без OpenGL с шейдерами уже не могут.

praseodim ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Шикарный язык, чо. Это всё потому, что айтишники провинились перед Богом.

wandrien ★★
()
Ответ на: комментарий от MOPKOBKA

Мде...

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

praseodim ★★★★★
()
Ответ на: комментарий от cumvillain

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

Это если что от авторов CMake, профессионалов своего дела, обычный программист напишет хуже.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от praseodim

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

На чем-нибудь типа LUA или JS было бы в самый раз.

wandrien ★★
()
Ответ на: комментарий от MOPKOBKA

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

Чойта не должна.

wandrien ★★
()
Ответ на: комментарий от wandrien

Ты близок к разгадке….

Нет. На meson ты можешь писать понятные вещи, на m4 это невозможно в принципе, там все будет лапша.

cumvillain
()
Ответ на: комментарий от cumvillain

Ты проигнорировал всё и ничего не ответил. Давай я тебе вопрос задам: почему cmake написан на сишке, а не на самом себе? Там, понятно, не aot и что-то минимальное на сишке там и так будет. Но почему та же генерация make там также на си, хотя к языку это не относится?

К тому же, ты уже съехал с темы на «можно прочитать глазами». Глазами можно прочитать что угодно. Задача состоит в том, чтобы прочитать мог язык/иде, а далее дать тебе ассист, чтобы ты не «читал глазами» тысячи строк.

jsforever
()
Ответ на: комментарий от MOPKOBKA

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

Смогу. Если ты посмотришь на стандартный сценарий meson, он выглядит вот так: https://github.com/swaywm/sway/blob/master/meson.build

Там все понятно и нет страшной магии.

cumvillain
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.