The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Уязвимость в cups-filters, позволяющая выполнить код на сервере

22.05.2023 22:34

В пакете cups-filters, включающем компоненты для организации работы сервиса печати, найдена уязвимость (CVE-2023-24805), позволяющая удалённо выполнить произвольные команды на сервере печати через отправку специально оформленного задания вывода на печать. В настоящее время исправление доступно в виде патча. Проследить за выпуском обновлений пакетов в дистрибутивах можно на страницах Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, Arch, FreeBSD.

Уязвимость проявляется при использовании бэкенда beh (Backend Error Handler) для создания сетевого принтера. Проблема вызвана отсутствием в обработчике должных проверок имени выводимой на печать работы, при том, что данное имя используется в составе команд, выполняемых через функцию system(). Эксплуатация уязвимости сводится к передаче в поле "job-name" имени вида "';/usr/bin/id;'' #.pdf".

  1. Главная ссылка к новости (https://www.openwall.com/lists...)
  2. OpenNews: Проект OpenPrinting выпустил систему печати CUPS 2.4.0
  3. OpenNews: Автор CUPS выпустил PAPPL 1.0, фреймворк для организации вывода на печать
  4. OpenNews: Уязвимости в системе печати CUPS
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59181-cups
Ключевые слова: cups
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (46) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Анонин (?), 22:50, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    > beh.c
    > char scheme[1024]
    > '\0'

    Действительно, что же могло пойти не так //_-

     
     
  • 2.17, Ivan_83 (ok), 00:27, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Так развивай мысль дальше, что там не так?

      scheme[0] = '\0';
      strncat(scheme, uri, sizeof(scheme) - 1);
    вот это можно было заменить на
    snprintf(scheme, sizeof(scheme),"%s", uri);
    и всё.

    А исправление:
    https://github.com/OpenPrinting/cups-filters/commit/8f274035756c04efeb77eb654e
    оно совсем про другое.

     
  • 2.25, Аноним (-), 01:59, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > "';/usr/bin/id;'' #.pdf".

    Вообще-то это system() многострадальный - к си относится только тем что из си это можно использовать. Так стреляют пятки и на многих других ЯП которые вывешивают system() или сравнимый "упрощенный" интерфейс пуска программ.

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

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

     
     
  • 3.30, Аноним (30), 11:36, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Как будто, из самого правильного языка невозможно вызвать эту злосчастную system().
     
     
  • 4.37, Аноним (-), 19:38, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Собственно исходники на сях имеет смысл прицельно сканировать на наличие вызова system и сильно думать насколько оно легитимно и безопасно в том или ином случае. Для сетевой программы, с параметрами от пользователя это одна из самых глупых идей. По тем же причинам шелскриптам не стоит давать параметры от недоверяемого ремотного пользователя. Слишком много специальной трактовки разных символов - и это вообще-то к шеллу, что он так работает, со стороны сей тут никаких проблем нет - что дали то и выполнили. А то что для шелла эти закорюки имели специальные значения - ну и вот при чем тут си, если это шелл вообще специальной трактовкой символов на@#$вается? Классика жанра.
     
     
  • 5.43, Ivan_83 (ok), 13:24, 24/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А причём тут С?
    Отсутствие/недостаточная фильтрация входных данных - частая болезнь в разных продуктах на разных языках.
    Даже там где есть готовые функции для такой проверки/очистки - их периодически забывают вызывать.

    Помимо system() нефильтрованный ввод ещё попадает в *printf*() и *SQL*() и там тоже нехило разносит всё.
    Частая ошибка передавать такое в open(), все вебсервера через это проходили.
    Подозреваю даже что openat() могло появится только ради этого ))))

     
     
  • 6.44, Аноним (-), 22:36, 24/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > А причём тут С?

    Только при том что я его знаю, поэтому знаю что для него сканировать надо :). Вот прямо system. Лучше poison'ом его gcc'шным, или типа того. Если в программе вызовы system() есть это уже повод напрячься в общем случае. Особенно если оно что-то делает с внешними данными при этом. Легитимных и безопасных поводов для system() в коде вообще не так уж много. Шелл очень капризная пакость чтобы ему внешние данные скармливать вообще.

    А как это делать в каком-нибудь ruby, java или чем там еще - пусть специалисты в них и разбираются. И, если хотят, тут и пишут.

    И да, разумеется, чтобы не скучать есть еще SQL-инъекции. Или вон даже directory traversal обыкновенный. Вот тут кстати стандартизаторы подгадили - все эти ../../etc/passwd довольно канительно и грабельно отфильтровывать так то. Ну вот буквально каждый второй вебсервер норовит все и вся отсервировать по первости, например.

     

  • 1.2, Аноним (2), 23:00, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Сишники и строки, том 2023, глава 24805.
     
     
  • 2.3, Аноним (3), 23:13, 22/05/2023 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Купс это что-то из набора штатных бэкдоров, как и гхостскрипт. Сишники тут ни при чём.
     
     
  • 3.4, Герострат (?), 23:14, 22/05/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Канеш ни при чём, они всегда ни при чём
     
     
  • 4.8, Аноним (3), 23:53, 22/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Канеш ни при чём, они всегда ни при чём

    Смотри кто автор.

     
     
  • 5.26, Аноним (26), 02:05, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Код в котором встречается system() вообще особого доверия не заслуживает. Если кто видит в коде system() - есть нехилый шанс что там вулн, если параметры подконтрольны пользователю. Это касается вообще любого яп где это или нечто сравнимое есть.
     
  • 4.38, Аноним (-), 19:39, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Он в этом случае виноват только тем что шелл вызвал. Шелл на#$%лся на хитром эскейпинге. И вопросы тут к шеллу и его синтаксису так то на самом деле. А к сишнику вопрос только "нафига это было?"
     
  • 2.14, Ivan_83 (ok), 00:23, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +10 +/
    Чувак, причём тут С и строки?
    Автор кода получил строку по сети и отправил её в system(), не проведя никаких проверок и очисток.
    Можно на джаве, го, расте написать тоже самое.

    На пхп постоянно так делают и там SQL инекции случаются, именно это близкий аналог данной ошибки.

     
     
  • 3.34, Аноним (2), 15:16, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Действительно, можно такое написать на чём угодно, но написано на Си. И все эти проблемы с санитизацией ввода растут из отсутствия вменяемых способов работы со строками в Си. Как следствие, сишники не воспринимают строки иначе, чем массив байтов. Неназванное не может быть познано.
     
     
  • 4.36, Ivan_83 (ok), 16:23, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Нет.
    Вы сами себе придумали строки а потом жалуетесь что с ними нечем работать.
    Почти все веб сервера написаны на С и как то справились с очисткой входных данных.
    Есть куча всяких кодеков и пр что работает с бинарными данными и обработки там намного сложнее.

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

     
     
  • 5.40, Аноним (2), 20:19, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Вы сами себе придумали строки а потом жалуетесь что с ними нечем работать

    Вот именно про это я и говорю: неназванное. Очень уж напоминает языки некоторых примитивных племён, где нет слов для определённых цветов и — о чудо — носители языка эти цвета не различают.

    > Почти все веб сервера написаны на С и как то справились с очисткой входных данных

    Ты совершенно прав, и про то, как именно справлялись с очисткой данных можно почитать в предыдущих томах этой саги.

     
     
  • 6.42, Ivan_83 (ok), 13:19, 24/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы синтаксический сахар нужный для обработки строк возводите в мастхэв максимум.
    На практике же всё сводится к тому чтобы найти уже готовое решение которое где то имплементировано и оттестировано.
     
     
  • 7.46, Аноним (-), 22:42, 24/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Интересно за какой он синтаксический сахар топит? Кто-то заморочился позатыкать проблемы шелла на уровне либы? И если да - это для каких шеллов работает? Потому что шелл так то тоже не мировая константа. А какой-нибудь bash при необдуманном вызове позволяет и еще стрельнуть по пяткам добавочными способами. Рут по DHCP подтвердит.
     
  • 4.39, Аноним (-), 20:12, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если вызвать шелл с вон теми закорючками из другого ЯП - результат будет тот же самый. Чем тут си виноват? Что шелл позволяет вызывать чтоли? И кто из ЯП так уж прямо заморачивается санитизацией параметров для вот именно posix shell например?
     
     
  • 5.41, Аноним (2), 20:20, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если… Эх, вот только если… Но вызвали из Си и получили то, что получили.
     
     
  • 6.45, Аноним (-), 22:38, 24/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Есть полно случаев когда вызывают и не из си, получая то же самое по смыслу. Вот прям таким же эксплойтом.

    А си в этой схеме что предъявляется? Что он шелл запускать видите ли умеет по простому? Ну охренеть вулн :)

     

  • 1.5, Герострат (?), 23:16, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я правильно понимаю, у них критическая ошибка в обработчике ошибок? 😄
     
  • 1.6, Аноним (6), 23:23, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а вы думали что просто так оно жепой в интернет смотрит?
     
     
  • 2.31, Аноним (30), 11:37, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    И кто его жепой в инет выставляет? Список в студию!
     

  • 1.7, хрю (?), 23:51, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    в сях (да и в плюсах) работа со строками одно мучение.
    Поэтому меня всегда так радуют описания нововведений в сях и плюсах, то сё, пятое десятое, а нормальной удобной стандартной библиотеки для строк нет. А уж про utf и заикаться не надо - каждый как черепашка тащит свою реализацию ... куцую и убогую.
     
     
  • 2.9, Аноним (3), 23:59, 22/05/2023 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > в сях (да и в плюсах) работа со строками одно мучение.
    > Поэтому меня всегда так радуют описания нововведений в сях и плюсах, то
    > сё, пятое десятое, а нормальной удобной стандартной библиотеки для строк нет.
    > А уж про utf и заикаться не надо - каждый как
    > черепашка тащит свою реализацию ... куцую и убогую.

    Есть только ICU. В принципе есть только ICU, если ты хочешь юникод. ICU не куцая, ICU блотварь. Какие твои проблемы, всё прекрасно со строками в плюсах? В си нет строк, есть asciiz, что вполне себе неплохо и эффективно на практике. Не драматизируй, это всё вопрос привычки.

     
     
  • 3.13, хрю (?), 00:21, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >>Не драматизируй, это всё вопрос привычки.

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

    >>вполне себе неплохо и эффективно на практике.

    эффективно нужно там где, надо. а в других местах, должно быть удобно для программирования. какая разница сколь эффективно формируется строка запроса к капс? а по коду там огород из str func. "эффективность" во всех дырах привела к преждевременной языковой смерти :-)))

     
  • 3.18, Аноним (18), 00:29, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > есть asciiz, что вполне себе неплохо и эффективно на практике

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

     
  • 2.10, ИмяХ (?), 23:59, 22/05/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Чем для тебя std::string и std:string_view ненормальны и неудобны?
     
     
  • 3.11, хрю (?), 00:13, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Это настолько же удобно, насколько удобны жигули. Так ездите на жигулях[/w][/w][/w] используйте std:string сами.
     
     
  • 4.16, Аноним (16), 00:26, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это не ответ на вопрос. Так чем неудобны то?
     
     
  • 5.35, BorichL (ok), 15:29, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Тем, что большинство современных писак програмят по принципу:
    "Хочу играть на гитаре, но учиться не хочу, хочу чтоб само!" (с)
     
  • 3.28, Аноним (28), 09:13, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Недостатком доступных методов для работы со строками. Жить можно, но неудобно.
     
  • 3.29, Челик с гитлаба (?), 09:48, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Тем, что они не позволяют адекватно сделать посимвольный проход по строке. ASCII - ок, всё остальное это боль, мучения и тонна костылей. Попробуйте просто вывести строку "ОпенNet" посимвольно и посмотрите на кракозябры.
     
  • 2.12, Ivan_83 (ok), 00:21, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Самое очевидное на что не хватает ума хейтерам - это понять что никаких строк в С нет.
    Есть выделенная область памяти, есть её размер и есть размер данных в ней - вот простое правило для работы с данными которые нужно интепретировать как строки.

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

     
     
  • 3.15, хрю (?), 00:24, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Самое очевидное на что не хватает ума хейтерам - это понять что
    > никаких строк в С нет.

    да-да. формировать текстовые строки на сях нельзя, ведь их нет. поэтому придётся извращаться на радость почитателям и формировать отсутствующие строки недо str функциями. в миллионных раз изобретая велосипед.

     
     
  • 4.21, Ivan_83 (ok), 00:36, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В чём претензия то?
    Язык низкоуровневый, если вам охота обмазыватся сахаром и не думать о таких мелочах - выбирайте другой язык.

    Меня лично всё устраивает, о строках я забыл лет 15 назад и счастливо живу, контролируя и размер буфера и размер данных в нём.
    Всякие strn*(), strlcpy() - юзаю не часто, snprintf() всё сам делает что мне надо.

     
     
  • 5.27, Аноним (27), 09:08, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    О, еще один. У одного "ничего никогда не падало", а у этого "никогда за пределы буфера не выходит"
    Прямо слет пиноккио-программеров))
     
  • 3.22, Аноним (18), 00:43, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Есть выделенная область памяти, есть её размер и есть размер данных в ней - вот простое правило

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

     
     
  • 4.23, Ivan_83 (ok), 01:05, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Нет, правила не меняются.

    Хотите абстракции - да на здоровье, ищите/пишите либу которая вам строки как угодно будет представлять и обрабатывать.
    Я себе давно написал такое: https://github.com/rozhuk-im/liblcb/blob/master/include/utils/io_buf.h
    и использую это в основном на данных получаемых/отправляемых по сети/диск.
    Для не частых операций со строками проще руками проконтролировать без таких абстракций.

     
  • 4.32, Аноним (32), 11:49, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >Но тут вдруг на данные простые вводные накладывается техника работы с завершающим нулем

    Оу, а потом программисту поступает задача из Азии, он узнаёт про unicode, UTF-16, UTF-32,  и у него начинает подгорать про завершающий нуль. А затем подгорать в кошельке.

     
  • 2.19, YetAnotherOnanym (ok), 00:32, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > а привычной для меня библиотеки для строк, как в том языке, на котором я кодил раньше, нет.

    Пофиксил.

     
  • 2.33, Аноним (30), 12:08, 23/05/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вылезай! С++20 : std::u8string
     

  • 1.20, Аноним (-), 00:33, 23/05/2023 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.24, Аноним (24), 01:25, 23/05/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Debian уже пофиксил
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру